Browse Source

view made boundy

pull/1/head
gme_2 6 years ago
parent
commit
e85c99a273
  1. 64
      GMERemittance.xcodeproj/project.pbxproj
  2. 4
      GMERemittance/Extension/UIViewControllerExtension.swift
  3. 6
      GMERemittance/FillKYC/PopUpGeneralInfo.swift
  4. 93
      GMERemittance/Profile/ChangePasswordViewModel.swift
  5. 698
      GMERemittance/Profile/Profile.storyboard
  6. 271
      GMERemittance/Profile/ProfileBankViewController.swift
  7. 98
      GMERemittance/Profile/ProfileDocumentViewController.swift
  8. 1856
      GMERemittance/Profile/ProfileEdit.storyboard
  9. 435
      GMERemittance/Profile/ProfileGeneralViewController.swift
  10. 34
      GMERemittance/Profile/ProfileModel.swift
  11. 266
      GMERemittance/Profile/ProfileViewModel.swift
  12. 103
      GMERemittance/Profile/UserInfoViewController.swift
  13. 294
      GMERemittance/Profile/UserInfoViewModel.swift
  14. 31
      GMERemittance/Profile/UserTemp.swift
  15. 183
      GMERemittance/Profile/WithdrawViewController.swift
  16. 79
      GMERemittance/Profile/WithdrawViewModel.swift
  17. 6
      GMERemittance/SideMenu/SettingViewController.swift
  18. 6
      GMERemittance/SideMenu/SideMenuViewController.swift
  19. 4
      GMERemittance/Social/MyStoryViewController.swift
  20. 762
      GMERemittance/Wallet/WalletViewController.swift
  21. 2959
      GMERemittance/_Home/_HomeViewController.swift

64
GMERemittance.xcodeproj/project.pbxproj

