Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

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