Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

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