@ -40,10 +40,8 @@
0448C2A11FF34D9C001FEA77 /* RecipientViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0448C2A01FF34D9C001FEA77 /* RecipientViewModel.swift */; };
04498A70203833D700AC4D99 /* Branch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04498A6F203833D700AC4D99 /* Branch.swift */; };
04498A722039416E00AC4D99 /* SettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04498A712039416E00AC4D99 /* SettingViewController.swift */; };
04498A7420394AAF00AC4D99 /* ChangePasswordViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04498A7320394AAF00AC4D99 /* ChangePasswordViewModel.swift */; };
044F5B1B20A3002B00E3584C /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 044F5B1A20A3002B00E3584C /* index.html */; };
04546C4120329A36007EFE15 /* AboutGMEViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04546C4020329A36007EFE15 /* AboutGMEViewController.swift */; };
04546C452032B176007EFE15 /* WithdrawViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04546C442032B176007EFE15 /* WithdrawViewModel.swift */; };
04546C472032E324007EFE15 /* CharacterExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04546C462032E324007EFE15 /* CharacterExtension.swift */; };
045CB0C4202F27FA008DD982 /* SupportViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 045CB0C3202F27FA008DD982 /* SupportViewController.swift */; };
045CB0C6202F2A3D008DD982 /* _MessageComposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 045CB0C5202F2A3D008DD982 /* _MessageComposeViewController.swift */; };
@ -131,19 +129,13 @@
9F1F7A5C1FF2146000A4DD82 /* ReviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F1F7A5B1FF2146000A4DD82 /* ReviewViewController.swift */; };
9F23DF4F20749DFE0025D6DF /* ExchangeRateMultipleCountryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F23DF4E20749DFE0025D6DF /* ExchangeRateMultipleCountryViewController.swift */; };
9F23DF512074A02B0025D6DF /* MyCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F23DF502074A02B0025D6DF /* MyCollectionViewCell.swift */; };
9F2B5AF020218751002284F6 /* ProfileDocumentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2B5AEF20218751002284F6 /* ProfileDocumentViewController.swift */; };
9F2E0D162059168C008611D1 /* LoadBalanceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2E0D152059168C008611D1 /* LoadBalanceViewController.swift */; };
9F2E45A2204E8A3F00D0B28C /* CalendarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2E45A1204E8A3F00D0B28C /* CalendarViewController.swift */; };
9F2ECFF72050F04C00AC880B /* MobileOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2ECFF62050F04C00AC880B /* MobileOperator.swift */; };
9F3332AF208DAE7600E39C9F /* ExchangeRateData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3332AE208DAE7600E39C9F /* ExchangeRateData.swift */; };
9F3ADCE82004B85F0037A3A3 /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3ADCE72004B85F0037A3A3 /* ProfileViewController.swift */; };
9F3ADCEA2004B8EC0037A3A3 /* ProfileEdit.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9F3ADCE92004B8EC0037A3A3 /* ProfileEdit.storyboard */; };
9F3ADCEC2004BD510037A3A3 /* ProfileGeneralViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3ADCEB2004BD510037A3A3 /* ProfileGeneralViewController.swift */; };
9F3ADCF02004BF090037A3A3 /* ProfileChangePasswordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3ADCEF2004BF090037A3A3 /* ProfileChangePasswordViewController.swift */; };
9F3CFC56202824E60034F588 /* TrackRecipientViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3CFC55202824E60034F588 /* TrackRecipientViewController.swift */; };
9F3CFC582028272B0034F588 /* TrackRecipientViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3CFC572028272B0034F588 /* TrackRecipientViewModel.swift */; };
9F40C3521FEAB0F4000CB53C /* KYCDocumentsUploadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F40C3511FEAB0F4000CB53C /* KYCDocumentsUploadViewController.swift */; };
9F4E1324202060AA00843BF2 /* ProfileBankViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4E1323202060AA00843BF2 /* ProfileBankViewController.swift */; };
9F8FEF101FEE2D9F00CE550F /* RecipientListViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9F8FEF0F1FEE2D9F00CE550F /* RecipientListViewController.storyboard */; };
9F91871D200F3EF900669BAC /* CommentsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F91871C200F3EF900669BAC /* CommentsTableViewCell.swift */; };
9F983C0A20245483001DCB3F /* _SplashScreenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F983C0920245483001DCB3F /* _SplashScreenViewController.swift */; };
@ -156,7 +148,6 @@
9FA0973E200E127A00F3B5EC /* LikesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA0973D200E127A00F3B5EC /* LikesViewController.swift */; };
9FA09740200E129500F3B5EC /* CommentsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA0973F200E129500F3B5EC /* CommentsViewController.swift */; };
9FB54C11200879B9003454E2 /* Profile.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9FB54C10200879B9003454E2 /* Profile.storyboard */; };
9FB54C1320088EF7003454E2 /* WithdrawViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FB54C1220088EF7003454E2 /* WithdrawViewController.swift */; };
9FCBD347202AE76900BAEB32 /* TrackPhaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCBD346202AE76900BAEB32 /* TrackPhaseViewController.swift */; };
9FCBD349202AEBA100BAEB32 /* PayoutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCBD348202AEBA100BAEB32 /* PayoutViewController.swift */; };
9FCBD34B202B179600BAEB32 /* PayoutTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCBD34A202B179600BAEB32 /* PayoutTableViewCell.swift */; };
@ -169,7 +160,6 @@
9FD2610D1FD00458007A511D /* GMERemittanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD2610C1FD00458007A511D /* GMERemittanceTests.swift */; };
9FD261181FD00458007A511D /* GMERemittanceUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD261171FD00458007A511D /* GMERemittanceUITests.swift */; };
9FD46F331FF256E5006C8341 /* TransferSuccessfulViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD46F321FF256E5006C8341 /* TransferSuccessfulViewController.swift */; };
A205DF5D201F38F60074B0C8 /* UserInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A205DF5C201F38F60074B0C8 /* UserInfoViewController.swift */; };
A214606120315A35001F3B37 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A214606020315A35001F3B37 /* GoogleService-Info.plist */; };
A21CB1D3208084A0003D555A /* PaymentMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = A21CB1D2208084A0003D555A /* PaymentMode.swift */; };
A22162D0202C4A61000E915C /* TabBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A22162CF202C4A61000E915C /* TabBarViewController.swift */; };
@ -181,8 +171,6 @@
A22F75032012006100B0FA15 /* likesTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A22F75022012006100B0FA15 /* likesTableViewCell.swift */; };
A2336583207DD44C0078DD77 /* BankBranch.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2336582207DD44C0078DD77 /* BankBranch.swift */; };
A248EA882088855B008D28DF /* Currrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A248EA872088855B008D28DF /* Currrency.swift */; };
A249B79C2020426C00BD3D13 /* UserInfoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A249B79B2020426C00BD3D13 /* UserInfoViewModel.swift */; };
A249B79E20204B1600BD3D13 /* UserTemp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A249B79D20204B1600BD3D13 /* UserTemp.swift */; };
A24B44FA204CF108009BF491 /* InviteeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24B44F9204CF108009BF491 /* InviteeModel.swift */; };
A24B44FC204D158F009BF491 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24B44FB204D158F009BF491 /* HomeViewModel.swift */; };
A252A4CC203ACFA0001EFF4C /* TransactionSuccessViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A252A4CB203ACFA0001EFF4C /* TransactionSuccessViewController.swift */; };
@ -198,8 +186,6 @@
A25CF60B2046A92C0029BC12 /* ReferringViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A25CF60A2046A92C0029BC12 /* ReferringViewController.swift */; };
A2637C5820395B8F006EA9AA /* NotificationTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2637C5720395B8F006EA9AA /* NotificationTableViewCell.swift */; };
A2637C5A20395BA7006EA9AA /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2637C5920395BA7006EA9AA /* NotificationViewController.swift */; };
A2661F30201EEA2900ECBF94 /* ProfileModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2661F2F201EEA2900ECBF94 /* ProfileModel.swift */; };
A2661F32201EEC1C00ECBF94 /* ProfileViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2661F31201EEC1C00ECBF94 /* ProfileViewModel.swift */; };
A270F08D2075C74300B78D00 /* AgentCountryList.swift in Sources */ = {isa = PBXBuildFile; fileRef = A270F08C2075C74300B78D00 /* AgentCountryList.swift */; };
A270F08F2075E34C00B78D00 /* PayoutMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = A270F08E2075E34C00B78D00 /* PayoutMode.swift */; };
A28C18201FEA5FBA0018AB97 /* KYCBankAndIDViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A28C181F1FEA5FBA0018AB97 /* KYCBankAndIDViewController.swift */; };
@ -366,6 +352,8 @@
D937038421490C3800D93077 /* KycForm1ViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D937036E21490C3800D93077 /* KycForm1ViewInterface.swift */; };
D937038521490C3800D93077 /* KycForm1.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D937036F21490C3800D93077 /* KycForm1.storyboard */; };
D937038621490C3800D93077 /* KycForm1ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D937037021490C3800D93077 /* KycForm1ViewController.swift */; };
D9380D2B2165A27B00E45156 /* ProfileChangePasswordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9380D2A2165A27B00E45156 /* ProfileChangePasswordViewController.swift */; };
D9380D2D2165A2ED00E45156 /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9380D2C2165A2ED00E45156 /* ProfileViewController.swift */; };
D94173B3214B40ED00D04BE5 /* KycModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D94173B2214B40ED00D04BE5 /* KycModel.swift */; };
D945F11D213E1D5100A24824 /* SendMoneyReceiptModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = D945F10A213E1D5100A24824 /* SendMoneyReceiptModuleInterface.swift */; };
D945F11E213E1D5100A24824 /* SendMoneyReceiptService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D945F10D213E1D5100A24824 /* SendMoneyReceiptService.swift */; };
@ -590,10 +578,8 @@
0448C2A01FF34D9C001FEA77 /* RecipientViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipientViewModel.swift; sourceTree = "<group>"; };
04498A6F203833D700AC4D99 /* Branch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Branch.swift; sourceTree = "<group>"; };
04498A712039416E00AC4D99 /* SettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingViewController.swift; sourceTree = "<group>"; };
04498A7320394AAF00AC4D99 /* ChangePasswordViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangePasswordViewModel.swift; sourceTree = "<group>"; };
044F5B1A20A3002B00E3584C /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = "<group>"; };
04546C4020329A36007EFE15 /* AboutGMEViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutGMEViewController.swift; sourceTree = "<group>"; };
04546C442032B176007EFE15 /* WithdrawViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawViewModel.swift; sourceTree = "<group>"; };
04546C462032E324007EFE15 /* CharacterExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CharacterExtension.swift; sourceTree = "<group>"; };
045CB0C3202F27FA008DD982 /* SupportViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportViewController.swift; sourceTree = "<group>"; };
045CB0C5202F2A3D008DD982 /* _MessageComposeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _MessageComposeViewController.swift; sourceTree = "<group>"; };
@ -685,19 +671,13 @@
9F1F7A5B1FF2146000A4DD82 /* ReviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewViewController.swift; sourceTree = "<group>"; };
9F23DF4E20749DFE0025D6DF /* ExchangeRateMultipleCountryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExchangeRateMultipleCountryViewController.swift; sourceTree = "<group>"; };
9F23DF502074A02B0025D6DF /* MyCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCollectionViewCell.swift; sourceTree = "<group>"; };
9F2B5AEF20218751002284F6 /* ProfileDocumentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileDocumentViewController.swift; sourceTree = "<group>"; };
9F2E0D152059168C008611D1 /* LoadBalanceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadBalanceViewController.swift; sourceTree = "<group>"; };
9F2E45A1204E8A3F00D0B28C /* CalendarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarViewController.swift; sourceTree = "<group>"; };
9F2ECFF62050F04C00AC880B /* MobileOperator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MobileOperator.swift; sourceTree = "<group>"; };
9F3332AE208DAE7600E39C9F /* ExchangeRateData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExchangeRateData.swift; sourceTree = "<group>"; };
9F3ADCE72004B85F0037A3A3 /* ProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = "<group>"; };
9F3ADCE92004B8EC0037A3A3 /* ProfileEdit.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ProfileEdit.storyboard; sourceTree = "<group>"; };
9F3ADCEB2004BD510037A3A3 /* ProfileGeneralViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileGeneralViewController.swift; sourceTree = "<group>"; };
9F3ADCEF2004BF090037A3A3 /* ProfileChangePasswordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileChangePasswordViewController.swift; sourceTree = "<group>"; };
9F3CFC55202824E60034F588 /* TrackRecipientViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecipientViewController.swift; sourceTree = "<group>"; };
9F3CFC572028272B0034F588 /* TrackRecipientViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackRecipientViewModel.swift; sourceTree = "<group>"; };
9F40C3511FEAB0F4000CB53C /* KYCDocumentsUploadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KYCDocumentsUploadViewController.swift; sourceTree = "<group>"; };
9F4E1323202060AA00843BF2 /* ProfileBankViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileBankViewController.swift; sourceTree = "<group>"; };
9F8FEF0F1FEE2D9F00CE550F /* RecipientListViewController.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = RecipientListViewController.storyboard; sourceTree = "<group>"; };
9F91871C200F3EF900669BAC /* CommentsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentsTableViewCell.swift; sourceTree = "<group>"; };
9F983C0920245483001DCB3F /* _SplashScreenViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _SplashScreenViewController.swift; sourceTree = "<group>"; };
@ -710,7 +690,6 @@
9FA0973D200E127A00F3B5EC /* LikesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikesViewController.swift; sourceTree = "<group>"; };
9FA0973F200E129500F3B5EC /* CommentsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentsViewController.swift; sourceTree = "<group>"; };
9FB54C10200879B9003454E2 /* Profile.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Profile.storyboard; sourceTree = "<group>"; };
9FB54C1220088EF7003454E2 /* WithdrawViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawViewController.swift; sourceTree = "<group>"; };
9FCBD346202AE76900BAEB32 /* TrackPhaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackPhaseViewController.swift; sourceTree = "<group>"; };
9FCBD348202AEBA100BAEB32 /* PayoutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayoutViewController.swift; sourceTree = "<group>"; };
9FCBD34A202B179600BAEB32 /* PayoutTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayoutTableViewCell.swift; sourceTree = "<group>"; };
@ -729,7 +708,6 @@
9FD261171FD00458007A511D /* GMERemittanceUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GMERemittanceUITests.swift; sourceTree = "<group>"; };
9FD261191FD00458007A511D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9FD46F321FF256E5006C8341 /* TransferSuccessfulViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransferSuccessfulViewController.swift; sourceTree = "<group>"; };
A205DF5C201F38F60074B0C8 /* UserInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoViewController.swift; sourceTree = "<group>"; };
A214606020315A35001F3B37 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
A214606220315ECC001F3B37 /* GMERemittance.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = GMERemittance.entitlements; sourceTree = "<group>"; };
A21CB1D2208084A0003D555A /* PaymentMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentMode.swift; sourceTree = "<group>"; };
@ -742,8 +720,6 @@
A22F75022012006100B0FA15 /* likesTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = likesTableViewCell.swift; sourceTree = "<group>"; };
A2336582207DD44C0078DD77 /* BankBranch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BankBranch.swift; sourceTree = "<group>"; };
A248EA872088855B008D28DF /* Currrency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Currrency.swift; sourceTree = "<group>"; };
A249B79B2020426C00BD3D13 /* UserInfoViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfoViewModel.swift; sourceTree = "<group>"; };
A249B79D20204B1600BD3D13 /* UserTemp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserTemp.swift; sourceTree = "<group>"; };
A24B44F9204CF108009BF491 /* InviteeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InviteeModel.swift; sourceTree = "<group>"; };
A24B44FB204D158F009BF491 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = "<group>"; };
A252A4CB203ACFA0001EFF4C /* TransactionSuccessViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionSuccessViewController.swift; sourceTree = "<group>"; };
@ -759,8 +735,6 @@
A25CF60A2046A92C0029BC12 /* ReferringViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReferringViewController.swift; sourceTree = "<group>"; };
A2637C5720395B8F006EA9AA /* NotificationTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTableViewCell.swift; sourceTree = "<group>"; };
A2637C5920395BA7006EA9AA /* NotificationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewController.swift; sourceTree = "<group>"; };
A2661F2F201EEA2900ECBF94 /* ProfileModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileModel.swift; sourceTree = "<group>"; };
A2661F31201EEC1C00ECBF94 /* ProfileViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewModel.swift; sourceTree = "<group>"; };
A270F08C2075C74300B78D00 /* AgentCountryList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentCountryList.swift; sourceTree = "<group>"; };
A270F08E2075E34C00B78D00 /* PayoutMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayoutMode.swift; sourceTree = "<group>"; };
A28C181F1FEA5FBA0018AB97 /* KYCBankAndIDViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KYCBankAndIDViewController.swift; sourceTree = "<group>"; };
@ -930,6 +904,8 @@
D937036E21490C3800D93077 /* KycForm1ViewInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KycForm1ViewInterface.swift; sourceTree = "<group>"; };
D937036F21490C3800D93077 /* KycForm1.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = KycForm1.storyboard; sourceTree = "<group>"; };
D937037021490C3800D93077 /* KycForm1ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KycForm1ViewController.swift; sourceTree = "<group>"; };
D9380D2A2165A27B00E45156 /* ProfileChangePasswordViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileChangePasswordViewController.swift; sourceTree = "<group>"; };
D9380D2C2165A2ED00E45156 /* ProfileViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = "<group>"; };
D94173B2214B40ED00D04BE5 /* KycModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KycModel.swift; sourceTree = "<group>"; };
D945F10A213E1D5100A24824 /* SendMoneyReceiptModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendMoneyReceiptModuleInterface.swift; sourceTree = "<group>"; };
D945F10D213E1D5100A24824 /* SendMoneyReceiptService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendMoneyReceiptService.swift; sourceTree = "<group>"; };
@ -1418,21 +1394,9 @@
9F3ADCE62004B80F0037A3A3 /* Profile */ = {
isa = PBXGroup;
children = (
D9380D2C2165A2ED00E45156 /* ProfileViewController.swift */,
D9380D2A2165A27B00E45156 /* ProfileChangePasswordViewController.swift */,
9FB54C10200879B9003454E2 /* Profile.storyboard */,
9F3ADCE92004B8EC0037A3A3 /* ProfileEdit.storyboard */,
9F3ADCE72004B85F0037A3A3 /* ProfileViewController.swift */,
A2661F31201EEC1C00ECBF94 /* ProfileViewModel.swift */,
A2661F2F201EEA2900ECBF94 /* ProfileModel.swift */,
A249B79B2020426C00BD3D13 /* UserInfoViewModel.swift */,
A205DF5C201F38F60074B0C8 /* UserInfoViewController.swift */,
9F3ADCEB2004BD510037A3A3 /* ProfileGeneralViewController.swift */,
9F4E1323202060AA00843BF2 /* ProfileBankViewController.swift */,
9F2B5AEF20218751002284F6 /* ProfileDocumentViewController.swift */,
9FB54C1220088EF7003454E2 /* WithdrawViewController.swift */,
04546C442032B176007EFE15 /* WithdrawViewModel.swift */,
9F3ADCEF2004BF090037A3A3 /* ProfileChangePasswordViewController.swift */,
A249B79D20204B1600BD3D13 /* UserTemp.swift */,
04498A7320394AAF00AC4D99 /* ChangePasswordViewModel.swift */,
);
path = Profile;
sourceTree = "<group>";
@ -3999,7 +3963,6 @@
A25CF60720467B700029BC12 /* Invite.storyboard in Resources */,
5565FF321FE275E5002934E9 /* SanFranciscoDisplay-Semibold.otf in Resources */,
9FB54C11200879B9003454E2 /* Profile.storyboard in Resources */,
9F3ADCEA2004B8EC0037A3A3 /* ProfileEdit.storyboard in Resources */,
9FA0973A200E0DE100F3B5EC /* _Home.storyboard in Resources */,
5565FF211FE275E5002934E9 /* SanFranciscoText-Bold.otf in Resources */,
04EA4DB12026CD0E00BF6BED /* TrackTransfer.storyboard in Resources */,
@ -4371,7 +4334,6 @@
045DFCAA2089A70E000F7699 /* ReferralCodeViewController.swift in Sources */,
9F9DF0CE1FEBCD41005B8F42 /* RecipientListTableViewCell.swift in Sources */,
0496B8551FE7E2830044810E /* SignUpViewModel.swift in Sources */,
A2661F30201EEA2900ECBF94 /* ProfileModel.swift in Sources */,
D96A4FDC21460B4A00CFD507 /* SplashScreenViewInterface.swift in Sources */,
D950BED721549242008367A1 /* HomeWireframeInput.swift in Sources */,
D977859D215DC55F00754079 /* TransactionHistoryModuleInterface.swift in Sources */,
@ -4408,7 +4370,6 @@
D93702B42148EE6C00D93077 /* KycWireframe.swift in Sources */,
D922D96A2135145F00D43053 /* SendMoneyParentViewInterface.swift in Sources */,
04E1032C2007A88600AE24A2 /* ScrollableProtocol.swift in Sources */,
04546C452032B176007EFE15 /* WithdrawViewModel.swift in Sources */,
D96BD119216479E200DFE7D8 /* WalletStatementInteractor.swift in Sources */,
D9031140214786EA00AD5BA9 /* ForgotPasswordInteractorIO.swift in Sources */,
D96A4FD821460B4A00CFD507 /* SplashScreenInteractorIO.swift in Sources */,
@ -4430,7 +4391,6 @@
A28C18201FEA5FBA0018AB97 /* KYCBankAndIDViewController.swift in Sources */,
D946719F21426DFB003924DB /* LoginViewController.swift in Sources */,
D922D9AE21351B7400D43053 /* SendMoneyVerificationWireframe.swift in Sources */,
A205DF5D201F38F60074B0C8 /* UserInfoViewController.swift in Sources */,
D937038021490C3800D93077 /* KycForm1Interactor.swift in Sources */,
9F3332AF208DAE7600E39C9F /* ExchangeRateData.swift in Sources */,
D97785AC215DD23400754079 /* TransactionModel.swift in Sources */,
@ -4454,7 +4414,6 @@
D97785A1215DC55F00754079 /* TransactionHistoryInteractor.swift in Sources */,
D903113F214786EA00AD5BA9 /* ForgotPasswordInteractor.swift in Sources */,
D922D9472135124200D43053 /* SendMoneyPaymentModeWireframe.swift in Sources */,
A249B79C2020426C00BD3D13 /* UserInfoViewModel.swift in Sources */,
D962230C212BD7A100B7A115 /* ArrayExtension.swift in Sources */,
04B67E922046CA7A000A4248 /* WalletReviewViewController.swift in Sources */,
04B232DF2003732E00736B89 /* RequestNewCodeViewController.swift in Sources */,
@ -4473,7 +4432,6 @@
D922D9462135124200D43053 /* SendMoneyPaymentModeWireframeInput.swift in Sources */,
D946719B21426DFB003924DB /* LoginWireframe.swift in Sources */,
D9B7ADF62130048E009B0564 /* ExchangeRatesWireframeInput.swift in Sources */,
9FB54C1320088EF7003454E2 /* WithdrawViewController.swift in Sources */,
D9DC107B21639078008F3C51 /* MessageComposeInteractorIO.swift in Sources */,
D937037C21490C3800D93077 /* KycForm1ModuleInterface.swift in Sources */,
D9DAFE2521352F3300483E71 /* SenMoneyPaymentModeRecipientViewModel.swift in Sources */,
@ -4547,6 +4505,7 @@
D922D98521351AAE00D43053 /* SendMoneyExchangeRateServiceType.swift in Sources */,
D922D91E2134DCF000D43053 /* EditReciepientService.swift in Sources */,
9F1F7A5C1FF2146000A4DD82 /* ReviewViewController.swift in Sources */,
D9380D2B2165A27B00E45156 /* ProfileChangePasswordViewController.swift in Sources */,
D946719A21426DFB003924DB /* LoginPresenter.swift in Sources */,
D92B802C2140C3CB00A25B26 /* MainWireframe.swift in Sources */,
D922D9222134DCF000D43053 /* EditReciepientWireframeInput.swift in Sources */,
@ -4569,7 +4528,6 @@
04BEF55A20593CFB007713F9 /* RewardViewController.swift in Sources */,
D937034121490C1A00D93077 /* KycForm3Presenter.swift in Sources */,
D96A4FDE21460B4A00CFD507 /* SplashScreenViewController.swift in Sources */,
A2661F32201EEC1C00ECBF94 /* ProfileViewModel.swift in Sources */,
D9DC107921639078008F3C51 /* MessageComposeServiceType.swift in Sources */,
9FD1EE6A1FF0F48F00AC79FC /* PaymentMethodViewController.swift in Sources */,
D92B80252140C3CB00A25B26 /* MainModuleInterface.swift in Sources */,
@ -4621,7 +4579,6 @@
A2B9D75B2020C87A007C1049 /* MyStoryTableViewCell.swift in Sources */,
D9CB49732132908300B7A124 /* SendMoneyProvinceViewModel.swift in Sources */,
043629C5200A2ED900DD5E73 /* MobileRechargeViewController.swift in Sources */,
A249B79E20204B1600BD3D13 /* UserTemp.swift in Sources */,
D97785A0215DC55F00754079 /* TransactionHistoryInteractorIO.swift in Sources */,
D922D98821351AAE00D43053 /* SendMoneyExchangeRateInteractor.swift in Sources */,
D922D98A21351AAE00D43053 /* SendMoneyExchangeRateWireframeInput.swift in Sources */,
@ -4638,10 +4595,7 @@
D922D9632135145F00D43053 /* SendMoneyParentServiceType.swift in Sources */,
D9031142214786EA00AD5BA9 /* ForgotPasswordWireframe.swift in Sources */,
9F2ECFF72050F04C00AC880B /* MobileOperator.swift in Sources */,
9F4E1324202060AA00843BF2 /* ProfileBankViewController.swift in Sources */,
9F3ADCF02004BF090037A3A3 /* ProfileChangePasswordViewController.swift in Sources */,
D922D9432135124200D43053 /* SendMoneyPaymentModeInteractorIO.swift in Sources */,
04498A7420394AAF00AC4D99 /* ChangePasswordViewModel.swift in Sources */,
D96BD118216479E200DFE7D8 /* WalletStatementInteractorIO.swift in Sources */,
D90D55D021327CD600EEEE04 /* AddReciepientPresenter.swift in Sources */,
D922D9482135124200D43053 /* SendMoneyPaymentModeViewController.swift in Sources */,
@ -4654,7 +4608,6 @@
D9B7ADF72130048E009B0564 /* ExchangeRatesWireframe.swift in Sources */,
D96A4FFA2146625C00CFD507 /* RegisterInteractorIO.swift in Sources */,
D9B7ADF82130048E009B0564 /* ExchangeRatesViewController.swift in Sources */,
9F3ADCE82004B85F0037A3A3 /* ProfileViewController.swift in Sources */,
D950BED321549242008367A1 /* HomeService.swift in Sources */,
9F3CFC56202824E60034F588 /* TrackRecipientViewController.swift in Sources */,
D937037E21490C3800D93077 /* KycForm1ServiceType.swift in Sources */,
@ -4722,6 +4675,7 @@
9FCBD34B202B179600BAEB32 /* PayoutTableViewCell.swift in Sources */,
D922D94A2135124200D43053 /* SendMoneyPaymentModeViewInterface.swift in Sources */,
04498A70203833D700AC4D99 /* Branch.swift in Sources */,
D9380D2D2165A2ED00E45156 /* ProfileViewController.swift in Sources */,
722347F2205A8FF600296ADD /* SocialFeedViewModel.swift in Sources */,
D945F122213E1D5100A24824 /* SendMoneyReceiptPresenter.swift in Sources */,
04BEF55C20593F0C007713F9 /* RewardCollectionViewCell.swift in Sources */,
@ -4766,14 +4720,12 @@
D9CB49872132A5F500B7A124 /* ItemsPickerViewController.swift in Sources */,
D922D9422135124200D43053 /* SendMoneyPaymentModeServiceType.swift in Sources */,
D937038421490C3800D93077 /* KycForm1ViewInterface.swift in Sources */,
9F2B5AF020218751002284F6 /* ProfileDocumentViewController.swift in Sources */,
D90D55CF21327CD600EEEE04 /* AddReciepientInteractorIO.swift in Sources */,
D945F120213E1D5100A24824 /* SendMoneyReceiptInteractor.swift in Sources */,
043A8AFA1FE80BC2004DA154 /* KYCPersonalInfoViewController.swift in Sources */,
0496B84B1FE7DFBA0044810E /* Validation.swift in Sources */,
D90D55D72132846000EEEE04 /* SendMoneyCountryModel.swift in Sources */,
D937038621490C3800D93077 /* KycForm1ViewController.swift in Sources */,
9F3ADCEC2004BD510037A3A3 /* ProfileGeneralViewController.swift in Sources */,
D9CB49752132909500B7A124 /* SendMoneyDistrictViewModel.swift in Sources */,
D95B5E3B21311057000C0B33 /* GmeContactsServiceType.swift in Sources */,
D922D9672135145F00D43053 /* SendMoneyParentPresenter.swift in Sources */,

4
GMERemittance/Extension/UIViewControllerExtension.swift

@ -484,8 +484,8 @@ extension UIViewController {
let destinationViewController = tabViewController.viewControllers![0] as! _HomeViewController
destinationViewController.numberCellsInCollectionView = 6
destinationViewController.showAllCollectionViewCells = true
// destinationViewController.numberCellsInCollectionView = 6
// destinationViewController.showAllCollectionViewCells = true
destinationViewController.hidesBottomBarWhenPushed = false

6
GMERemittance/FillKYC/PopUpGeneralInfo.swift

@ -504,11 +504,11 @@ class PopUpGeneralInfo: UIViewController {
case 33:
self.removeAnimate()
self.removeFromParentViewController()
ProfileBankViewController.profileConnectionTimeOutCheck = 0
// self.removeAnimate()
case 34:
self.removeAnimate()
self.removeFromParentViewController()
ProfileBankViewController.profileConnectionTimeOutCheck = 0
// self.removeAnimate()
case 35:
self.removeAnimate()
self.removeFromParentViewController()
@ -528,7 +528,7 @@ class PopUpGeneralInfo: UIViewController {
case 39:
self.removeAnimate()
self.removeFromParentViewController()
UserInfoViewController.profileEditConnectionTimeOutCheck = 0
// self.removeAnimate()
case 40:
self.removeAnimate()
self.removeFromParentViewController()

93
GMERemittance/Profile/ChangePasswordViewModel.swift

@ -1,93 +0,0 @@
//
// ChangePasswordViewModel.swift
// GMERemittance
//
// Created by Sujal on 2/18/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class ChangePasswordViewModel: SignUpViewModel {
var passwordChanged: Box<Bool?> = Box(nil)
var oldPassword: String!
var newPassword: String!
var confirmPassword: String!
var passwordConnectionTimeOut: Box<Bool?> = Box(nil)
}
extension ChangePasswordViewModel {
/**
to update old password
*/
func updateOldPassword(inputString: String) {
self.oldPassword = inputString
}
/**
to update new password
*/
func updateNewPassword(inputString: String) {
self.newPassword = inputString
}
/**
to confrim new password
*/
func updateConfirmPassword(inputString: String) {
self.confirmPassword = inputString
}
/**
to validate empty textfield
*/
func validateFields() -> isValid {
guard oldPassword != nil && newPassword != nil && confirmPassword != nil else {
return .InValid("Please fill all the fields")
}
guard isValidPasswordLength(password: oldPassword) && isValidPasswordLength(password: newPassword) && isValidPasswordLength(password: confirmPassword) else {
return .InValid("Password lengths do not match the minimum criteria")
}
guard confirmPassword == newPassword else {
return .InValid("Passwords do not match")
}
return .Valid
}
/**
Api request to change password
*/
func requestPasswordChanges() {
let userId: String = UserDefaults.standard.object(forKey: "com.gmeremit.username") as! String
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.changePassword(userId: userId, currentPassword: oldPassword, newPassword: newPassword) { result in
switch result {
case .success(_):
UserDefaults.standard.set(self.newPassword.toBase64(), forKey: "com.gmeremit.password")
self.passwordChanged.value = true
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.passwordChanged.value = false
case .updateAccessCode:
RestApiMananger.sharedInstance.updateAccessCode(userId: userId, password: self.password!) {
result in
if result != "Error"{
let uuid = RestApiMananger.sharedInstance.getUUID()
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
self.requestPasswordChanges()
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.passwordConnectionTimeOut.value = false
}
}
}
}
}

698
GMERemittance/Profile/Profile.storyboard

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ift-aL-bsv">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="ift-aL-bsv">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
@ -32,223 +32,238 @@
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="59d-1R-egH">
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2hZ-Or-uk8">
<rect key="frame" x="0.0" y="20" width="375" height="647"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="ic_profile_bg" translatesAutoresizingMaskIntoConstraints="NO" id="251-PR-tsb">
<rect key="frame" x="10" y="12" width="355" height="226"/>
<color key="backgroundColor" red="0.81568627450980391" green="0.0039215686274509803" blue="0.10588235294117647" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="226" id="j01-do-8ul"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LJ0-rG-zkE">
<rect key="frame" x="40" y="171" width="295" height="17"/>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="17" id="eX5-Lg-k0e"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dmN-OS-njR">
<rect key="frame" x="40" y="148" width="295" height="17"/>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="17" id="Gvb-Xi-uVe"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="l9d-Jg-bOV">
<rect key="frame" x="152" y="33" width="70" height="70"/>
<constraints>
<constraint firstAttribute="width" constant="70" id="OZb-4u-H0A"/>
<constraint firstAttribute="height" constant="70" id="byc-YA-EfS"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="a9d-Ej-Ijh">
<rect key="frame" x="152" y="33" width="70" height="70"/>
<constraints>
<constraint firstAttribute="height" constant="70" id="dLv-8O-aW0"/>
<constraint firstAttribute="width" constant="70" id="sGm-p5-t1c"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Bold" family="San Francisco Text" pointSize="24"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hfP-aZ-zbf" userLabel="Camera">
<rect key="frame" x="204" y="87" width="16" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="Q5Z-vM-fgo"/>
</constraints>
<state key="normal" image="ic_profile_camara"/>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ycZ-2I-FoZ">
<rect key="frame" x="303" y="21" width="47" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="pM5-Ns-niS"/>
<constraint firstAttribute="width" constant="47" id="qhp-M0-PwR"/>
</constraints>
<state key="normal" image="ic_profile_edit"/>
<connections>
<action selector="editProfileTap:" destination="ift-aL-bsv" eventType="touchUpInside" id="avD-aB-pwx"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RTV-0I-Wek">
<rect key="frame" x="20" y="114" width="335" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="aLr-Jr-lbr"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Bold" family="San Francisco Text" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YgX-nG-MrF">
<rect key="frame" x="10" y="248" width="355" height="109"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="59d-1R-egH">
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Your Available Balance" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mmh-uV-sP4">
<rect key="frame" x="30" y="18" width="143" height="17"/>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="ic_profile_bg" translatesAutoresizingMaskIntoConstraints="NO" id="251-PR-tsb">
<rect key="frame" x="10" y="12" width="355" height="226"/>
<color key="backgroundColor" red="0.81568627450980391" green="0.0039215686274509803" blue="0.10588235294117647" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="226" id="j01-do-8ul"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LJ0-rG-zkE">
<rect key="frame" x="40" y="171" width="295" height="17"/>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="17" id="eX5-Lg-k0e"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="KRW" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EXY-5m-shp">
<rect key="frame" x="55" y="47" width="29" height="14"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dmN-OS-njR">
<rect key="frame" x="40" y="148" width="295" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="14" id="cBG-w2-z4r"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="17" id="Gvb-Xi-uVe"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button hidden="YES" opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Upd-kh-obI">
<rect key="frame" x="265" y="36" width="76" height="25"/>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="l9d-Jg-bOV">
<rect key="frame" x="152" y="33" width="70" height="70"/>
<constraints>
<constraint firstAttribute="width" constant="76" id="5zj-u4-3Mj"/>
<constraint firstAttribute="height" constant="25" id="sSs-tL-X49"/>
<constraint firstAttribute="width" constant="70" id="OZb-4u-H0A"/>
<constraint firstAttribute="height" constant="70" id="byc-YA-EfS"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<state key="normal" title="Withdraw">
<color key="titleColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="a9d-Ej-Ijh">
<rect key="frame" x="152" y="33" width="70" height="70"/>
<constraints>
<constraint firstAttribute="height" constant="70" id="dLv-8O-aW0"/>
<constraint firstAttribute="width" constant="70" id="sGm-p5-t1c"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Bold" family="San Francisco Text" pointSize="24"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hfP-aZ-zbf" userLabel="Camera">
<rect key="frame" x="204" y="87" width="16" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="Q5Z-vM-fgo"/>
</constraints>
<state key="normal" image="ic_profile_camara"/>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ycZ-2I-FoZ">
<rect key="frame" x="303" y="21" width="47" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="pM5-Ns-niS"/>
<constraint firstAttribute="width" constant="47" id="qhp-M0-PwR"/>
</constraints>
<state key="normal" image="ic_profile_edit"/>
<connections>
<segue destination="Z18-bb-Vml" kind="show" id="Hgw-mu-7BH"/>
<action selector="editProfileTap:" destination="ift-aL-bsv" eventType="touchUpInside" id="avD-aB-pwx"/>
</connections>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="QWE-De-OIo">
<rect key="frame" x="20" y="69" width="315" height="21"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RTV-0I-Wek">
<rect key="frame" x="20" y="114" width="335" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="aLr-Jr-lbr"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Bold" family="San Francisco Text" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="YgX-nG-MrF">
<rect key="frame" x="10" y="248" width="355" height="109"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="GME Wallet No." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nlo-iP-QwN">
<rect key="frame" x="10" y="2" width="295" height="17"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Your Available Balance" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mmh-uV-sP4">
<rect key="frame" x="30" y="18" width="143" height="17"/>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="KRW" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EXY-5m-shp">
<rect key="frame" x="55" y="47" width="29" height="14"/>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="13" id="Vul-Ou-98m"/>
<constraint firstAttribute="height" constant="14" id="cBG-w2-z4r"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button hidden="YES" opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Upd-kh-obI">
<rect key="frame" x="265" y="36" width="76" height="25"/>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="width" constant="76" id="5zj-u4-3Mj"/>
<constraint firstAttribute="height" constant="25" id="sSs-tL-X49"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<state key="normal" title="Withdraw">
<color key="titleColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<segue destination="Z18-bb-Vml" kind="show" id="Hgw-mu-7BH"/>
</connections>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="QWE-De-OIo">
<rect key="frame" x="20" y="69" width="315" height="21"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="GME Wallet No." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nlo-iP-QwN">
<rect key="frame" x="10" y="2" width="295" height="17"/>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="13" id="Vul-Ou-98m"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="nlo-iP-QwN" firstAttribute="leading" secondItem="QWE-De-OIo" secondAttribute="leading" constant="10" id="SeR-Ql-czs"/>
<constraint firstAttribute="trailing" secondItem="nlo-iP-QwN" secondAttribute="trailing" constant="10" id="eak-xN-SV7"/>
<constraint firstItem="nlo-iP-QwN" firstAttribute="top" secondItem="QWE-De-OIo" secondAttribute="top" constant="2" id="vJG-Ya-AqY"/>
<constraint firstAttribute="height" constant="21" id="vNj-ju-38U"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="..." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MAZ-i9-fR8">
<rect key="frame" x="30" y="37" width="21" height="28"/>
<constraints>
<constraint firstAttribute="height" constant="28" id="bd9-CU-FEm"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="24"/>
<color key="textColor" red="0.92549019610000005" green="0.10980392160000001" blue="0.14117647059999999" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="nlo-iP-QwN" firstAttribute="leading" secondItem="QWE-De-OIo" secondAttribute="leading" constant="10" id="SeR-Ql-czs"/>
<constraint firstAttribute="trailing" secondItem="nlo-iP-QwN" secondAttribute="trailing" constant="10" id="eak-xN-SV7"/>
<constraint firstItem="nlo-iP-QwN" firstAttribute="top" secondItem="QWE-De-OIo" secondAttribute="top" constant="2" id="vJG-Ya-AqY"/>
<constraint firstAttribute="height" constant="21" id="vNj-ju-38U"/>
<constraint firstAttribute="trailing" secondItem="QWE-De-OIo" secondAttribute="trailing" constant="20" id="3IV-dJ-TVB"/>
<constraint firstItem="mmh-uV-sP4" firstAttribute="leading" secondItem="YgX-nG-MrF" secondAttribute="leading" constant="30" id="ClG-7e-VId"/>
<constraint firstItem="QWE-De-OIo" firstAttribute="leading" secondItem="YgX-nG-MrF" secondAttribute="leading" constant="20" id="H13-ax-XIv"/>
<constraint firstItem="QWE-De-OIo" firstAttribute="top" secondItem="EXY-5m-shp" secondAttribute="bottom" constant="8" id="JHc-0s-2mq"/>
<constraint firstAttribute="height" constant="109" id="K07-uy-M4b"/>
<constraint firstItem="EXY-5m-shp" firstAttribute="leading" secondItem="MAZ-i9-fR8" secondAttribute="trailing" constant="4" id="X0G-hQ-pkz"/>
<constraint firstAttribute="trailing" secondItem="Upd-kh-obI" secondAttribute="trailing" constant="14" id="XoT-8B-7R2"/>
<constraint firstItem="MAZ-i9-fR8" firstAttribute="top" secondItem="mmh-uV-sP4" secondAttribute="bottom" constant="2" id="bVD-pq-rIn"/>
<constraint firstItem="MAZ-i9-fR8" firstAttribute="leading" secondItem="YgX-nG-MrF" secondAttribute="leading" constant="30" id="dDj-AH-Uoj"/>
<constraint firstItem="mmh-uV-sP4" firstAttribute="top" secondItem="YgX-nG-MrF" secondAttribute="top" constant="18" id="okw-ck-QWv"/>
<constraint firstItem="Upd-kh-obI" firstAttribute="top" secondItem="YgX-nG-MrF" secondAttribute="top" constant="36" id="uX3-C9-FvR"/>
<constraint firstItem="QWE-De-OIo" firstAttribute="top" secondItem="MAZ-i9-fR8" secondAttribute="bottom" constant="4" id="vih-of-28I"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="..." lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="MAZ-i9-fR8">
<rect key="frame" x="30" y="37" width="21" height="28"/>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bv9-cG-fQQ">
<rect key="frame" x="132.5" y="209" width="110" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="28" id="bd9-CU-FEm"/>
<constraint firstAttribute="height" constant="17" id="MrC-na-8TP"/>
<constraint firstAttribute="width" constant="110" id="nqc-8R-xU0"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="24"/>
<color key="textColor" red="0.92549019610000005" green="0.10980392160000001" blue="0.14117647059999999" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<state key="normal" image="ic_profile_key">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<segue destination="4vv-1X-cU7" kind="show" id="KDF-EE-aoC"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="QWE-De-OIo" secondAttribute="trailing" constant="20" id="3IV-dJ-TVB"/>
<constraint firstItem="mmh-uV-sP4" firstAttribute="leading" secondItem="YgX-nG-MrF" secondAttribute="leading" constant="30" id="ClG-7e-VId"/>
<constraint firstItem="QWE-De-OIo" firstAttribute="leading" secondItem="YgX-nG-MrF" secondAttribute="leading" constant="20" id="H13-ax-XIv"/>
<constraint firstItem="QWE-De-OIo" firstAttribute="top" secondItem="EXY-5m-shp" secondAttribute="bottom" constant="8" id="JHc-0s-2mq"/>
<constraint firstAttribute="height" constant="109" id="K07-uy-M4b"/>
<constraint firstItem="EXY-5m-shp" firstAttribute="leading" secondItem="MAZ-i9-fR8" secondAttribute="trailing" constant="4" id="X0G-hQ-pkz"/>
<constraint firstAttribute="trailing" secondItem="Upd-kh-obI" secondAttribute="trailing" constant="14" id="XoT-8B-7R2"/>
<constraint firstItem="MAZ-i9-fR8" firstAttribute="top" secondItem="mmh-uV-sP4" secondAttribute="bottom" constant="2" id="bVD-pq-rIn"/>
<constraint firstItem="MAZ-i9-fR8" firstAttribute="leading" secondItem="YgX-nG-MrF" secondAttribute="leading" constant="30" id="dDj-AH-Uoj"/>
<constraint firstItem="mmh-uV-sP4" firstAttribute="top" secondItem="YgX-nG-MrF" secondAttribute="top" constant="18" id="okw-ck-QWv"/>
<constraint firstItem="Upd-kh-obI" firstAttribute="top" secondItem="YgX-nG-MrF" secondAttribute="top" constant="36" id="uX3-C9-FvR"/>
<constraint firstItem="QWE-De-OIo" firstAttribute="top" secondItem="MAZ-i9-fR8" secondAttribute="bottom" constant="4" id="vih-of-28I"/>
<constraint firstItem="dmN-OS-njR" firstAttribute="top" secondItem="RTV-0I-Wek" secondAttribute="bottom" constant="4" id="0aJ-Ri-pj8"/>
<constraint firstItem="bv9-cG-fQQ" firstAttribute="centerX" secondItem="59d-1R-egH" secondAttribute="centerX" id="5EP-sb-dDG"/>
<constraint firstItem="LJ0-rG-zkE" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="40" id="8LH-UK-zR8"/>
<constraint firstAttribute="trailing" secondItem="ycZ-2I-FoZ" secondAttribute="trailing" constant="25" id="AB9-MW-IXl"/>
<constraint firstAttribute="trailing" secondItem="LJ0-rG-zkE" secondAttribute="trailing" constant="40" id="Apb-eF-asH"/>
<constraint firstAttribute="trailing" secondItem="251-PR-tsb" secondAttribute="trailing" constant="10" id="HIe-9r-ZMq"/>
<constraint firstItem="l9d-Jg-bOV" firstAttribute="centerX" secondItem="59d-1R-egH" secondAttribute="centerX" id="InY-Z8-k4X"/>
<constraint firstAttribute="trailing" secondItem="YgX-nG-MrF" secondAttribute="trailing" constant="10" id="RJb-bT-Lbq"/>
<constraint firstItem="RTV-0I-Wek" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="20" id="St3-1g-6ZA"/>
<constraint firstItem="RTV-0I-Wek" firstAttribute="top" secondItem="l9d-Jg-bOV" secondAttribute="bottom" constant="11" id="Yen-ld-mau"/>
<constraint firstItem="YgX-nG-MrF" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="10" id="a88-6R-tU2"/>
<constraint firstItem="hfP-aZ-zbf" firstAttribute="leading" secondItem="l9d-Jg-bOV" secondAttribute="trailing" constant="-18" id="aq4-JB-iwM"/>
<constraint firstItem="a9d-Ej-Ijh" firstAttribute="centerX" secondItem="59d-1R-egH" secondAttribute="centerX" id="bPy-tO-8gP"/>
<constraint firstItem="251-PR-tsb" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="12" id="dd0-Q5-wWR"/>
<constraint firstItem="dmN-OS-njR" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="40" id="eAs-g6-5p7"/>
<constraint firstAttribute="trailing" secondItem="RTV-0I-Wek" secondAttribute="trailing" constant="20" id="fA6-tg-JoM"/>
<constraint firstItem="hfP-aZ-zbf" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="87" id="fCN-dl-abw"/>
<constraint firstItem="251-PR-tsb" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="10" id="fRO-8M-Aod"/>
<constraint firstAttribute="trailing" secondItem="dmN-OS-njR" secondAttribute="trailing" constant="40" id="gvn-Pe-MGB"/>
<constraint firstItem="YgX-nG-MrF" firstAttribute="top" secondItem="251-PR-tsb" secondAttribute="bottom" constant="10" id="hmX-35-YY6"/>
<constraint firstItem="bv9-cG-fQQ" firstAttribute="top" secondItem="LJ0-rG-zkE" secondAttribute="bottom" constant="21" id="l7Y-RM-eV1"/>
<constraint firstItem="l9d-Jg-bOV" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="33" id="oOC-RR-ngp"/>
<constraint firstItem="LJ0-rG-zkE" firstAttribute="top" secondItem="dmN-OS-njR" secondAttribute="bottom" constant="6" id="shS-ny-uXk"/>
<constraint firstItem="ycZ-2I-FoZ" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="21" id="tkz-8M-NkL"/>
<constraint firstItem="a9d-Ej-Ijh" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="33" id="viq-qz-JwH"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bv9-cG-fQQ">
<rect key="frame" x="132.5" y="209" width="110" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="MrC-na-8TP"/>
<constraint firstAttribute="width" constant="110" id="nqc-8R-xU0"/>
</constraints>
<state key="normal" image="ic_profile_key">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<segue destination="4vv-1X-cU7" kind="show" id="KDF-EE-aoC"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.90588235294117647" green="0.92941176470588238" blue="0.94901960784313721" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="dmN-OS-njR" firstAttribute="top" secondItem="RTV-0I-Wek" secondAttribute="bottom" constant="4" id="0aJ-Ri-pj8"/>
<constraint firstItem="bv9-cG-fQQ" firstAttribute="centerX" secondItem="59d-1R-egH" secondAttribute="centerX" id="5EP-sb-dDG"/>
<constraint firstItem="LJ0-rG-zkE" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="40" id="8LH-UK-zR8"/>
<constraint firstAttribute="trailing" secondItem="ycZ-2I-FoZ" secondAttribute="trailing" constant="25" id="AB9-MW-IXl"/>
<constraint firstAttribute="trailing" secondItem="LJ0-rG-zkE" secondAttribute="trailing" constant="40" id="Apb-eF-asH"/>
<constraint firstAttribute="trailing" secondItem="251-PR-tsb" secondAttribute="trailing" constant="10" id="HIe-9r-ZMq"/>
<constraint firstItem="l9d-Jg-bOV" firstAttribute="centerX" secondItem="59d-1R-egH" secondAttribute="centerX" id="InY-Z8-k4X"/>
<constraint firstAttribute="trailing" secondItem="YgX-nG-MrF" secondAttribute="trailing" constant="10" id="RJb-bT-Lbq"/>
<constraint firstItem="RTV-0I-Wek" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="20" id="St3-1g-6ZA"/>
<constraint firstItem="RTV-0I-Wek" firstAttribute="top" secondItem="l9d-Jg-bOV" secondAttribute="bottom" constant="11" id="Yen-ld-mau"/>
<constraint firstItem="YgX-nG-MrF" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="10" id="a88-6R-tU2"/>
<constraint firstItem="hfP-aZ-zbf" firstAttribute="leading" secondItem="l9d-Jg-bOV" secondAttribute="trailing" constant="-18" id="aq4-JB-iwM"/>
<constraint firstItem="a9d-Ej-Ijh" firstAttribute="centerX" secondItem="59d-1R-egH" secondAttribute="centerX" id="bPy-tO-8gP"/>
<constraint firstItem="251-PR-tsb" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="12" id="dd0-Q5-wWR"/>
<constraint firstItem="dmN-OS-njR" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="40" id="eAs-g6-5p7"/>
<constraint firstAttribute="trailing" secondItem="RTV-0I-Wek" secondAttribute="trailing" constant="20" id="fA6-tg-JoM"/>
<constraint firstItem="hfP-aZ-zbf" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="87" id="fCN-dl-abw"/>
<constraint firstItem="251-PR-tsb" firstAttribute="leading" secondItem="59d-1R-egH" secondAttribute="leading" constant="10" id="fRO-8M-Aod"/>
<constraint firstAttribute="trailing" secondItem="dmN-OS-njR" secondAttribute="trailing" constant="40" id="gvn-Pe-MGB"/>
<constraint firstItem="YgX-nG-MrF" firstAttribute="top" secondItem="251-PR-tsb" secondAttribute="bottom" constant="10" id="hmX-35-YY6"/>
<constraint firstItem="bv9-cG-fQQ" firstAttribute="top" secondItem="LJ0-rG-zkE" secondAttribute="bottom" constant="21" id="l7Y-RM-eV1"/>
<constraint firstItem="l9d-Jg-bOV" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="33" id="oOC-RR-ngp"/>
<constraint firstItem="LJ0-rG-zkE" firstAttribute="top" secondItem="dmN-OS-njR" secondAttribute="bottom" constant="6" id="shS-ny-uXk"/>
<constraint firstItem="ycZ-2I-FoZ" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="21" id="tkz-8M-NkL"/>
<constraint firstItem="a9d-Ej-Ijh" firstAttribute="top" secondItem="59d-1R-egH" secondAttribute="top" constant="33" id="viq-qz-JwH"/>
<constraint firstItem="59d-1R-egH" firstAttribute="height" secondItem="2hZ-Or-uk8" secondAttribute="height" id="21h-Mi-e3B"/>
<constraint firstItem="59d-1R-egH" firstAttribute="top" secondItem="2hZ-Or-uk8" secondAttribute="top" id="7Pn-vj-6CM"/>
<constraint firstAttribute="bottom" secondItem="59d-1R-egH" secondAttribute="bottom" id="Kgi-jF-cdJ"/>
<constraint firstItem="59d-1R-egH" firstAttribute="width" secondItem="2hZ-Or-uk8" secondAttribute="width" id="Xha-KI-4GH"/>
<constraint firstAttribute="trailing" secondItem="59d-1R-egH" secondAttribute="trailing" id="g9E-W9-wuL"/>
<constraint firstItem="59d-1R-egH" firstAttribute="leading" secondItem="2hZ-Or-uk8" secondAttribute="leading" id="gtZ-9Q-ftB"/>
</constraints>
</view>
</scrollView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="59d-1R-egH" firstAttribute="bottom" secondItem="t1C-my-wgh" secondAttribute="bottom" id="73P-8g-Gig"/>
<constraint firstItem="59d-1R-egH" firstAttribute="leading" secondItem="t1C-my-wgh" secondAttribute="leading" id="GJh-KP-w8E"/>
<constraint firstItem="59d-1R-egH" firstAttribute="trailing" secondItem="t1C-my-wgh" secondAttribute="trailing" id="ZgC-0I-siz"/>
<constraint firstItem="59d-1R-egH" firstAttribute="top" secondItem="t1C-my-wgh" secondAttribute="top" id="iz1-Xm-bdN"/>
<constraint firstItem="t1C-my-wgh" firstAttribute="bottom" secondItem="2hZ-Or-uk8" secondAttribute="bottom" id="14B-EK-YnJ"/>
<constraint firstItem="2hZ-Or-uk8" firstAttribute="width" secondItem="Ead-ne-CIv" secondAttribute="width" id="Mwg-Dv-Ieu"/>
<constraint firstItem="t1C-my-wgh" firstAttribute="trailing" secondItem="2hZ-Or-uk8" secondAttribute="trailing" id="Xgy-AH-lpK"/>
<constraint firstItem="2hZ-Or-uk8" firstAttribute="top" secondItem="t1C-my-wgh" secondAttribute="top" id="x4l-Dh-3T5"/>
<constraint firstItem="2hZ-Or-uk8" firstAttribute="leading" secondItem="t1C-my-wgh" secondAttribute="leading" id="yOT-p7-Afy"/>
</constraints>
<viewLayoutGuide key="safeArea" id="t1C-my-wgh"/>
</view>
@ -298,185 +313,200 @@
<scene sceneID="rlZ-v6-9ba">
<objects>
<viewController storyboardIdentifier="changePassword" id="4vv-1X-cU7" customClass="ProfileChangePasswordViewController" customModule="GMERemittance" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="7Pk-Ju-HzD">
<view key="view" contentMode="scaleToFill" id="7Pk-Ju-HzD" customClass="ProfileCh">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ETk-mR-KK0">
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Nsu-tc-uey">
<rect key="frame" x="0.0" y="20" width="375" height="647"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LU1-7H-4oT">
<rect key="frame" x="10" y="65" width="355" height="264"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ETk-mR-KK0">
<rect key="frame" x="0.0" y="0.0" width="375" height="647"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" spacing="9" translatesAutoresizingMaskIntoConstraints="NO" id="zMD-Ic-UA3">
<rect key="frame" x="0.0" y="0.0" width="355" height="264"/>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="LU1-7H-4oT">
<rect key="frame" x="10" y="65" width="355" height="264"/>
<subviews>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JDG-dX-Zgq">
<rect key="frame" x="0.0" y="0.0" width="355" height="82"/>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" spacing="9" translatesAutoresizingMaskIntoConstraints="NO" id="zMD-Ic-UA3">
<rect key="frame" x="0.0" y="0.0" width="355" height="264"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Current Password" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7Gs-uo-Wte">
<rect key="frame" x="28" y="15" width="107" height="17"/>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JDG-dX-Zgq">
<rect key="frame" x="0.0" y="0.0" width="355" height="82"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Current Password" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7Gs-uo-Wte">
<rect key="frame" x="28" y="15" width="107" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="Shc-Al-nF8"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Enter your Current Password" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="zfD-X4-YTt">
<rect key="frame" x="28" y="37" width="223.5" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="1ut-5w-QgJ"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<textInputTraits key="textInputTraits" secureTextEntry="YES"/>
</textField>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="Shc-Al-nF8"/>
<constraint firstItem="7Gs-uo-Wte" firstAttribute="top" secondItem="JDG-dX-Zgq" secondAttribute="top" constant="15" id="LUn-KK-4Pr"/>
<constraint firstItem="zfD-X4-YTt" firstAttribute="leading" secondItem="JDG-dX-Zgq" secondAttribute="leading" constant="28" id="Mx7-aT-Q6l"/>
<constraint firstItem="zfD-X4-YTt" firstAttribute="top" secondItem="7Gs-uo-Wte" secondAttribute="bottom" constant="5" id="i0N-XF-dFg"/>
<constraint firstItem="7Gs-uo-Wte" firstAttribute="leading" secondItem="JDG-dX-Zgq" secondAttribute="leading" constant="28" id="ncI-MU-efU"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Enter your Current Password" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="zfD-X4-YTt">
<rect key="frame" x="28" y="37" width="223.5" height="31"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VF3-dL-FMv">
<rect key="frame" x="0.0" y="91" width="355" height="82"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="New Password" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iZO-Jd-Wum">
<rect key="frame" x="28" y="15" width="88" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="PQ1-TF-F6e"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Enter your New Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="GwX-M7-rY8">
<rect key="frame" x="28" y="37" width="199" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="RjL-Vy-18n"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<textInputTraits key="textInputTraits" secureTextEntry="YES"/>
</textField>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="1ut-5w-QgJ"/>
<constraint firstItem="iZO-Jd-Wum" firstAttribute="leading" secondItem="VF3-dL-FMv" secondAttribute="leading" constant="28" id="WY1-Fg-CQD"/>
<constraint firstItem="GwX-M7-rY8" firstAttribute="top" secondItem="iZO-Jd-Wum" secondAttribute="bottom" constant="5" id="k4m-Et-bO4"/>
<constraint firstItem="iZO-Jd-Wum" firstAttribute="top" secondItem="VF3-dL-FMv" secondAttribute="top" constant="15" id="s1T-Pp-VAP"/>
<constraint firstItem="GwX-M7-rY8" firstAttribute="leading" secondItem="VF3-dL-FMv" secondAttribute="leading" constant="28" id="vh4-zQ-pSh"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<textInputTraits key="textInputTraits" secureTextEntry="YES"/>
</textField>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="7Gs-uo-Wte" firstAttribute="top" secondItem="JDG-dX-Zgq" secondAttribute="top" constant="15" id="LUn-KK-4Pr"/>
<constraint firstItem="zfD-X4-YTt" firstAttribute="leading" secondItem="JDG-dX-Zgq" secondAttribute="leading" constant="28" id="Mx7-aT-Q6l"/>
<constraint firstItem="zfD-X4-YTt" firstAttribute="top" secondItem="7Gs-uo-Wte" secondAttribute="bottom" constant="5" id="i0N-XF-dFg"/>
<constraint firstItem="7Gs-uo-Wte" firstAttribute="leading" secondItem="JDG-dX-Zgq" secondAttribute="leading" constant="28" id="ncI-MU-efU"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="VF3-dL-FMv">
<rect key="frame" x="0.0" y="91" width="355" height="82"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="New Password" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iZO-Jd-Wum">
<rect key="frame" x="28" y="15" width="88" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="PQ1-TF-F6e"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Enter your New Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="GwX-M7-rY8">
<rect key="frame" x="28" y="37" width="199" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="RjL-Vy-18n"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<textInputTraits key="textInputTraits" secureTextEntry="YES"/>
</textField>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="iZO-Jd-Wum" firstAttribute="leading" secondItem="VF3-dL-FMv" secondAttribute="leading" constant="28" id="WY1-Fg-CQD"/>
<constraint firstItem="GwX-M7-rY8" firstAttribute="top" secondItem="iZO-Jd-Wum" secondAttribute="bottom" constant="5" id="k4m-Et-bO4"/>
<constraint firstItem="iZO-Jd-Wum" firstAttribute="top" secondItem="VF3-dL-FMv" secondAttribute="top" constant="15" id="s1T-Pp-VAP"/>
<constraint firstItem="GwX-M7-rY8" firstAttribute="leading" secondItem="VF3-dL-FMv" secondAttribute="leading" constant="28" id="vh4-zQ-pSh"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jkP-cy-lga">
<rect key="frame" x="0.0" y="182" width="355" height="82"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Confirm Password" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ivp-u7-qDI">
<rect key="frame" x="28" y="15" width="110" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="h2C-uP-gzp"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Confirm your Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="V5J-Sb-fhg">
<rect key="frame" x="28" y="37" width="183" height="31"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<view clipsSubviews="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="jkP-cy-lga">
<rect key="frame" x="0.0" y="182" width="355" height="82"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Confirm Password" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ivp-u7-qDI">
<rect key="frame" x="28" y="15" width="110" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="h2C-uP-gzp"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="14"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Confirm your Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="V5J-Sb-fhg">
<rect key="frame" x="28" y="37" width="183" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="zaC-Tw-UP6"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<textInputTraits key="textInputTraits" secureTextEntry="YES"/>
</textField>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="zaC-Tw-UP6"/>
<constraint firstItem="Ivp-u7-qDI" firstAttribute="top" secondItem="jkP-cy-lga" secondAttribute="top" constant="15" id="9zA-52-Feg"/>
<constraint firstItem="V5J-Sb-fhg" firstAttribute="leading" secondItem="jkP-cy-lga" secondAttribute="leading" constant="28" id="Jht-Xh-8hl"/>
<constraint firstItem="V5J-Sb-fhg" firstAttribute="top" secondItem="Ivp-u7-qDI" secondAttribute="bottom" constant="5" id="aNy-F6-dov"/>
<constraint firstItem="Ivp-u7-qDI" firstAttribute="leading" secondItem="jkP-cy-lga" secondAttribute="leading" constant="28" id="pgY-ig-wrq"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<textInputTraits key="textInputTraits" secureTextEntry="YES"/>
</textField>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="Ivp-u7-qDI" firstAttribute="top" secondItem="jkP-cy-lga" secondAttribute="top" constant="15" id="9zA-52-Feg"/>
<constraint firstItem="V5J-Sb-fhg" firstAttribute="leading" secondItem="jkP-cy-lga" secondAttribute="leading" constant="28" id="Jht-Xh-8hl"/>
<constraint firstItem="V5J-Sb-fhg" firstAttribute="top" secondItem="Ivp-u7-qDI" secondAttribute="bottom" constant="5" id="aNy-F6-dov"/>
<constraint firstItem="Ivp-u7-qDI" firstAttribute="leading" secondItem="jkP-cy-lga" secondAttribute="leading" constant="28" id="pgY-ig-wrq"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
</stackView>
</subviews>
</stackView>
<color key="backgroundColor" red="0.90588235294117647" green="0.92941176470588238" blue="0.94901960784313721" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="zMD-Ic-UA3" firstAttribute="top" secondItem="LU1-7H-4oT" secondAttribute="top" id="3aP-OO-rT4"/>
<constraint firstAttribute="height" constant="264" id="DIX-6h-vCn"/>
<constraint firstAttribute="bottom" secondItem="zMD-Ic-UA3" secondAttribute="bottom" id="cMS-UM-0sT"/>
<constraint firstAttribute="trailing" secondItem="zMD-Ic-UA3" secondAttribute="trailing" id="pQh-aF-Xcp"/>
<constraint firstItem="zMD-Ic-UA3" firstAttribute="leading" secondItem="LU1-7H-4oT" secondAttribute="leading" id="xQK-KS-acg"/>
</constraints>
</view>
<label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Change Password" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cdu-5Q-Z5A">
<rect key="frame" x="10" y="21" width="355" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="80F-mp-eYg"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="XqZ-xO-HOx">
<rect key="frame" x="87.5" y="369" width="200" height="50"/>
<color key="backgroundColor" red="0.91372549020000005" green="0.2470588235" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="width" constant="200" id="eUk-6j-8wv"/>
<constraint firstAttribute="height" constant="50" id="srO-by-1EQ"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<state key="normal" title="Save">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="savePasswordChanges:" destination="4vv-1X-cU7" eventType="touchUpInside" id="WWo-kR-ZiY"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.90588235294117647" green="0.92941176470588238" blue="0.94901960784313721" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="zMD-Ic-UA3" firstAttribute="top" secondItem="LU1-7H-4oT" secondAttribute="top" id="3aP-OO-rT4"/>
<constraint firstAttribute="height" constant="264" id="DIX-6h-vCn"/>
<constraint firstAttribute="bottom" secondItem="zMD-Ic-UA3" secondAttribute="bottom" id="cMS-UM-0sT"/>
<constraint firstAttribute="trailing" secondItem="zMD-Ic-UA3" secondAttribute="trailing" id="pQh-aF-Xcp"/>
<constraint firstItem="zMD-Ic-UA3" firstAttribute="leading" secondItem="LU1-7H-4oT" secondAttribute="leading" id="xQK-KS-acg"/>
<constraint firstItem="cdu-5Q-Z5A" firstAttribute="top" secondItem="ETk-mR-KK0" secondAttribute="top" constant="21" id="99J-3f-kxW"/>
<constraint firstAttribute="trailing" secondItem="LU1-7H-4oT" secondAttribute="trailing" constant="10" id="BtP-t2-ScK"/>
<constraint firstAttribute="trailing" secondItem="cdu-5Q-Z5A" secondAttribute="trailing" constant="10" id="LXf-Yc-Cqc"/>
<constraint firstItem="LU1-7H-4oT" firstAttribute="leading" secondItem="ETk-mR-KK0" secondAttribute="leading" constant="10" id="OEO-DF-sQj"/>
<constraint firstItem="XqZ-xO-HOx" firstAttribute="top" secondItem="LU1-7H-4oT" secondAttribute="bottom" constant="40" id="OTa-rV-by8"/>
<constraint firstItem="cdu-5Q-Z5A" firstAttribute="leading" secondItem="ETk-mR-KK0" secondAttribute="leading" constant="10" id="hbD-s3-8aW"/>
<constraint firstItem="XqZ-xO-HOx" firstAttribute="centerX" secondItem="ETk-mR-KK0" secondAttribute="centerX" id="kFZ-Fa-mVM"/>
<constraint firstItem="LU1-7H-4oT" firstAttribute="top" secondItem="cdu-5Q-Z5A" secondAttribute="bottom" constant="23" id="wM7-nP-ECB"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Change Password" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cdu-5Q-Z5A">
<rect key="frame" x="10" y="21" width="355" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="21" id="80F-mp-eYg"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="XqZ-xO-HOx">
<rect key="frame" x="87.5" y="369" width="200" height="50"/>
<color key="backgroundColor" red="0.91372549020000005" green="0.2470588235" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="width" constant="200" id="eUk-6j-8wv"/>
<constraint firstAttribute="height" constant="50" id="srO-by-1EQ"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoDisplay-Regular" family="San Francisco Display" pointSize="18"/>
<state key="normal" title="Save">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="savePasswordChanges:" destination="4vv-1X-cU7" eventType="touchUpInside" id="WWo-kR-ZiY"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="cdu-5Q-Z5A" firstAttribute="top" secondItem="ETk-mR-KK0" secondAttribute="top" constant="21" id="99J-3f-kxW"/>
<constraint firstAttribute="trailing" secondItem="LU1-7H-4oT" secondAttribute="trailing" constant="10" id="BtP-t2-ScK"/>
<constraint firstAttribute="trailing" secondItem="cdu-5Q-Z5A" secondAttribute="trailing" constant="10" id="LXf-Yc-Cqc"/>
<constraint firstItem="LU1-7H-4oT" firstAttribute="leading" secondItem="ETk-mR-KK0" secondAttribute="leading" constant="10" id="OEO-DF-sQj"/>
<constraint firstItem="XqZ-xO-HOx" firstAttribute="top" secondItem="LU1-7H-4oT" secondAttribute="bottom" constant="40" id="OTa-rV-by8"/>
<constraint firstItem="cdu-5Q-Z5A" firstAttribute="leading" secondItem="ETk-mR-KK0" secondAttribute="leading" constant="10" id="hbD-s3-8aW"/>
<constraint firstItem="XqZ-xO-HOx" firstAttribute="centerX" secondItem="ETk-mR-KK0" secondAttribute="centerX" id="kFZ-Fa-mVM"/>
<constraint firstItem="LU1-7H-4oT" firstAttribute="top" secondItem="cdu-5Q-Z5A" secondAttribute="bottom" constant="23" id="wM7-nP-ECB"/>
<constraint firstAttribute="trailing" secondItem="ETk-mR-KK0" secondAttribute="trailing" id="38T-Ut-HQx"/>
<constraint firstItem="ETk-mR-KK0" firstAttribute="height" secondItem="Nsu-tc-uey" secondAttribute="height" id="Pxb-Re-OUW"/>
<constraint firstItem="ETk-mR-KK0" firstAttribute="leading" secondItem="Nsu-tc-uey" secondAttribute="leading" id="Ty8-fd-nRc"/>
<constraint firstItem="ETk-mR-KK0" firstAttribute="top" secondItem="Nsu-tc-uey" secondAttribute="top" id="ZYe-67-yNc"/>
<constraint firstItem="ETk-mR-KK0" firstAttribute="width" secondItem="Nsu-tc-uey" secondAttribute="width" id="bLN-Dd-Nwu"/>
<constraint firstAttribute="bottom" secondItem="ETk-mR-KK0" secondAttribute="bottom" id="it6-td-MC4"/>
</constraints>
</view>
</scrollView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="ETk-mR-KK0" firstAttribute="top" secondItem="Vlc-t2-52s" secondAttribute="top" id="4xH-z2-9tH"/>
<constraint firstItem="ETk-mR-KK0" firstAttribute="leading" secondItem="Vlc-t2-52s" secondAttribute="leading" id="CjI-0p-HCM"/>
<constraint firstItem="ETk-mR-KK0" firstAttribute="trailing" secondItem="Vlc-t2-52s" secondAttribute="trailing" id="azB-Ot-W9Q"/>
<constraint firstItem="ETk-mR-KK0" firstAttribute="bottom" secondItem="Vlc-t2-52s" secondAttribute="bottom" id="gBY-Q7-oxc"/>
<constraint firstItem="Nsu-tc-uey" firstAttribute="top" secondItem="Vlc-t2-52s" secondAttribute="top" id="ClT-hZ-cpK"/>
<constraint firstItem="Nsu-tc-uey" firstAttribute="leading" secondItem="Vlc-t2-52s" secondAttribute="leading" id="SrU-9d-MU8"/>
<constraint firstItem="Vlc-t2-52s" firstAttribute="trailing" secondItem="Nsu-tc-uey" secondAttribute="trailing" id="Y5t-oP-jye"/>
<constraint firstItem="Nsu-tc-uey" firstAttribute="width" secondItem="7Pk-Ju-HzD" secondAttribute="width" id="f0J-7U-Vjo"/>
<constraint firstItem="Vlc-t2-52s" firstAttribute="bottom" secondItem="Nsu-tc-uey" secondAttribute="bottom" id="uzR-Z6-1eA"/>
</constraints>
<viewLayoutGuide key="safeArea" id="Vlc-t2-52s"/>
</view>
@ -490,7 +520,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="otg-JS-bYE" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="6510" y="2037"/>
<point key="canvasLocation" x="7150" y="1820"/>
</scene>
<!--Withdraw View Controller-->
<scene sceneID="TNk-Nb-bPc">

271
GMERemittance/Profile/ProfileBankViewController.swift

@ -1,271 +0,0 @@
//
// ProfileBankViewController.swift
// GMERemittance
//
// Created by Fm-user on 1/30/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
import UIKit
class ProfileBankViewController: UIViewController {
var userinfoviewmodel: UserInfoViewModel?
var alertController: UIAlertController!
@IBOutlet weak var labelBankName: UILabel!
@IBOutlet weak var labelAccountNumber: UILabel!
@IBOutlet weak var labelVerificationIDType: UILabel!
@IBOutlet weak var labelVerificationIDNumber: UILabel!
@IBOutlet weak var labelExpiryDate: UILabel!
@IBOutlet weak var labelSourceIncome: UILabel!
let pickerView = UIPickerView()
var pickerData: [String] = [String]()
var editTextField: UITextField!
private var selectedFundSouceIndex: Int!
private var selectedFundSource: String!
private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
public static var profileConnectionTimeOutCheck = 0
@IBAction func goBack(_ sender: Any) {
navigationController?.popViewController(animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
setUpNavBar(id: 201, title: "Profile")
guard userinfoviewmodel != nil else {
self.popUpMessageInfo(value: 16, title: "No Data Available", message: "Data not received")
return
}
setUpAnotherLoginListener(genericviewmodel: userinfoviewmodel!)
userinfoviewmodel!.userDataAvailable.value = nil
userinfoviewmodel!.userSourceFundAvailable.value = nil
userinfoviewmodel?.internetConnection.value = nil
userinfoviewmodel?.userConnectionTimeOut.value = nil
/**
connection timeout
*/
userinfoviewmodel?.userConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.enableUserInteractions()
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
if ProfileBankViewController.profileConnectionTimeOutCheck == 0{
ProfileBankViewController.profileConnectionTimeOutCheck = ProfileBankViewController.profileConnectionTimeOutCheck+1
self.popUpMessage(value: 33)
}
}
/**
Internet check
*/
userinfoviewmodel?.internetConnection.bind { [unowned self] in
guard $0 != nil else {
return
}
self.enableUserInteractions()
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
self.popUpMessage(value: 15)
}
/**
Update the view for Source fund
*/
userinfoviewmodel!.userSourceFundAvailable.bind { [weak self] in
guard $0 != nil else {
if let controller = self?.alertController {
controller.dismiss(animated: true, completion: nil)
}
return
}
guard $0! else {
if ProfileBankViewController.profileConnectionTimeOutCheck == 0{
ProfileBankViewController.profileConnectionTimeOutCheck = ProfileBankViewController.profileConnectionTimeOutCheck+1
self?.popUpMessageError(value: 10, message: (self?.userinfoviewmodel?.getErrorMessage())!)
}
return
}
self?.setUpTextField()
}
/**
Update the view for user detail
*/
userinfoviewmodel!.userDataAvailable.bind { [unowned self] in
guard $0 != nil else {
return
}
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
self.enableUserInteractions()
guard $0! else {
if ProfileBankViewController.profileConnectionTimeOutCheck == 0{
ProfileBankViewController.profileConnectionTimeOutCheck = ProfileBankViewController.profileConnectionTimeOutCheck+1
self.popUpMessageError(value: 10, message: self.userinfoviewmodel!.getErrorMessage())
}
return
}
// self.labelSourceIncome.attributedText = self.getAttributedLabel(inputLabel: self.updatedString)
self.labelSourceIncome.attributedText = self.getAttributedLabel(inputLabel: self.selectedFundSource)
}
labelBankName.text = userinfoviewmodel!.getInfo().primaryBankName
labelAccountNumber.text = userinfoviewmodel!.getInfo().primaryAccountNumber
labelVerificationIDType.text = userinfoviewmodel!.getInfo().verificationIdType
labelVerificationIDNumber.text = userinfoviewmodel!.getInfo().verificationIdNumber
labelExpiryDate.text = unixTimeStampToDate(unixTimeStamp: userinfoviewmodel!.getInfo().expiryDate)
selectedFundSource = userinfoviewmodel!.getInfo().sourceOfFund
labelSourceIncome.attributedText = getAttributedLabel(inputLabel: selectedFundSource)
labelSourceIncome.isUserInteractionEnabled = true
labelSourceIncome.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(editDetail(tapGestureRecognizer:))))
}
/**
To set data in textfield which is selected from picker view
*/
func setUpTextField() {
if self.userinfoviewmodel!.getSourceFundList().count > 0 {
self.pickerData = self.userinfoviewmodel!.getSourceFundList()
selectedFundSouceIndex = pickerData.index(of: selectedFundSource)
self.editTextField.text = self.pickerData[selectedFundSouceIndex]
self.pickerView.dataSource = self
self.pickerView.delegate = self
pickerView.selectRow(selectedFundSouceIndex, inComponent: 0, animated: true)
self.editTextField.becomeFirstResponder()
}
}
/**
To dispaly image and Text in single label
- parameter String : sourcr of fund
- returns: NSMutableAttributedString
*/
func getAttributedLabel(inputLabel: String) -> NSMutableAttributedString {
let fullString: NSMutableAttributedString = NSMutableAttributedString(string: "")
// create our NSTextAttachment
let imageAttachment = NSTextAttachment()
imageAttachment.image = UIImage(named: "ic_profile_change_edit")
// wrap the attachment in its own attributed string so we can append it
let imageString = NSAttributedString(attachment: imageAttachment)
// add the NSTextAttachment wrapper to our full string, then add some more text.
fullString.append(imageString)
fullString.append(NSAttributedString(string: " "))
fullString.append(NSAttributedString(string: inputLabel))
return fullString
}
/**
To edit user Source of Fund.
*/
@objc func editDetail(tapGestureRecognizer: UITapGestureRecognizer) {
let title: String = "Source of Fund"
alertController = UIAlertController(title: "Edit " + title, message: nil, preferredStyle: .alert)
alertController.addTextField { (textField : UITextField!) -> Void in
textField.placeholder = "New value"
if Reachability.isConnectedToNetwork() == true{
textField.inputView = self.pickerView
self.editTextField = textField
self.editTextField.delegate = self
if self.userinfoviewmodel!.getSourceFundList().count > 0 {
self.setUpTextField()
} else {
self.userinfoviewmodel!.fetchCDDList(cddName: cddCode.SourceFund.rawValue, param: nil)
}
}
}
let confirmAction = UIAlertAction(title: "Confirm", style: .default, handler: {
alert -> Void in
let valueTextField = self.alertController.textFields![0] as UITextField
if valueTextField.text! != "" {
self.selectedFundSource = valueTextField.text!
self.showActivityIndicator(activityIndicator: self.activityIndicator)
self.disableUserInteractions()
self.userinfoviewmodel!.updateUserInfo(param: ["sourceOfFund": self.userinfoviewmodel!.getSourceFundID(index: self.selectedFundSouceIndex)])
} else {
self.popUpMessageError(value: 10, message: "No data provided")
}
})
let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: {
(action : UIAlertAction!) -> Void in
})
cancelAction.setValue(UIColor.black, forKey: "titleTextColor")
confirmAction.setValue(UIColor(hex:0xEC1C24), forKey: "titleTextColor")
alertController.addAction(cancelAction)
alertController.addAction(confirmAction)
if Reachability.isConnectedToNetwork() == true{
self.present(alertController, animated: true, completion: nil)
}else{
popUpMessage(value: 15)
}
}
}
extension ProfileBankViewController: UIPickerViewDataSource, UIPickerViewDelegate {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
editTextField!.text = pickerData[row]
selectedFundSouceIndex = row
}
}
extension ProfileBankViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return false
}
}

