Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

Rev 9 | Rev 17 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
//
2
//  ProfileView.swift
3
//  twogetskills
4
//
5
//  Created by Efrain Yanez Recanatini on 5/4/22.
6
//
7
 
8
import Foundation
9
import SwiftUI
8 efrain 10
import Alamofire
11
import TTGSnackbar
1 efrain 12
 
13
struct ProfileView: View {
8 efrain 14
    @EnvironmentObject private var appNavigation : AppNavigation
15
    @EnvironmentObject private var networkMonitor : NetworkMonitor
1 efrain 16
 
8 efrain 17
    @State private var showGlobalAlert : Bool = false
18
    @State private var titleGlobalAlert : String = ""
19
    @State private var messageGlobalAlert : String = ""
1 efrain 20
 
8 efrain 21
 
1 efrain 22
    private var userExtendedPointViewModel : UserExtendedPointViewModel = UserExtendedPointViewModel()
23
 
9 efrain 24
    private let appDao = AppDao.sharedInstance
11 efrain 25
    private let appData : AppModel
1 efrain 26
 
11 efrain 27
    init() {
28
        appData = appDao.selectOne()
29
    }
1 efrain 30
 
31
 
32
 
33
    var body: some View {
34
        GeometryReader { geometry in
35
            VStack(spacing: 0) {
36
                HStack {
37
                    Image("logo")
38
                    .resizable()
39
                    .frame(width: 32, height: 32, alignment: .center)
40
                    .aspectRatio(contentMode: .fit)
8 efrain 41
                        .foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground"))
1 efrain 42
                    .padding(.leading, 16)
43
 
44
 
8 efrain 45
                    Text(networkMonitor.status == .disconnected ? Config.LANG_ERROR_NETWORK_MESSAGE_SHORT :   Config.LANG_TAB_BAR_BUTTON_PROFILE)
1 efrain 46
                    .font(Font.custom(Config.FONT_NAME_REGULAR, size: Config.FONT_SIZE_APP_BAR_HEAD1 ))
8 efrain 47
                        .foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground"))
1 efrain 48
                    .padding(.leading, 4)
49
 
50
                    Spacer()
8 efrain 51
 
52
 
53
                    Button(action: {
54
                        let snackbar = TTGSnackbar(message: Config.LANG_SIGNOUT_MESSAGE, duration: .long)
1 efrain 55
 
8 efrain 56
                        // Action 1
57
                        snackbar.actionText = Config.LANG_COMMON_YES
58
                        snackbar.actionTextColor = UIColor( Color("color_snackbar_button_yes"))
59
                        snackbar.actionBlock = { (snackbar) in signout() }
60
 
61
 
62
                        snackbar.secondActionText = Config.LANG_COMMON_NO
63
                        snackbar.secondActionTextColor = UIColor(Color("color_snackbar_button_no"))
64
                        snackbar.secondActionBlock = { (snackbar) in }
65
 
66
                        snackbar.show()
67
 
68
                    }, label: {
69
                        Image(uiImage: UIImage(named: "ui_exit_app") ?? UIImage())
70
                        .resizable()
71
                        .frame(width: 24, height: 24, alignment: .center)
72
                        .aspectRatio(contentMode: .fit)
73
                        .foregroundColor(Color("color_network_disconnected_foreground"))
74
                        .padding(.trailing, 16)
75
                    })
1 efrain 76
                }
77
                .edgesIgnoringSafeArea(.top)
78
                .frame(height: 50)
8 efrain 79
                .background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))
1 efrain 80
 
8 efrain 81
 
82
                Divider().background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))
83
 
1 efrain 84
            ZStack(alignment: .top) {
85
 
86
 
87
                Rectangle()
88
                    .foregroundColor(Color("color_app_bar_background"))
89
                    .edgesIgnoringSafeArea(.top)
90
                    .frame(height: 70)
91
 
92
 
93
                HStack {
11 efrain 94
 
95
                    if appData.userImage.isEmpty {
1 efrain 96
                         Image("logo")
97
                            .resizable()
98
                            .aspectRatio(contentMode: .fit)
99
                            .frame(height: Config.PROFILE_IMAGE_SIZE)
100
                            .clipShape(Circle())
101
                            .overlay(Circle().stroke(Color.white, lineWidth: 4))
102
                            .shadow(radius: 10)
103
 
104
 
105
 
106
                    } else {
107
                        CustomAsyncImageProfile(
11 efrain 108
                            url: URL(string: appData.userImage)!,
1 efrain 109
                            placeholder: { Text(Config.LANG_COMMON_LOADING).font(.footnote).foregroundColor(.black)},
110
                            image: {
111
                                Image(uiImage: $0)
112
                                    .resizable()
113
 
114
                            }
115
                        )
116
                    }
117
                }.padding(10)
118
            }
