Rev 2 | Rev 19 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
//// ProfileView.swift// twogetskills//// Created by Efrain Yanez Recanatini on 5/4/22.//import Foundationimport SwiftUIimport Alamofireimport TTGSnackbarstruct ProfileView: View {@EnvironmentObject private var appNavigation : AppNavigation@EnvironmentObject private var networkMonitor : NetworkMonitor@State private var showGlobalAlert : Bool = false@State private var titleGlobalAlert : String = ""@State private var messageGlobalAlert : String = ""private var userExtendedPointViewModel : UserExtendedPointViewModel = UserExtendedPointViewModel()private var appData = AppData.sharedInstancevar body: some View {GeometryReader { geometry inVStack(spacing: 0) {HStack {Image("logo").resizable().frame(width: 32, height: 32, alignment: .center).aspectRatio(contentMode: .fit).foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground")).padding(.leading, 16)Text(networkMonitor.status == .disconnected ? Config.LANG_ERROR_NETWORK_MESSAGE_SHORT : Config.LANG_TAB_BAR_BUTTON_PROFILE).font(Font.custom(Config.FONT_NAME_REGULAR, size: Config.FONT_SIZE_APP_BAR_HEAD1 )).foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground")).padding(.leading, 4)Spacer()/*Button(action: {DispatchQueue.main.async() {appNavigation.subpageActive = AppMainSubPage.deletaccount}}, label: {Image(uiImage: UIImage(named: "ui_delete") ?? UIImage()).resizable().frame(width: 24, height: 24, alignment: .center).aspectRatio(contentMode: .fit).foregroundColor(Color("color_network_disconnected_foreground")).padding(.trailing, 16)})*/Button(action: {let snackbar = TTGSnackbar(message: Config.LANG_SIGNOUT_MESSAGE, duration: .long)// Action 1snackbar.actionText = Config.LANG_COMMON_YESsnackbar.actionTextColor = UIColor( Color("color_snackbar_button_yes"))snackbar.actionBlock = { (snackbar) in signout() }snackbar.secondActionText = Config.LANG_COMMON_NOsnackbar.secondActionTextColor = UIColor(Color("color_snackbar_button_no"))snackbar.secondActionBlock = { (snackbar) in }snackbar.show()}, label: {Image(uiImage: UIImage(named: "ui_exit_app") ?? UIImage()).resizable().frame(width: 24, height: 24, alignment: .center).aspectRatio(contentMode: .fit).foregroundColor(Color("color_network_disconnected_foreground")).padding(.trailing, 16)})}.edgesIgnoringSafeArea(.top).frame(height: 50).background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))Divider().background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))ZStack(alignment: .top) {Rectangle().foregroundColor(Color("color_app_bar_background")).edgesIgnoringSafeArea(.top).frame(height: 70)HStack {if appData.userImage.isEmpty {Image("logo").resizable().aspectRatio(contentMode: .fit).frame(height: Config.PROFILE_IMAGE_SIZE).clipShape(Circle()).overlay(Circle().stroke(Color.white, lineWidth: 4)).shadow(radius: 10)} else {CustomAsyncImageProfile(url: URL(string: appData.userImage)!,placeholder: { Text(Config.LANG_COMMON_LOADING).font(.footnote).foregroundColor(.black)},image: {Image(uiImage: $0).resizable()})}}.padding(10)}VStack(spacing: 5) {VStack(spacing: 5) {Text("\(appData.userFirstname) \(appData.userLastname)" ).bold().font(.title)Text("\(appData.userEmail)").font(.body).foregroundColor(Color("color_textview_foreground"))}.padding()}.background(Color("color_card_view_background"))ScrollView {ForEach(0..<self.userExtendedPointViewModel.points.count) { i inUserExtendedPointView(userExtendedPoint: self.userExtendedPointViewModel.points[i]).listRowInsets(.init()).frame(width: geometry.size.width, height: 70, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)}}.background(Color("color_card_view_background"))Spacer()Button(action: {DispatchQueue.main.async() {appNavigation.subpageActive = AppMainSubPage.deletaccount}}, label: {Text(Config.LANG_DELETE_ACCOUNT_TITLE).font(Font.custom(Config.FONT_NAME_REGULAR, size: 13)).frame(width: UIScreen.main.bounds.width - 32, height: 35).foregroundColor(Color("color_button_foreground")).background(Color("color_button_background")).border(Color("color_button_border"), width: Config.BUTTON_BORDER_SIZE).cornerRadius(Config.BUTTON_BORDER_RADIUS)}).padding(.top, 16).padding(.leading, 16).padding(.trailing, 16)}.onAppear {userExtendedPointViewModel.loadAll()}.alert(isPresented: $showGlobalAlert) {Alert(title: Text(self.titleGlobalAlert),message: Text(self.messageGlobalAlert),dismissButton: .default(Text(Config.LANG_COMMON_OK)))}}}private func signout() -> Void {if networkMonitor.status == .disconnected {self.titleGlobalAlert = Config.LANG_ERROR_NETWORK_TITLEself.messageGlobalAlert = Config.LANG_ERROR_NETWORK_MESSAGE_LONGself.showGlobalAlert = true} else {let headerSecurity = HeaderSecurity()let headers: HTTPHeaders = [.init(name: Constants.HTTP_HEADER_SECURITY_TOKEN, value: appData.deviceUuid),.init(name: Constants.HTTP_HEADER_SECURITY_SECRET, value: headerSecurity.secret),.init(name: Constants.HTTP_HEADER_SECURITY_CREATED, value: String(headerSecurity.created)),.init(name: Constants.HTTP_HEADER_SECURITY_RAND, value: String(headerSecurity.rand)),.accept(Constants.HTTP_HEADER_ACCEPT)]AF.request(Config.URL_SIGNOUT, method: .post, headers: headers).responseJSON{(response) inswitch response.result {case .success:let now = Date()let dateFormatter = DateFormatter()dateFormatter.dateFormat = Constants.FORMAT_DATETIME_SERVICElet dateOn = dateFormatter.string(from: now)var userLog = UserLogModel()userLog.activity = Constants.USER_LOG_ACTIVITY_SIGNOUTuserLog.userUuid = appData.userUuiduserLog.addedOn = dateOnlet userLogDao = UserLogDao.sharedInstanceuserLogDao.insert(record: userLog)var json : [String: Any] = userLog.toJson()json[Constants.SYNC_ADAPTER_DATA_TYPE_FIELD_NAME] = Constants.SYNC_ADAPTER_DATA_TYPE_MICROLEARNING_USER_LOGvar sync = SyncModel();sync.type = Constants.SYNC_ADAPTER_TYPE_SYNCif let theJSONData = try? JSONSerialization.data(withJSONObject: json, options: .prettyPrinted),let data = String(data: theJSONData, encoding: String.Encoding.ascii) {sync.data = data}let syncDao = SyncDao.sharedInstancesyncDao.insert(record : sync)appData.userEmail = ""appData.userFirstname = ""appData.userLastname = ""appData.userUuid = ""appData.userImage = ""appData.save()appNavigation.pageActive = .goodbyebreak;case .failure:self.titleGlobalAlert = Config.LANG_ERROR_COMMUNICATION_TITLEself.messageGlobalAlert = Config.LANG_ERROR_COMMUNICATION_MESSAGEself.showGlobalAlert = truebreak;}}}}}struct ProfileView_Previews: PreviewProvider {static var previews: some View {ProfileView()}}