98
GMERemittance/Profile/ProfileDocumentViewController.swift

@ -1,98 +0,0 @@
//
// ProfileDocumentViewController.swift
// GMERemittance
//
// Created by Fm-user on 1/31/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class ProfileDocumentViewController: UIViewController {
@IBOutlet weak var imageViewIDFront: UIImageView!
@IBOutlet weak var imageViewIDBack: UIImageView!
@IBOutlet weak var imageViewPassbook: UIImageView!
@IBOutlet weak var imageViewPassport: UIImageView!
@IBOutlet weak var imageViewCloseUpSelfie: UIImageView!
var userinfoviewmodel: UserInfoViewModel?
override func viewDidLoad() {
super.viewDidLoad()
setUpNavBar(id: 201, title: "Profile")
guard userinfoviewmodel != nil else {
return
}
setUpAnotherLoginListener(genericviewmodel: userinfoviewmodel!)
userinfoviewmodel?.internetConnection.value = nil
/**
internet check
*/
userinfoviewmodel?.internetConnection.bind { [unowned self] in
guard $0 != nil else {
return
}
self.popUpMessage(value: 15)
}
guard userinfoviewmodel != nil else {
self.popUpMessageInfo(value: 16, title: "No Data Available", message: "Data not received")
return
}
downloadImage(id: 1, url: URL(string: (userinfoviewmodel?.getInfo().regIdcardFrontUrl)!)!)
downloadImage(id: 2, url: URL(string: (userinfoviewmodel?.getInfo().regIdcardBackUrl)!)!)
downloadImage(id: 3, url: URL(string: (userinfoviewmodel?.getInfo().passbookUrl)!)!)
downloadImage(id: 4, url: URL(string: (userinfoviewmodel?.getInfo().passportUrl)!)!)
if let url = userinfoviewmodel?.getInfo().selfieUrl{
downloadImage(id: 5, url: URL(string: url)!)
}
}
func getDataFromUrl(url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
URLSession.shared.dataTask(with: url) { data, response, error in
completion(data, response, error)
}.resume()
}
/**
To download the image throug api call
- parameter Int: type of image
- parameter url: url of image
*/
func downloadImage(id: Int, url: URL) {
getDataFromUrl(url: url) { data, response, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async() {
switch id {
case 1:
self.imageViewIDFront.image = UIImage(data: data)
case 2:
self.imageViewIDBack.image = UIImage(data: data)
case 3:
self.imageViewPassbook.image = UIImage(data: data)
case 4:
self.imageViewPassport.image = UIImage(data: data)
case 5:
self.imageViewCloseUpSelfie.image = UIImage(data: data)
default:
return
}
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

1856
GMERemittance/Profile/ProfileEdit.storyboard
File diff suppressed because it is too large
View File

435
GMERemittance/Profile/ProfileGeneralViewController.swift

@ -1,435 +0,0 @@
//
// ProfileEditViewController.swift
// GMERemittance
//
// Created by Fm-user on 1/9/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class ProfileGeneralViewController: UIViewController {
var userinfoviewmodel: UserInfoViewModel?
var alertController: UIAlertController!
private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
@IBOutlet weak var labelFirstName: UILabel!
@IBOutlet weak var labelMiddleName: UILabel!
@IBOutlet weak var labelLastName: UILabel!
@IBOutlet weak var labelNickName: UILabel!
@IBOutlet weak var labelGender: UILabel!
@IBOutlet weak var labelDOB: UILabel!
@IBOutlet weak var labelMobile: UILabel!
@IBOutlet weak var labelEmail: UILabel!
@IBOutlet weak var labelCountry: UILabel!
@IBOutlet weak var labelCountryNative: UILabel!
@IBOutlet weak var labelProvince: UILabel!
@IBOutlet weak var labelOccupation: UILabel!
private var indexTag: Int = 0
private var selectedOccupationIndex: Int = 0
private var selectedProvinceIndex: Int = 0
private var updatedString: String = ""
private var selectedOccupation: String!
private var selectedProvince: String!
let pickerView = UIPickerView()
var pickerData: [String] = [String]()
var editTextField: UITextField!
public static var profileGeneralConnectionTimeOutCheck = 0
@IBAction func goBack(_ sender: Any) {
navigationController?.popViewController(animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
setUpNavBar(id: 201, title: "Profile")
guard userinfoviewmodel != nil else {
self.popUpMessageInfo(value: 16, title: "No Data Available", message: "Data not received")
return
}
setUpAnotherLoginListener(genericviewmodel: userinfoviewmodel!)
userinfoviewmodel!.userDataAvailable.value = nil
userinfoviewmodel!.userOccupationProvinceAvailable.value = nil
userinfoviewmodel?.internetConnection.value = nil
userinfoviewmodel?.userConnectionTimeOut.value = nil
/**
connection timeout
*/
userinfoviewmodel?.userConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.enableUserInteractions()
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
if ProfileGeneralViewController.profileGeneralConnectionTimeOutCheck == 0{
ProfileGeneralViewController.profileGeneralConnectionTimeOutCheck = ProfileGeneralViewController.profileGeneralConnectionTimeOutCheck+1
self.popUpMessage(value: 34)
}
}
/**
Internet check
*/
userinfoviewmodel?.internetConnection.bind { [unowned self] in
guard $0 != nil else {
return
}
self.enableUserInteractions()
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
self.popUpMessage(value: 15)
}
/**
Update the view for Occupation and Province
*/
userinfoviewmodel!.userOccupationProvinceAvailable.bind { [unowned self] in
guard $0 != nil else {
return
}
if $0 == 0 {
self.popUpMessageError(value: 10, message: (self.userinfoviewmodel?.getErrorMessage())!)
} else {
if $0 == 3 {
self.setUpTextField(category: 3)
} else if $0 == 5 {
self.setUpTextField(category: 5)
} else if $0 == -1 {
if self.alertController != nil {
self.alertController.dismiss(animated: true, completion: nil)
}
}
}
}
/**
Update the view for User data
*/
userinfoviewmodel!.userDataAvailable.bind { [unowned self] in
guard $0 != nil else {
return
}
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
self.enableUserInteractions()
guard $0! else {
//self.popUpMessageError(value: 10, message: (self.userinfoviewmodel?.getErrorMessage())!)
return
}
switch self.indexTag {
case 1:
self.labelNickName.attributedText = self.getAttributedLabel(inputLabel: self.updatedString)
UserDefaults.standard.set(self.updatedString, forKey: "com.gmeremit.nickName") //Updating UserDefaults so that when the user goes back to HomeScreen, the changes are reflected
case 3:
self.labelProvince.attributedText = self.getAttributedLabel(inputLabel: self.pickerData[self.selectedProvinceIndex])
case 5:
self.labelOccupation.attributedText = self.getAttributedLabel(inputLabel: self.pickerData[self.selectedOccupationIndex])
default:
return
}
}
if let firstName = userinfoviewmodel!.getInfo().firstName {
labelFirstName.text = firstName
}
if let lastName = userinfoviewmodel!.getInfo().lastName {
labelLastName.text = lastName
}
if let middleName = userinfoviewmodel!.getInfo().middleName {
labelMiddleName.text = middleName
} else {
labelMiddleName.text = "-"
}
if let gender = userinfoviewmodel!.getInfo().gender{
labelGender.text = gender
}
if let dob = userinfoviewmodel!.getInfo().dateOfBirth {
labelDOB.text = unixTimeStampToDate(unixTimeStamp:dob )
}
if let mobileNumber = userinfoviewmodel!.getInfo().mobileNumber {
labelMobile.text = mobileNumber
}
if let email = userinfoviewmodel!.getInfo().email{
labelEmail.text = email
}
if let nativeCountry = userinfoviewmodel!.getInfo().nativeCountry{
labelCountryNative.text = nativeCountry
}
if let country = userinfoviewmodel!.getInfo().country{
labelCountry.text = country
}
if let nickName = userinfoviewmodel!.getInfo().nickName {
labelNickName.attributedText = getAttributedLabel(inputLabel: nickName)
} else {
labelNickName.attributedText = getAttributedLabel(inputLabel: "")
}
if let occupation = userinfoviewmodel!.getInfo().occupation{
selectedOccupation = occupation
labelOccupation.attributedText = getAttributedLabel(inputLabel: selectedOccupation)
}
if let province = userinfoviewmodel!.getInfo().province{
selectedProvince = province
labelProvince.attributedText = getAttributedLabel(inputLabel: selectedProvince)
}
labelNickName.isUserInteractionEnabled = true
labelProvince.isUserInteractionEnabled = true
labelOccupation.isUserInteractionEnabled = true
labelNickName.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(editDetail(tapGestureRecognizer:))))
labelProvince.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(editDetail(tapGestureRecognizer:))))
labelOccupation.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(editDetail(tapGestureRecognizer:))))
}
/**
Picker view data list
- parameter Integer:
- parameter: 5 for Occupation list
- parameter: 3 for Province list
*/
func setUpTextField(category: Int) {
if category == 5 {
if let userinfoModelCount = self.userinfoviewmodel?.getOccupationList().count{
if userinfoModelCount > 0{
self.pickerData = (self.userinfoviewmodel?.getOccupationList())!
if let selectedOccupationIndex = self.pickerData.index(of: selectedOccupation) {
self.editTextField.text = self.pickerData[selectedOccupationIndex]
self.pickerView.dataSource = self
self.pickerView.delegate = self
pickerView.selectRow(selectedOccupationIndex, inComponent: 0, animated: true)
}
}
}
} else if category == 3 {
if let provinceCount = self.userinfoviewmodel?.getProvinceList().count {
if provinceCount > 0 {
self.pickerData = self.userinfoviewmodel!.getProvinceList()
if let selectedProvinceIndex = self.pickerData.index(of: selectedProvince) {
self.editTextField.text = self.pickerData[selectedProvinceIndex]
self.pickerView.dataSource = self
self.pickerView.delegate = self
pickerView.selectRow(selectedProvinceIndex, inComponent: 0, animated: true)
}
}
}
}
self.editTextField.becomeFirstResponder()
}
/**
To dispaly image and Text in single label
- parameter String : Occupation or Province
- returns: NSMutableAttributedString
*/
func getAttributedLabel(inputLabel: String) -> NSMutableAttributedString {
let fullString: NSMutableAttributedString = NSMutableAttributedString(string: "")
// create our NSTextAttachment
let imageAttachment = NSTextAttachment()
imageAttachment.image = UIImage(named: "ic_profile_change_edit")
// wrap the attachment in its own attributed string so we can append it
let imageString = NSAttributedString(attachment: imageAttachment)
// add the NSTextAttachment wrapper to our full string, then add some more text.
fullString.append(imageString)
fullString.append(NSAttributedString(string: " "))
fullString.append(NSAttributedString(string: inputLabel))
return fullString
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
/**
To edit user nick name, 0ccupation and province
*/
@objc func editDetail(tapGestureRecognizer: UITapGestureRecognizer) {
let tappedLabel:UILabel = (tapGestureRecognizer.view as! UILabel) // Type cast it with the class for which you have added gesture
var title: String = ""
switch tappedLabel.tag {
case 1:
indexTag = 1
title = "Nick Name"
case 3:
indexTag = 3
title = "Province"
if self.userinfoviewmodel!.getProvinceList().count > 0 {
self.pickerData = self.userinfoviewmodel!.getProvinceList()
} else {
pickerData = self.userinfoviewmodel!.getEmptyData()
self.userinfoviewmodel!.fetchCDDList(cddName: cddCode.Province.rawValue, param: ["countryId": "118"])
}
case 5:
indexTag = 5
title = "Occupation"
if Reachability.isConnectedToNetwork() == true{
if self.userinfoviewmodel!.getOccupationList().count > 0 {
self.pickerData = self.userinfoviewmodel!.getOccupationList()
} else {
pickerData = self.userinfoviewmodel!.getEmptyData()
self.userinfoviewmodel!.fetchCDDList(cddName: cddCode.Occupation.rawValue, param: nil)
}
}
default:
title = ""
}
alertController = UIAlertController(title: "Edit " + title, message: nil, preferredStyle: .alert)
alertController.addTextField { (textField : UITextField!) -> Void in
textField.placeholder = "New value"
if self.indexTag == 5 {
if Reachability.isConnectedToNetwork() == true{
textField.inputView = self.pickerView
self.editTextField = textField
self.editTextField.delegate = self
if self.userinfoviewmodel!.getOccupationList().count > 0 {
self.setUpTextField(category: self.indexTag)
}
}
} else if self.indexTag == 3 {
textField.inputView = self.pickerView
self.editTextField = textField
self.editTextField.delegate = self
if self.userinfoviewmodel!.getProvinceList().count > 0 {
self.setUpTextField(category: self.indexTag)
}
} else {
textField.tag = 51 //unique identifier set
textField.delegate = self
}
}
let confirmAction = UIAlertAction(title: "Confirm", style: .default, handler: {
alert -> Void in
let valueTextField = self.alertController.textFields![0] as UITextField
let trimmedString = valueTextField.text?.removeSpacesTrailingPreceding()
if trimmedString != "" {
self.updatedString = trimmedString!
self.showActivityIndicator(activityIndicator: self.activityIndicator)
self.disableUserInteractions()
switch tappedLabel.tag {
case 1:
self.userinfoviewmodel!.updateUserInfo(param: ["nickName": trimmedString!])
case 3:
self.userinfoviewmodel!.updateUserInfo(param: ["provinceId": self.userinfoviewmodel!.getProvinceID(index: self.selectedProvinceIndex)])
case 5:
self.userinfoviewmodel!.updateUserInfo(param: ["occupation": self.userinfoviewmodel!.getOccupationID(index: self.selectedOccupationIndex)])
default:
return
}
} else {
self.popUpMessageError(value: 10, message: "No data provided")
//self.present(self.prepareAlert(title: "No updates done", message: "No data supplied"), animated: true, completion: nil )
}
})
let cancelAction = UIAlertAction(title: "Cancel", style: .destructive, handler: {
(action : UIAlertAction!) -> Void in
})
cancelAction.setValue(UIColor.black, forKey: "titleTextColor")
confirmAction.setValue(UIColor(hex:0xEC1C24), forKey: "titleTextColor")
alertController.addAction(cancelAction)
alertController.addAction(confirmAction)
if Reachability.isConnectedToNetwork() == true{
self.present(alertController, animated: true, completion: nil)
}else{
popUpMessage(value: 15)
}
}
}
extension ProfileGeneralViewController: UIPickerViewDataSource, UIPickerViewDelegate {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
editTextField!.text = pickerData[row]
if indexTag == 5 {
selectedOccupation = pickerData[row]
selectedOccupationIndex = row
} else if indexTag == 3 {
selectedProvince = pickerData[row]
selectedProvinceIndex = row
}
}
}
extension ProfileGeneralViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if self.indexTag == 3 || self.indexTag == 5 {
return false
}
return true
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField.tag == 51 {
textField.tag = 0
return false
}
return true
}
}