119
            VStack(spacing: 5) {
120
                VStack(spacing: 5) {
11 efrain 121
                    Text("\(appDao.selectOne().userFirstname) \(appDao.selectOne().userLastname)" )
1 efrain 122
                        .bold()
123
                        .font(.title)
11 efrain 124
                    Text("\(appDao.selectOne().userEmail)")
1 efrain 125
                        .font(.body)
8 efrain 126
                        .foregroundColor(Color("color_textview_foreground"))
1 efrain 127
                }.padding()
128
 
129
 
130
            }.background(Color("color_card_view_background"))
131
 
132
            ScrollView {
133
                ForEach(0..<self.userExtendedPointViewModel.points.count) { i in
134
                    UserExtendedPointView(userExtendedPoint: self.userExtendedPointViewModel.points[i])
135
                        .listRowInsets(.init()).frame(width: geometry.size.width, height: 70, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
136
                }
137
            }
138
            .background(Color("color_card_view_background"))
139
        }.onAppear {
140
            userExtendedPointViewModel.loadAll()
8 efrain 141
        }.alert(isPresented: $showGlobalAlert) {
142
            Alert(
143
                title: Text(self.titleGlobalAlert),
144
                message: Text(self.messageGlobalAlert),
145
                dismissButton: .default(Text(Config.LANG_COMMON_OK))
146
            )
1 efrain 147
        }
8 efrain 148
        }
149
    }
150
 
151
    private func signout() -> Void {
152
 
153
        if networkMonitor.status == .disconnected {
154
 
155
            self.titleGlobalAlert = Config.LANG_ERROR_NETWORK_TITLE
156
            self.messageGlobalAlert = Config.LANG_ERROR_NETWORK_MESSAGE_LONG
157
            self.showGlobalAlert  = true
158
        } else {
159
            let headerSecurity = HeaderSecurity()
160
            let headers: HTTPHeaders = [
161
                .init(name: Constants.HTTP_HEADER_SECURITY_TOKEN, value: appData.deviceUuid),
162
                .init(name: Constants.HTTP_HEADER_SECURITY_SECRET, value: headerSecurity.secret),
163
                .init(name: Constants.HTTP_HEADER_SECURITY_CREATED, value: String(headerSecurity.created)),
164
                .init(name: Constants.HTTP_HEADER_SECURITY_RAND, value: String(headerSecurity.rand)),
165
                .accept(Constants.HTTP_HEADER_ACCEPT)
166
            ]
1 efrain 167
 
8 efrain 168
            AF.request(Config.URL_SIGNOUT, method: .post, headers: headers).responseJSON{(response) in
169
                switch response.result {
170
                    case .success:
171
                        let now = Date()
172
                        let dateFormatter = DateFormatter()
173
                        dateFormatter.dateFormat = Constants.FORMAT_DATETIME_SERVICE
174
                        let dateOn = dateFormatter.string(from: now)
175
 
176
 
177
                        var userLog = UserLogModel()
178
                        userLog.activity = Constants.USER_LOG_ACTIVITY_SIGNOUT
11 efrain 179
                        userLog.userUuid = appDao.selectOne().userUuid
8 efrain 180
                        userLog.addedOn = dateOn
181
 
182
                        let userLogDao = UserLogDao.sharedInstance
183
                        userLogDao.insert(record: userLog)
184
 
185
                        var json : [String: Any] = userLog.toJson()
186
                        json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_USER_LOG
187
 
188
                        var sync = SyncModel();
189
                        sync.type = Constants.SYNC_ADAPTER_TYPE_SYNC
190
                        if let theJSONData = try?  JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),
191
                           let data = String(data: theJSONData, encoding: String.Encoding.ascii) {
192
                                sync.data = data
193
                            }
194
 
195
                        let syncDao = SyncDao.sharedInstance
196
                        syncDao.insert(record : sync)
197
 
11 efrain 198
                        var appData = appDao.selectOne()
199
                        appData.userEmail = ""
200
                        appData.userFirstname = ""
201
                        appData.userLastname = ""
8 efrain 202
                        appData.userUuid = "";
11 efrain 203
 
204
                        let appDao = AppDao.sharedInstance
205
 
206
                        print("update query : 13")
207
                        appDao.update(model: appData)
8 efrain 208
 
209
                        appNavigation.pageActive = .goodbye
210
                        break;
211
 
212
                    case .failure:
213
                        self.titleGlobalAlert = Config.LANG_ERROR_COMMUNICATION_TITLE
214
                        self.messageGlobalAlert = Config.LANG_ERROR_COMMUNICATION_MESSAGE
215
                        self.showGlobalAlert = true
216
 
217
                        break;
1 efrain 218
                }
8 efrain 219
            }
1 efrain 220
        }
221
    }
222
}
223
 
224
 
225
struct ProfileView_Previews: PreviewProvider {
226
    static var previews: some View {
227
        ProfileView()
228
    }
229
}