34
GMERemittance/Profile/ProfileModel.swift

@ -1,34 +0,0 @@
//
// UserProfileModel.swift
// GMERemittance
//
// Created by FMI-12 on 1/29/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
struct ProfileModel: Decodable {
var userId:String!
var firstName:String!
var middleName:String?
var nickName:String!
var lastName:String!
var mobileNumber:String!
var email:String?
var verificationCode:String?
// var verificationCodeExpiryDate:String?
var createdDate:String?
//var forgetCode:String?
//var forgetCodeExpiryDate:String?
//var userRoles:String?
var primaryBankName: String!
var isActive:Bool?
//var hasKyc:Bool?
var kyc: Bool!
var verified:Bool!
var walletNumber:String?
var availableBalance:String?
var dpUrl:String?
var rewardPoint: String?
}

266
GMERemittance/Profile/ProfileViewModel.swift

@ -1,266 +0,0 @@
//
// ProfileViewModel.swift
// GMERemittance
//
// Created by FMI-12 on 1/29/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class ProfileViewModel: ModelExtension {
var userDataAvailable:Box<Bool?> = Box(nil)
var imageSubmitted:Box<Bool?> = Box(nil)
var profileConnectionTimeOut: Box<Bool?> = Box(nil)
var availableBalance: String?
var rewardPoint: String?
var walletNumber: String?
private var profileInfo: ProfileModel!
private var user_id: String!
private var userImageDocUrl: String?
/**
Api request for user Information
- parameter String: UserId
*/
func fetchUserInfo(userId: String?) {
if userId == nil {
user_id = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
} else {
user_id = userId!
}
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.getUserDetails(userId: self.user_id) { result in
switch result {
case let .success(userJSON):
do {
self.profileInfo = try JSONDecoder().decode(ProfileModel.self, from: userJSON.rawData())
if userId == nil {
self.availableBalance = userJSON["availableBalance"].stringValue
self.rewardPoint = userJSON["rewardPoint"].stringValue
self.walletNumber = userJSON["walletNumber"].stringValue
}
self.userDataAvailable.value = true
} catch {
self.userDataAvailable.value = false
}
case let .failure(errorJSON):
self.setErrorMessage(message: "Update Failed:" + errorJSON["message"].stringValue)
self.userDataAvailable.value = false
case .updateAccessCode:
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
result in
if result != "Error"{
let uuid = RestApiMananger.sharedInstance.getUUID()
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
self.fetchUserInfo(userId: userId)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.profileConnectionTimeOut.value = false
}
}
}
}
/**
Submit the Image provided
- parameter docType: type of document
- parameter imageBase64 data
*/
func provideImageForSubmission(docType: String, imageBase64: String) {
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
let docParam = ["documentType": docType, "file": imageBase64]
RestApiMananger.sharedInstance.submitDocument(param: docParam, userId: self.user_id!) { result in
switch result {
case let .success(imageJSON):
if let docUrl = imageJSON["documentUrl"].rawString() {
self.updateUserInfo(param: ["dpUrl": docUrl])
} else {
self.setErrorMessage(message:"No image URL generated")
self.imageSubmitted.value = false
}
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.imageSubmitted.value = false
case .updateAccessCode:
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
result in
if result != "Error"{
let uuid = RestApiMananger.sharedInstance.getUUID()
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
self.provideImageForSubmission(docType: docType, imageBase64: imageBase64)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.profileConnectionTimeOut.value = false
}
}
}
}
/**
Api request to update user information
- parameter param: User information is in Dictionary
*/
func updateUserInfo(param: [String: String]) {
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.updateUserDetail (userId: user_id, param: param) { result in
switch result {
case let .success(fetchedJSON):
UserDefaults.standard.set(fetchedJSON["dpUrl"].stringValue, forKey: "com.gmeremit.dpUrl")
self.imageSubmitted.value = true
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.imageSubmitted.value = false
case .updateAccessCode:
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
result in
if result != "Error"{
let uuid = RestApiMananger.sharedInstance.getUUID()
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
self.updateUserInfo(param: param)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.profileConnectionTimeOut.value = false
}
}
}
}
/**
to get proile info
- returns: profile Info
*/
func getProfileModel() -> ProfileModel {
return profileInfo
}
/**
To get full name
- returns: Full name
*/
func getFullName() -> String {
if profileInfo.middleName == nil {
return profileInfo.firstName + " " + profileInfo.lastName
} else {
return profileInfo.firstName + " " + profileInfo.middleName! + " " + profileInfo.lastName
}
}
/**
To get user balance
- returns: Amount
*/
func getAvailableBalance() -> String {
if let balance = availableBalance {
return balance
}
return "N/A"
}
/**
To get user email
- returns: email
*/
func getEmail() -> String {
if let email = profileInfo.email {
return email
}
return "Email: N/A"
}
/**
To get user Phone nos.
- returns: Phone nos.
*/
func getPhone() -> String {
if let phone = profileInfo.mobileNumber {
return phone
}
return "Phone: N/A"
}
/**
To get user wallet Nos.
- returns: wallet Nos.
*/
func getWalletNumber() -> String {
if let walletNum = walletNumber {
return walletNum
}
return "Wallet Number: N/A"
}
/**
To get user bank name
- returns: bank name
*/
func getBankName() -> String {
if let bankName = profileInfo.primaryBankName {
return bankName
}
return "Primary Bank: N/A"
}
//Added to determine if the user has filled kyc form
func hasFilledKYC() -> Bool {
if profileInfo.kyc {
return true
}
return false
}
/// To deteemine verified account
func isVerified() -> Bool {
if profileInfo.verified! {
return true
}
return false
}
/**
To get user reward point
- returns: points
*/
func getRewardPoint() -> String {
if let points = rewardPoint {
return points
}
return "N/A"
}
}

103
GMERemittance/Profile/UserInfoViewController.swift

@ -1,103 +0,0 @@
//
// ProfileAccountViewController.swift
// GMERemittance
//
// Created by FMI-12 on 1/29/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class UserInfoViewController: UIViewController {
private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
private var userinfoviewmodel = UserInfoViewModel()
private var count = 0
public static var profileEditConnectionTimeOutCheck = 0
override func viewDidAppear(_ animated: Bool) {
setUpAnotherLoginListener(genericviewmodel: userinfoviewmodel)
showActivityIndicator(activityIndicator: activityIndicator)
disableUserInteractions()
userinfoviewmodel.userConnectionTimeOut.value = nil
/**
connection timeout
*/
userinfoviewmodel.userConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.enableUserInteractions()
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
if UserInfoViewController.profileEditConnectionTimeOutCheck == 0{
UserInfoViewController.profileEditConnectionTimeOutCheck = UserInfoViewController.profileEditConnectionTimeOutCheck+1
self.popUpMessage(value: 39)
}
}
userinfoviewmodel.internetConnection.bind { [unowned self] in
guard $0 != nil else {
return
}
self.enableUserInteractions()
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
if self.count == 0{
self.popUpMessage(value: 15)
}
self.count = self.count+1
}
userinfoviewmodel.userDataAvailable.bind { [weak self] in
guard $0 != nil else {
return
}
self?.dismissActivityIndicator(activityIndicator: (self?.activityIndicator)!)
self?.enableUserInteractions()
guard $0! else {
if UserInfoViewController.profileEditConnectionTimeOutCheck == 0{
UserInfoViewController.profileEditConnectionTimeOutCheck = UserInfoViewController.profileEditConnectionTimeOutCheck+1
self?.popUpMessageError(value: 10, message: (self?.userinfoviewmodel.getErrorMessage())!)
}
return
}
if UserDefaults.standard.object(forKey: "com.gmeremit.address") as? String == nil {
UserDefaults.standard.set(self?.userinfoviewmodel.getAddress(), forKey: "com.gmeremit.address")
}
}
userinfoviewmodel.fetchUserInfo()
}
override func viewDidLoad() {
super.viewDidLoad()
setUpNavBar(id: 201, title: "Profile")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "profileUserGeneral") {
let nextViewController = segue.destination as! ProfileGeneralViewController
if (self.userinfoviewmodel.getInfo().firstName) != nil{
nextViewController.userinfoviewmodel = self.userinfoviewmodel
}
} else if (segue.identifier == "profileUserDocument") {
let nextViewController = segue.destination as! ProfileDocumentViewController
if (self.userinfoviewmodel.getInfo().firstName) != nil{
nextViewController.userinfoviewmodel = self.userinfoviewmodel
}
} else if (segue.identifier == "profileUserBank") {
let nextViewController = segue.destination as! ProfileBankViewController
if (self.userinfoviewmodel.getInfo().firstName) != nil{
nextViewController.userinfoviewmodel = self.userinfoviewmodel
}
}
}
}

294
GMERemittance/Profile/UserInfoViewModel.swift

@ -1,294 +0,0 @@
//
// UserInfoViewModel.swift
// GMERemittance
//
// Created by FMI-12 on 1/30/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class UserInfoViewModel: ModelExtension {
var userDataAvailable:Box<Bool?> = Box(nil)
var userOccupationProvinceAvailable:Box<Int?> = Box(nil) // -1 = handle keypad when user is auto logout, 0 = Error, 5 = Occupation, 3 = Province
var userSourceFundAvailable:Box<Bool?> = Box(nil)
var userConnectionTimeOut: Box<Bool?> = Box(nil)
private var cddOccupationList: [String] = [String] ()
private var cddOccupationValueList: [String] = [String] ()
private var cddSourceFundList: [String] = [String] ()
private var cddSourceFundValueList: [String] = [String] ()
private var cddProvinceList: [String] = [String] ()
private var cddProvinceValueList: [String] = [String] ()
private var userInfo = KYCModel()
let user_id = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
/**
APi request for user information
*/
func fetchUserInfo() {
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.fetchUserInfoFromKyc(userId: user_id!) { result in
switch result {
case let .success(fetchedJSON):
guard fetchedJSON.count > 0 else {
self.userDataAvailable.value = false
return
}
do {
self.userInfo = try JSONDecoder().decode(KYCModel.self, from: fetchedJSON.rawData())
self.userDataAvailable.value = true
} catch {
self.userDataAvailable.value = false
}
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.userDataAvailable.value = false
case .updateAccessCode:
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
result in
if result != "Error"{
let uuid = RestApiMananger.sharedInstance.getUUID()
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
self.fetchUserInfo()
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.userConnectionTimeOut.value = false
}
}
}
}
/**
APi Request to update userINfo
- parameter param: user info in Dictionary
*/
func updateUserInfo(param: [String: String]) {
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.updateUserInfoForKyc(userId: getUserId(), parameter: param) { result in
switch result {
case .success(_):
self.userDataAvailable.value = true
self.userDataAvailable.value = nil
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.userDataAvailable.value = false
self.userDataAvailable.value = nil
case .updateAccessCode:
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
result in
if result != "Error"{
let uuid = RestApiMananger.sharedInstance.getUUID()
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
self.updateUserInfo(param: param)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.userConnectionTimeOut.value = false
}
}
}
}
/**
Api request for CddList value
- parameter cddName: Type of cddName
- parameter param: [:]
*/
func fetchCDDList(cddName: String, param: [String: String]?) {
let cdd_name = cddName
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.getCDDListFor(cddCode: cddName, param: param) { result in
switch result {
case let .success(cddJSON):
switch cddName {
case cddCode.Occupation.rawValue:
self.cddOccupationList.removeAll()
self.cddOccupationValueList.removeAll()
case cddCode.SourceFund.rawValue:
self.cddSourceFundList.removeAll()
self.cddSourceFundValueList.removeAll()
case cddCode.Province.rawValue:
self.cddProvinceList.removeAll()
self.cddProvinceValueList.removeAll()
default:
return
}
if cddJSON.count > 0 {
for i in 0 ... (cddJSON.count-1) {
do {
let cddNameValuePair = try JSONDecoder().decode(Cdd.self, from: cddJSON[i].rawData())
switch cddName {
case cddCode.Occupation.rawValue:
self.cddOccupationList.append(cddNameValuePair.name)
self.cddOccupationValueList.append(cddNameValuePair.value)
case cddCode.SourceFund.rawValue:
self.cddSourceFundList.append(cddNameValuePair.name)
self.cddSourceFundValueList.append(cddNameValuePair.value)
case cddCode.Province.rawValue:
self.cddProvinceList.append(cddNameValuePair.name)
self.cddProvinceValueList.append(cddNameValuePair.value)
default:
return
}
} catch {
switch cddName {
case cddCode.Occupation.rawValue:
self.userOccupationProvinceAvailable.value = 0
case cddCode.SourceFund.rawValue:
self.userSourceFundAvailable.value = false
default:
return
}
break
}
}
}
switch cddName {
case cddCode.Occupation.rawValue:
self.userOccupationProvinceAvailable.value = 5
case cddCode.Province.rawValue:
self.userOccupationProvinceAvailable.value = 3
case cddCode.SourceFund.rawValue:
self.userSourceFundAvailable.value = true
default:
return
}
case .failure(_):
switch cddName {
case cddCode.Occupation.rawValue:
self.userOccupationProvinceAvailable.value = 0
case cddCode.SourceFund.rawValue:
self.userSourceFundAvailable.value = false
default:
return
}
return
case .updateAccessCode:
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
result in
if result != "Error"{
let uuid = RestApiMananger.sharedInstance.getUUID()
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
self.fetchCDDList(cddName: cdd_name, param: param)
}
}
case .logOutUser():
self.userOccupationProvinceAvailable.value = -1
self.userSourceFundAvailable.value = nil
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.userConnectionTimeOut.value = false
}
}
}
}
/**
To get occupation List
- returns: occupation list
*/
func getOccupationList() -> [String] {
return cddOccupationList
}
/**
- parameter index: position of occupation in an array
- returns: occupation
*/
func getOccupationID(index: Int) -> String {
return cddOccupationValueList[index]
}
/**
To get province List
- returns: privince list
*/
func getProvinceList() -> [String] {
return cddProvinceList
}
/**
- parameter index: position of province in an array
- returns: province
*/
func getProvinceID(index: Int) -> String {
return cddProvinceValueList[index]
}
/**
To get source fund List
- returns: source fund list
*/
func getSourceFundList() -> [String] {
return cddSourceFundList
}
/**
- parameter index: position of source fund in an array
- returns: source fund
*/
func getSourceFundID(index: Int) -> String {
return cddSourceFundValueList[index]
}
/**
To get user info
- returns: user info
*/
func getInfo() -> KYCModel {
return userInfo
}
/**
To get address
- returns: address
*/
func getAddress() -> String {
return ""// userInfo.address + ", " + userInfo.city
}
/**
To get data array
- returns: empty array
*/
func getEmptyData() -> [String] {
return [String]()
}
}

31
GMERemittance/Profile/UserTemp.swift

@ -1,31 +0,0 @@
//
// UserTemp.swift
// GMERemittance
//
// Created by FMI-12 on 1/30/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
struct UserTemp: Codable {
var fullName: String!
var gender: String!
var dateOfBirth: String!
var mobileNumber: String!
var email: String?
var nativeCountry: String!
var country: String!
var city: String!
var address: String!
var occupation: String!
var primaryBankName: String!
var primaryAccountNumber: String!
var verificationIdType: String!
var verificationIdNumber: String!
var expiryDate: String!
var regIdcardFrontUrl: String?
var regIdcardBackUrl: String?
var passbookUrl: String?
var passportUrl: String?
}

183
GMERemittance/Profile/WithdrawViewController.swift

@ -1,183 +0,0 @@
//
// WithdrawViewController.swift
// GMERemittance
//
// Created by Fm-user on 1/12/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class WithdrawViewController: UIViewController {
@IBOutlet weak var textViewWithdraw: UITextView!
@IBOutlet weak var textFieldAmount: UITextField!
private var withdrawviewmodel = WithdrawViewModel()
private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
override func viewDidLoad() {
super.viewDidLoad()
setUpNavBar(id: 201, title: "Withdraw")
setUpAnotherLoginListener(genericviewmodel: withdrawviewmodel)
hideKeyboardWhenTappedAround()
// Do any additional setup after loading the view.
textViewWithdraw.delegate = self
textViewWithdraw.text = "Reason for withdraw"
textViewWithdraw.textColor = UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0)
withdrawviewmodel.withdrawConnectionTimeOut.value = nil
/**
connection timeout
*/
withdrawviewmodel.withdrawConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.enableUserInteractions()
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
self.popUpMessage(value: 20)
}
withdrawviewmodel.internetConnection.value = nil
/**
internet check
*/
withdrawviewmodel.internetConnection.bind { [unowned self] in
guard $0 != nil else {
return
}
self.enableUserInteractions()
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
self.popUpMessage(value: 15)
}
/**
Update the for send and withdraw request
*/
withdrawviewmodel.requestProcessed.bind { [unowned self] in
guard $0 != nil else {
return
}
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
self.enableUserInteractions()
guard $0! else {
self.popUpMessageError(value: 10, message: self.withdrawviewmodel.getErrorMessage())
return
}
guard let navController = self.navigationController else {
return
}
if let popUpViewController = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "popUpInfo") as? PopUpGeneralInfo {
popUpViewController.indexValue = 3
navController.addChildViewController(popUpViewController)
popUpViewController.view.frame = navController.view.bounds
navController.view.addSubview(popUpViewController.view)
popUpViewController.didMove(toParentViewController: navController)
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func submitWithdrawRequest(_ sender: Any) {
withdrawviewmodel.setParam(amount: textFieldAmount.text!, reason: textViewWithdraw.text)
switch withdrawviewmodel.validateAmountandReason() {
case .Valid:
confirmRequest()
case .InValid(let error):
self.popUpMessageError(value: 11, message: error)
}
}
/**
Conforming for request
*/
func confirmRequest() {
let alertController = UIAlertController(title: "Enter your login password", message: nil, preferredStyle: .alert)
alertController.addTextField { (textField : UITextField!) -> Void in
textField.placeholder = "Password"
textField.isSecureTextEntry = true
textField.tag = 51
textField.delegate = self
}
let confirmAction = UIAlertAction(title: "Confirm", style: .default, handler: {
alert -> Void in
let valueTextField = alertController.textFields![0] as UITextField
if valueTextField.text != "" {
self.disableUserInteractions()
self.showActivityIndicator(activityIndicator: self.activityIndicator)
self.withdrawviewmodel.sendWithdrawRequest(password: valueTextField.text!)
} else {
self.popUpMessageError(value: 11, message: "Password was missing")
}
})
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
(action : UIAlertAction!) -> Void in
})
cancelAction.setValue(UIColor.black, forKey: "titleTextColor")
confirmAction.setValue(UIColor(hex:0xEC1C24), forKey: "titleTextColor")
alertController.addAction(cancelAction)
alertController.addAction(confirmAction)
self.present(alertController, animated: true, completion: nil)
}
}
extension WithdrawViewController: UITextViewDelegate {
func textViewDidBeginEditing(_ textViewWithdraw: UITextView) {
if textViewWithdraw.textColor == UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0) {
textViewWithdraw.text = nil
textViewWithdraw.textColor = UIColor(red:0.29, green:0.29, blue:0.29, alpha:1.0)
}
}
func textViewDidEndEditing(_ textViewWithdraw: UITextView) {
if textViewWithdraw.text.isEmpty {
textViewWithdraw.text = "Reason for withdraw"
textViewWithdraw.textColor = UIColor(red:0.78, green:0.78, blue:0.80, alpha:1.0)
}
}
}
extension WithdrawViewController: UITextFieldDelegate {
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField.tag == 51 {
textField.tag = 0
return false
}
return true
}
}

79
GMERemittance/Profile/WithdrawViewModel.swift

@ -1,79 +0,0 @@
//
// WithdrawViewModel.swift
// GMERemittance
//
// Created by Sujal on 2/13/18.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class WithdrawViewModel: ModelExtension {
var amount: String!
var reason: String!
var requestProcessed: Box<Bool?> = Box(nil)
var withdrawConnectionTimeOut: Box<Bool?> = Box(nil)
let user_id = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
/**
To check validation for withdraw
*/
func validateAmountandReason() -> isValid {
if amount.isBlank || reason.isBlank || reason == "Reason for withdraw" {
return .InValid("Please fill all the fields")
}
return .Valid
}
/**
To set amount and reason
- parametet amount: withdraw amount
- parameter reason: reason for withdraw
*/
func setParam(amount: String, reason: String) {
self.amount = amount.removeSpacesTrailingPreceding()
self.reason = reason.removeSpacesTrailingPreceding()
}
/**
To request for withdraw
- parametet password: to comfirm with request user should type account password
*/
func sendWithdrawRequest(password: String) {
let passwordLocal = password
let userId = UserDefaults.standard.object(forKey: "com.gmeremit.username") as? String
let params: [String: String] = ["userId": userId!, "amount": amount, "reason": reason, "txnpassword": password]
if !Reachability.isConnectedToNetwork() {
self.internetConnection.value = false
} else {
RestApiMananger.sharedInstance.withdrawBalance(requestDetails: params) { result in
switch result {
case .success(_):
self.requestProcessed.value = true
case let .failure(errorJSON):
self.setErrorMessage(message: errorJSON["message"].stringValue)
self.requestProcessed.value = false
case .updateAccessCode:
RestApiMananger.sharedInstance.updateAccessCode(userId: self.user_id!, password: self.getLoginPassword()) {
result in
if result != "Error"{
let uuid = RestApiMananger.sharedInstance.getUUID()
UserDefaults.standard.set((result + ":" + uuid).toBase64(), forKey: "com.gmeremit.accessCode")
self.sendWithdrawRequest(password: passwordLocal)
}
}
case .logOutUser():
RestApiMananger.sharedInstance.cancelExistingNetworkCalls()
self.anotherLogin.value = true
case .timeOut:
self.withdrawConnectionTimeOut.value = false
}
}
}
}
}

6
GMERemittance/SideMenu/SettingViewController.swift

@ -25,12 +25,6 @@ class SettingViewController: UIViewController {
self.navigationItem.title = ""
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
/**
Redirect to change password view
*/
@IBAction func redirectToChangePassword(_ sender: Any) {
let storyboard = UIStoryboard.init(name: "Profile", bundle: Bundle.main)
if let changePasswordViewController = storyboard.instantiateViewController(withIdentifier: "changePassword") as? ProfileChangePasswordViewController {

6
GMERemittance/SideMenu/SideMenuViewController.swift

@ -97,9 +97,9 @@ class SideMenuViewController: UIViewController {
@IBAction func withDraw(_ sender: Any) {
let storyboard = UIStoryboard.init(name: "Profile", bundle: Bundle.main)
if let withDrawViewController = storyboard.instantiateViewController(withIdentifier: "withdraw") as? WithdrawViewController {
self.navigationController!.pushViewController(withDrawViewController, animated: true)
}
// if let withDrawViewController = storyboard.instantiateViewController(withIdentifier: "withdraw") as? WithdrawViewController {
// self.navigationController!.pushViewController(withDrawViewController, animated: true)
// }
}

4
GMERemittance/Social/MyStoryViewController.swift

@ -883,8 +883,8 @@ class MyStoryViewController: UIViewController, UITableViewDelegate, UITableViewD
case "showMoreOptions2"?:
let homeViewController = segue.destination as! _HomeViewController
homeViewController.numberCellsInCollectionView = 6
homeViewController.showAllCollectionViewCells = true
// homeViewController.numberCellsInCollectionView = 6
// homeViewController.showAllCollectionViewCells = true
default:
return

762
GMERemittance/Wallet/WalletViewController.swift

@ -24,7 +24,7 @@ class WalletViewController: UIViewController, UIScrollViewDelegate {
private var activeTextField: UITextField?
private var walletviewmodel = WalletViewModel()
private var profileviewmodel = ProfileViewModel()
// private var profileviewmodel = ProfileViewModel()
private var tracktransactionviewmodel = TrackTransactionViewModel()
public var transaction: Transaction?
private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
@ -46,395 +46,395 @@ class WalletViewController: UIViewController, UIScrollViewDelegate {
setUpAnotherLoginListener(genericviewmodel: walletviewmodel)
setUpAnotherLoginListener(genericviewmodel: tracktransactionviewmodel)
setUpAnotherLoginListener(genericviewmodel: profileviewmodel)
// setUpAnotherLoginListener(genericviewmodel: profileviewmodel)
profileviewmodel.profileConnectionTimeOut.value = nil
// profileviewmodel.profileConnectionTimeOut.value = nil
/**
connection timeout
*/
profileviewmodel.profileConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessage(value: 31)
}
}
tracktransactionviewmodel.transactionListConnectionTimeOut.value = nil
/**
connection timeout
*/
tracktransactionviewmodel.transactionListConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessage(value: 31)
}
}
walletviewmodel.walletConnectionTimeOut.value = nil
// profileviewmodel.profileConnectionTimeOut.bind { [unowned self] in
// guard $0 != nil else {
// return
// }
// self.stopLoading()
// if WalletViewController.walletConnectionTimeOutCheck == 0{
// WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
// self.popUpMessage(value: 31)
// }
// }
//
// tracktransactionviewmodel.transactionListConnectionTimeOut.value = nil
/**
connection timeout
*/
walletviewmodel.walletConnectionTimeOut.bind { [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessage(value: 31)
}
}
setUpNetworkListener()
setUpNetworkListenerForProfile()
setUpProfileListener()
setUpTransactionListener()
setUpWalletDetailsListener()
/*so that the value is reset and no error message is seen when going back and froth in error case*/
self.walletviewmodel.walletActionPerformed.value = nil
self.buttonMoneyRequestCount.setTitle("", for: .normal)
self.buttonMoneyRequestCount.isUserInteractionEnabled = false
tracktransactionviewmodel.fetchTransactionListForTrackAndWallet(recipientId: "", recipientName: "", transactionType: "moneyRequest", startDate: nil, endDate: nil, txPage: nil, txSize: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
setUpNavBar(id: 201, title: "Wallet to Wallet Transfer")
NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)
registerTapListener()
self.startLoading()
walletviewmodel.getTransactionInfo()
// tracktransactionviewmodel.transactionListConnectionTimeOut.bind { [unowned self] in
// guard $0 != nil else {
// return
// }
// self.stopLoading()
// if WalletViewController.walletConnectionTimeOutCheck == 0{
// WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
// self.popUpMessage(value: 31)
// }
// }
scrollView.delegate = self
scrollView.addSubview(contentView)
scrollView.contentSize = CGSize(width: 2000, height:2000)
if transaction != nil {
moneyRequestAccepted = true
segmentedControl.isUserInteractionEnabled = false
walletviewmodel.setMode(segmentIndex: 2)
walletviewmodel.setMoneyRequestTransactionID(id: transaction!.transactionId)
textFieldID.text = transaction!.receiverId
textFieldAmount.text = transaction!.payoutAmountOriginal
textFieldID.isUserInteractionEnabled = false
}
textFieldID.delegate = self
textFieldAmount.delegate = self
textFieldMessage.delegate = self
segmentedControl.selectedSegmentIndex = 0
segmentedControl.addTarget(self, action: #selector(modeChanged(_:)), for: .valueChanged)
walletviewmodel.setMode(segmentIndex: 0)
}
/**
Disable user interaction while fetching data from api
*/
func startLoading(){
self.showActivityIndicator(activityIndicator: self.activityIndicator)
self.disableUserInteractions()
}
/**
Enable user interaction while fetching data from api
*/
func stopLoading(){
self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
self.enableUserInteractions()
}
/**
Check internet connection
*/
func setUpNetworkListener() {
walletviewmodel.internetConnection.bind { [unowned self] in
guard $0 != nil else {
return
}
self.walletviewmodel.internetConnection.value = nil
self.stopLoading()
self.popUpMessage(value: 15)
}
}
func setUpNetworkListenerForProfile() {
profileviewmodel.internetConnection.bind { [unowned self] in
guard $0 != nil else {
return
}
self.profileviewmodel.internetConnection.value = nil
self.stopLoading()
self.popUpMessage(value: 15)
}
}
/**
Set GMEUser name
*/
func setUpProfileListener() {
profileviewmodel.userDataAvailable.bind { [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
if !($0!) {
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessageError(value: 10, message: self.profileviewmodel.getErrorMessage())
}
} else {
if !self.profileviewmodel.hasFilledKYC() {
self.popUpMessageError(value: 11, message: "User has not filled KYC form")
} else {
self.walletviewmodel.setGMEUsername(fullName: self.profileviewmodel.getFullName())
self.performSegue(withIdentifier: "walletReview", sender: nil)
}
}
self.profileviewmodel.userDataAvailable.value = nil
}
}
// walletviewmodel.walletConnectionTimeOut.value = nil
// /**
// connection timeout
// */
// walletviewmodel.walletConnectionTimeOut.bind { [unowned self] in
// guard $0 != nil else {
// return
// }
// self.stopLoading()
// if WalletViewController.walletConnectionTimeOutCheck == 0{
// WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
// self.popUpMessage(value: 31)
// }
// }
/**
Update the view with the transaction count
*/
func setUpTransactionListener() {
tracktransactionviewmodel.transactionListObtained.bind{ [weak self] in
guard $0 != nil else {
return
}
guard $0! else {
return
}
let requestCount = self?.tracktransactionviewmodel.getCount()
self?.buttonMoneyRequestCount.setTitle(String(requestCount!), for: .normal)
if requestCount != nil {
if requestCount! > 0 {
self?.buttonMoneyRequestCount.isUserInteractionEnabled = true
}
}
}
}
/**
Set maximum amount
*/
func setUpWalletDetailsListener() {
walletviewmodel.walletLimitsFetched.bind{ [unowned self] in
guard $0 != nil else {
return
}
self.stopLoading()
guard $0! else {
if WalletViewController.walletConnectionTimeOutCheck == 0{
WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
self.popUpMessageError(value: 10, message: self.walletviewmodel.getErrorMessage())
}
self.walletviewmodel.walletLimitsFetched.value = nil
self.buttonSubmit.isUserInteractionEnabled = false
return
}
self.textFieldAmount.placeholder = "Maximum Amount" + " " + self.walletviewmodel.getMaximumTransferLimit() + " " + "KRW"
self.walletviewmodel.walletLimitsFetched.value = nil
}
}
@objc func modeChanged(_ segControl: UISegmentedControl) {
textFieldID.text = ""
textFieldMessage.text = ""
textFieldAmount.text = ""
switch segControl.selectedSegmentIndex {
case 0:
labelID.text = "GME User ID of Receiver"
buttonSubmit.setTitle("Transfer", for: .normal)
walletviewmodel.setMode(segmentIndex: 0)
case 1:
labelID.text = "GME User ID of Sender"
buttonSubmit.setTitle("Request", for: .normal)
walletviewmodel.setMode(segmentIndex: 1)
default:
break
}
}
@IBAction func reviewTransferDetails(_ sender: Any) {
activeTextField?.resignFirstResponder()
walletviewmodel.setParam(amount: textFieldAmount.text!,
gmeID: textFieldID.text!,
message: textFieldMessage.text!)
switch walletviewmodel.validateFields() {
case .Valid:
self.startLoading()
profileviewmodel.fetchUserInfo(userId: walletviewmodel.getGMEID())
case .InValid(let validationError):
self.popUpMessageError(value: 11, message: validationError)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.identifier {
case "walletReview"?:
let walletReviewViewController
= segue.destination as! WalletReviewViewController
walletReviewViewController.walletviewmodel = self.walletviewmodel
walletReviewViewController.moneyRequestAccepted = self.moneyRequestAccepted
case "walletTransfer"?:
activeTextField?.resignFirstResponder()
let walletTransactionListViewController
= segue.destination as! WalletTransactionListViewController
walletTransactionListViewController.walletStatus = "walletTransfer"
case "walletBorrow"?:
activeTextField?.resignFirstResponder()
let walletTransactionListViewController
= segue.destination as! WalletTransactionListViewController
walletTransactionListViewController.walletStatus = "walletBorrow"
case "moneyRequest"?:
activeTextField?.resignFirstResponder()
let moneyRequestViewController
= segue.destination as! MoneyRequestViewController
moneyRequestViewController.moneyRequests = tracktransactionviewmodel.getTransactions()
default:
return
}
}
}
extension WalletViewController: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
activeTextField = textField
checkScroll()
if textField == textFieldAmount {
if textField.text!.contains("KRW") {
textField.text = textField.text!.replacingOccurrences(of: " KRW", with: "", options: NSString.CompareOptions.literal, range: nil)
}
}
}
func textFieldDidEndEditing(_ textField: UITextField) {
checkScroll()
if textField == textFieldAmount {
if textField.text != "" && !textField.text!.contains("KRW") {
textField.text!.append(" KRW")
}
}
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let inputText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
if textField == textFieldAmount {
//^[0-9]+$
if NSPredicate(format:"SELF MATCHES %@", "[0-9]*$").evaluate(with: inputText) {
return true
}
return false
}
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
switch textField {
case textFieldID:
textFieldAmount.becomeFirstResponder()
case textFieldMessage:
textFieldMessage.resignFirstResponder()
default:
return false
}
return true
}
}
extension WalletViewController: ScrollableProtocol {
var offset: CGFloat {
get {
return stackView.frame.origin.y - 20
}
}
var viewScrolled: Bool {
get {
return isScrolled
}
}
/**
Scroll logic
*/
func checkScroll() {
if !viewScrolled {
performScroll(direction: 0)
isScrolled = !isScrolled
} else {
performScroll(direction: 1)
isScrolled = !isScrolled
}
}
func registerTapListener() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard))
view.addGestureRecognizer(tap)
}
/**
Dismiss keypad
*/
@objc func clearKeyboard() {
activeTextField?.resignFirstResponder()
if viewScrolled {
performScroll(direction: 1)
isScrolled = !isScrolled
}
}
/**
Active keypad if direction is equal to 0
- parameter direction: display keypad if direction is equal to 0
*/
func performScroll(direction: Int) {
if direction == 0 {
UIView.animate(withDuration: 0.3, animations: {
self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset * -1)
})
} else if direction == 1 {
UIView.animate(withDuration: 0.3, animations: {
self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset)
})
}
// setUpNetworkListener()
// setUpNetworkListenerForProfile()
// setUpProfileListener()
// setUpTransactionListener()
// setUpWalletDetailsListener()
//
// /*so that the value is reset and no error message is seen when going back and froth in error case*/
// self.walletviewmodel.walletActionPerformed.value = nil
//
// self.buttonMoneyRequestCount.setTitle("", for: .normal)
// self.buttonMoneyRequestCount.isUserInteractionEnabled = false
//
// tracktransactionviewmodel.fetchTransactionListForTrackAndWallet(recipientId: "", recipientName: "", transactionType: "moneyRequest", startDate: nil, endDate: nil, txPage: nil, txSize: nil)
// }
//
// override func viewDidLoad() {
// super.viewDidLoad()
//
// setUpNavBar(id: 201, title: "Wallet to Wallet Transfer")
//
// NotificationCenter.default.addObserver(self, selector: #selector(appMovedToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil)
//
// registerTapListener()
//
//
// self.startLoading()
// walletviewmodel.getTransactionInfo()
//
// scrollView.delegate = self
// scrollView.addSubview(contentView)
// scrollView.contentSize = CGSize(width: 2000, height:2000)
//
// if transaction != nil {
// moneyRequestAccepted = true
// segmentedControl.isUserInteractionEnabled = false
// walletviewmodel.setMode(segmentIndex: 2)
// walletviewmodel.setMoneyRequestTransactionID(id: transaction!.transactionId)
//
// textFieldID.text = transaction!.receiverId
// textFieldAmount.text = transaction!.payoutAmountOriginal
//
//
// textFieldID.isUserInteractionEnabled = false
// }
// textFieldID.delegate = self
// textFieldAmount.delegate = self
// textFieldMessage.delegate = self
//
//
// segmentedControl.selectedSegmentIndex = 0
// segmentedControl.addTarget(self, action: #selector(modeChanged(_:)), for: .valueChanged)
//
// walletviewmodel.setMode(segmentIndex: 0)
// }
//
// /**
// Disable user interaction while fetching data from api
// */
// func startLoading(){
// self.showActivityIndicator(activityIndicator: self.activityIndicator)
// self.disableUserInteractions()
// }
//
// /**
// Enable user interaction while fetching data from api
// */
// func stopLoading(){
// self.dismissActivityIndicator(activityIndicator: self.activityIndicator)
// self.enableUserInteractions()
// }
//
// /**
// Check internet connection
// */
// func setUpNetworkListener() {
// walletviewmodel.internetConnection.bind { [unowned self] in
// guard $0 != nil else {
// return
// }
// self.walletviewmodel.internetConnection.value = nil
// self.stopLoading()
// self.popUpMessage(value: 15)
// }
// }
//
// func setUpNetworkListenerForProfile() {
// profileviewmodel.internetConnection.bind { [unowned self] in
// guard $0 != nil else {
// return
// }
// self.profileviewmodel.internetConnection.value = nil
// self.stopLoading()
// self.popUpMessage(value: 15)
// }
// }
//
// /**
// Set GMEUser name
// */
// func setUpProfileListener() {
// profileviewmodel.userDataAvailable.bind { [unowned self] in
// guard $0 != nil else {
// return
// }
// self.stopLoading()
// if !($0!) {
// if WalletViewController.walletConnectionTimeOutCheck == 0{
// WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
// self.popUpMessageError(value: 10, message: self.profileviewmodel.getErrorMessage())
// }
// } else {
// if !self.profileviewmodel.hasFilledKYC() {
// self.popUpMessageError(value: 11, message: "User has not filled KYC form")
// } else {
// self.walletviewmodel.setGMEUsername(fullName: self.profileviewmodel.getFullName())
// self.performSegue(withIdentifier: "walletReview", sender: nil)
// }
// }
// self.profileviewmodel.userDataAvailable.value = nil
// }
// }
//
// /**
// Update the view with the transaction count
// */
// func setUpTransactionListener() {
// tracktransactionviewmodel.transactionListObtained.bind{ [weak self] in
// guard $0 != nil else {
// return
// }
// guard $0! else {
// return
// }
// let requestCount = self?.tracktransactionviewmodel.getCount()
// self?.buttonMoneyRequestCount.setTitle(String(requestCount!), for: .normal)
//
// if requestCount != nil {
// if requestCount! > 0 {
// self?.buttonMoneyRequestCount.isUserInteractionEnabled = true
// }
// }
// }
// }
//
// /**
// Set maximum amount
// */
// func setUpWalletDetailsListener() {
// walletviewmodel.walletLimitsFetched.bind{ [unowned self] in
// guard $0 != nil else {
// return
// }
// self.stopLoading()
// guard $0! else {
// if WalletViewController.walletConnectionTimeOutCheck == 0{
// WalletViewController.walletConnectionTimeOutCheck = WalletViewController.walletConnectionTimeOutCheck+1
// self.popUpMessageError(value: 10, message: self.walletviewmodel.getErrorMessage())
// }
// self.walletviewmodel.walletLimitsFetched.value = nil
// self.buttonSubmit.isUserInteractionEnabled = false
// return
// }
// self.textFieldAmount.placeholder = "Maximum Amount" + " " + self.walletviewmodel.getMaximumTransferLimit() + " " + "KRW"
// self.walletviewmodel.walletLimitsFetched.value = nil
// }
// }
//
// @objc func modeChanged(_ segControl: UISegmentedControl) {
//
// textFieldID.text = ""
// textFieldMessage.text = ""
// textFieldAmount.text = ""
//
// switch segControl.selectedSegmentIndex {
// case 0:
// labelID.text = "GME User ID of Receiver"
// buttonSubmit.setTitle("Transfer", for: .normal)
// walletviewmodel.setMode(segmentIndex: 0)
// case 1:
// labelID.text = "GME User ID of Sender"
// buttonSubmit.setTitle("Request", for: .normal)
// walletviewmodel.setMode(segmentIndex: 1)
// default:
// break
// }
// }
//
//
// @IBAction func reviewTransferDetails(_ sender: Any) {
// activeTextField?.resignFirstResponder()
//
// walletviewmodel.setParam(amount: textFieldAmount.text!,
// gmeID: textFieldID.text!,
// message: textFieldMessage.text!)
//
// switch walletviewmodel.validateFields() {
// case .Valid:
// self.startLoading()
// profileviewmodel.fetchUserInfo(userId: walletviewmodel.getGMEID())
// case .InValid(let validationError):
// self.popUpMessageError(value: 11, message: validationError)
// }
// }
//
// override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// switch segue.identifier {
// case "walletReview"?:
// let walletReviewViewController
// = segue.destination as! WalletReviewViewController
// walletReviewViewController.walletviewmodel = self.walletviewmodel
// walletReviewViewController.moneyRequestAccepted = self.moneyRequestAccepted
// case "walletTransfer"?:
// activeTextField?.resignFirstResponder()
// let walletTransactionListViewController
// = segue.destination as! WalletTransactionListViewController
// walletTransactionListViewController.walletStatus = "walletTransfer"
// case "walletBorrow"?:
// activeTextField?.resignFirstResponder()
// let walletTransactionListViewController
// = segue.destination as! WalletTransactionListViewController
// walletTransactionListViewController.walletStatus = "walletBorrow"
// case "moneyRequest"?:
// activeTextField?.resignFirstResponder()
// let moneyRequestViewController
// = segue.destination as! MoneyRequestViewController
// moneyRequestViewController.moneyRequests = tracktransactionviewmodel.getTransactions()
// default:
// return
// }
//
// }
//}
//
//extension WalletViewController: UITextFieldDelegate {
//
//
// func textFieldDidBeginEditing(_ textField: UITextField) {
//
// activeTextField = textField
//
// checkScroll()
//
// if textField == textFieldAmount {
// if textField.text!.contains("KRW") {
// textField.text = textField.text!.replacingOccurrences(of: " KRW", with: "", options: NSString.CompareOptions.literal, range: nil)
// }
// }
// }
//
// func textFieldDidEndEditing(_ textField: UITextField) {
//
// checkScroll()
//
// if textField == textFieldAmount {
// if textField.text != "" && !textField.text!.contains("KRW") {
// textField.text!.append(" KRW")
// }
// }
// }
//
// func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
//
// let inputText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
// if textField == textFieldAmount {
// //^[0-9]+$
// if NSPredicate(format:"SELF MATCHES %@", "[0-9]*$").evaluate(with: inputText) {
// return true
// }
// return false
// }
// return true
// }
//
// func textFieldShouldReturn(_ textField: UITextField) -> Bool {
// switch textField {
// case textFieldID:
// textFieldAmount.becomeFirstResponder()
// case textFieldMessage:
// textFieldMessage.resignFirstResponder()
// default:
// return false
// }
// return true
// }
//}
//
//extension WalletViewController: ScrollableProtocol {
// var offset: CGFloat {
// get {
// return stackView.frame.origin.y - 20
// }
// }
//
// var viewScrolled: Bool {
// get {
// return isScrolled
// }
// }
//
// /**
// Scroll logic
// */
// func checkScroll() {
// if !viewScrolled {
// performScroll(direction: 0)
// isScrolled = !isScrolled
// } else {
// performScroll(direction: 1)
// isScrolled = !isScrolled
// }
// }
//
// func registerTapListener() {
// let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard))
// view.addGestureRecognizer(tap)
// }
//
// /**
// Dismiss keypad
// */
// @objc func clearKeyboard() {
// activeTextField?.resignFirstResponder()
// if viewScrolled {
// performScroll(direction: 1)
// isScrolled = !isScrolled
// }
// }
//
// /**
// Active keypad if direction is equal to 0
// - parameter direction: display keypad if direction is equal to 0
// */
// func performScroll(direction: Int) {
// if direction == 0 {
// UIView.animate(withDuration: 0.3, animations: {
// self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset * -1)
// })
// } else if direction == 1 {
// UIView.animate(withDuration: 0.3, animations: {
// self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset)
// })
// }
}
}

2959
GMERemittance/_Home/_HomeViewController.swift
File diff suppressed because it is too large
View File

Loading…
Cancel
Save