Browse Source

add search bar at recipient list

pull/1/head
InKwon James Kim 5 years ago
parent
commit
826571ac40
  1. 254
      GME Remit.xcodeproj/project.pbxproj
  2. 28
      GME Remit/Models/Response/SendMoneyCountryViewModel.swift
  3. 2
      GME Remit/Models/Response/SendMoneyDistrictViewModel.swift
  4. 0
      GME Remit/Models/Response/SendMoneyProvinceViewModel.swift
  5. 4
      GME Remit/Models/Response/SendMoneyRelationViewModel.swift
  6. 0
      GME Remit/Models/Response/SendMoneyTransFerReasonViewModel.swift
  7. 47
      GME Remit/Modules/RecipientModules/AddReciepient/Application Logic/Interactor/AddReciepientInteractor.swift
  8. 18
      GME Remit/Modules/RecipientModules/AddReciepient/Application Logic/Interactor/AddReciepientInteractorIO.swift
  9. 21
      GME Remit/Modules/RecipientModules/AddReciepient/Application Logic/Service/AddReciepientService.swift
  10. 57
      GME Remit/Modules/RecipientModules/AddReciepient/Application Logic/Service/AddReciepientServiceType.swift
  11. 12
      GME Remit/Modules/RecipientModules/AddReciepient/Module Interface/AddReciepientModuleInterface.swift
  12. BIN
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/Presenter/.DS_Store
  13. 143
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/Presenter/AddReciepientPresenter.swift
  14. BIN
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/.DS_Store
  15. 468
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/AddReciepient.storyboard
  16. 493
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/AddReciepientViewController.swift
  17. 19
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/AddReciepientViewInterface.swift
  18. BIN
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/ViewModels/.DS_Store
  19. 135
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/ViewModels/SendMoneyCountryViewModel.swift
  20. 40
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/Wireframe/AddReciepientWireframe.swift
  21. 13
      GME Remit/Modules/RecipientModules/AddReciepient/User Interface/Wireframe/AddReciepientWireframeInput.swift
  22. BIN
      GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Interactor/.DS_Store
  23. 50
      GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Interactor/EditReciepientInteractor.swift
  24. 19
      GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Interactor/EditReciepientInteractorIO.swift
  25. 18
      GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Service/EditReciepientService.swift
  26. 13
      GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Service/EditReciepientServiceType.swift
  27. 12
      GME Remit/Modules/RecipientModules/EditReciepient/Module Interface/EditReciepientModuleInterface.swift
  28. BIN
      GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Presenter/.DS_Store
  29. 178
      GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Presenter/EditReciepientPresenter.swift
  30. 33
      GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Presenter/EditRecipientRecipientViewModel.swift
  31. BIN
      GME Remit/Modules/RecipientModules/EditReciepient/User Interface/View/.DS_Store
  32. 466
      GME Remit/Modules/RecipientModules/EditReciepient/User Interface/View/EditReciepient.storyboard
  33. 536
      GME Remit/Modules/RecipientModules/EditReciepient/User Interface/View/EditReciepientViewController.swift
  34. 19
      GME Remit/Modules/RecipientModules/EditReciepient/User Interface/View/EditReciepientViewInterface.swift
  35. 54
      GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Wireframe/EditReciepientWireframe.swift
  36. 13
      GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Wireframe/EditReciepientWireframeInput.swift
  37. 21
      GME Remit/Modules/RecipientModules/Recipients/User Interface/View/Recipients.storyboard
  38. 9
      GME Remit/Modules/RecipientModules/Recipients/User Interface/View/RecipientsViewController.swift
  39. 14
      GME Remit/Modules/RecipientModules/Recipients/User Interface/View/ViewModel/RecipientsViewModel.swift

254
GME Remit.xcodeproj/project.pbxproj

@ -200,34 +200,11 @@
73168A2322F3D01A00878038 /* TablePresenterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73168A2222F3D01900878038 /* TablePresenterProtocol.swift */; };
73185314230E19DD00BA9AE3 /* ValidateAccountRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185313230E19DD00BA9AE3 /* ValidateAccountRequest.swift */; };
73185316230EA5FB00BA9AE3 /* SaveResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185315230EA5FB00BA9AE3 /* SaveResponseModel.swift */; };
73185346230EACA400BA9AE3 /* AddReciepientModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185319230EACA200BA9AE3 /* AddReciepientModuleInterface.swift */; };
73185347230EACA400BA9AE3 /* AddReciepientServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318531C230EACA300BA9AE3 /* AddReciepientServiceType.swift */; };
73185348230EACA400BA9AE3 /* AddReciepientService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318531D230EACA300BA9AE3 /* AddReciepientService.swift */; };
73185349230EACA400BA9AE3 /* AddReciepientInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318531F230EACA300BA9AE3 /* AddReciepientInteractor.swift */; };
7318534A230EACA400BA9AE3 /* AddReciepientInteractorIO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185320230EACA300BA9AE3 /* AddReciepientInteractorIO.swift */; };
7318534B230EACA400BA9AE3 /* AddReciepientPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185323230EACA300BA9AE3 /* AddReciepientPresenter.swift */; };
7318534C230EACA400BA9AE3 /* AddReciepientWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185325230EACA300BA9AE3 /* AddReciepientWireframe.swift */; };
7318534D230EACA400BA9AE3 /* AddReciepientWireframeInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185326230EACA300BA9AE3 /* AddReciepientWireframeInput.swift */; };
7318534E230EACA400BA9AE3 /* SendMoneyTransFerReasonViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185329230EACA300BA9AE3 /* SendMoneyTransFerReasonViewModel.swift */; };
7318534F230EACA400BA9AE3 /* SendMoneyRelationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318532A230EACA300BA9AE3 /* SendMoneyRelationViewModel.swift */; };
73185350230EACA400BA9AE3 /* SendMoneyCountryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318532B230EACA300BA9AE3 /* SendMoneyCountryViewModel.swift */; };
73185351230EACA400BA9AE3 /* SendMoneyDistrictViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318532C230EACA300BA9AE3 /* SendMoneyDistrictViewModel.swift */; };
73185352230EACA400BA9AE3 /* SendMoneyProvinceViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318532D230EACA300BA9AE3 /* SendMoneyProvinceViewModel.swift */; };
73185353230EACA400BA9AE3 /* AddReciepient.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7318532E230EACA300BA9AE3 /* AddReciepient.storyboard */; };
73185354230EACA400BA9AE3 /* AddReciepientViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318532F230EACA300BA9AE3 /* AddReciepientViewController.swift */; };
73185355230EACA400BA9AE3 /* AddReciepientViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185330230EACA300BA9AE3 /* AddReciepientViewInterface.swift */; };
73185356230EACA400BA9AE3 /* EditReciepientModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185333230EACA300BA9AE3 /* EditReciepientModuleInterface.swift */; };
73185357230EACA400BA9AE3 /* EditReciepientServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185336230EACA300BA9AE3 /* EditReciepientServiceType.swift */; };
73185358230EACA400BA9AE3 /* EditReciepientService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185337230EACA300BA9AE3 /* EditReciepientService.swift */; };
73185359230EACA400BA9AE3 /* EditReciepientInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185339230EACA300BA9AE3 /* EditReciepientInteractor.swift */; };
7318535A230EACA400BA9AE3 /* EditReciepientInteractorIO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318533A230EACA300BA9AE3 /* EditReciepientInteractorIO.swift */; };
7318535B230EACA400BA9AE3 /* EditReciepientPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318533D230EACA300BA9AE3 /* EditReciepientPresenter.swift */; };
7318535C230EACA400BA9AE3 /* EditRecipientRecipientViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7318533E230EACA300BA9AE3 /* EditRecipientRecipientViewModel.swift */; };
7318535D230EACA400BA9AE3 /* EditReciepientWireframeInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185340230EACA300BA9AE3 /* EditReciepientWireframeInput.swift */; };
7318535E230EACA400BA9AE3 /* EditReciepientWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185341230EACA300BA9AE3 /* EditReciepientWireframe.swift */; };
7318535F230EACA400BA9AE3 /* EditReciepientViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185343230EACA300BA9AE3 /* EditReciepientViewController.swift */; };
73185360230EACA400BA9AE3 /* EditReciepient.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 73185344230EACA300BA9AE3 /* EditReciepient.storyboard */; };
73185361230EACA400BA9AE3 /* EditReciepientViewInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73185345230EACA300BA9AE3 /* EditReciepientViewInterface.swift */; };
73195AB222FD14D500151434 /* SetupRecipientModuleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73195A9D22FD14D400151434 /* SetupRecipientModuleInterface.swift */; };
73195AB322FD14D500151434 /* SetupRecipientServiceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73195AA122FD14D400151434 /* SetupRecipientServiceType.swift */; };
73195AB422FD14D500151434 /* SetupRecipientService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73195AA222FD14D400151434 /* SetupRecipientService.swift */; };
@ -2445,34 +2422,11 @@
73168A2222F3D01900878038 /* TablePresenterProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TablePresenterProtocol.swift; sourceTree = "<group>"; };
73185313230E19DD00BA9AE3 /* ValidateAccountRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValidateAccountRequest.swift; sourceTree = "<group>"; };
73185315230EA5FB00BA9AE3 /* SaveResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveResponseModel.swift; sourceTree = "<group>"; };
73185319230EACA200BA9AE3 /* AddReciepientModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientModuleInterface.swift; sourceTree = "<group>"; };
7318531C230EACA300BA9AE3 /* AddReciepientServiceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientServiceType.swift; sourceTree = "<group>"; };
7318531D230EACA300BA9AE3 /* AddReciepientService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientService.swift; sourceTree = "<group>"; };
7318531F230EACA300BA9AE3 /* AddReciepientInteractor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientInteractor.swift; sourceTree = "<group>"; };
73185320230EACA300BA9AE3 /* AddReciepientInteractorIO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientInteractorIO.swift; sourceTree = "<group>"; };
73185323230EACA300BA9AE3 /* AddReciepientPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientPresenter.swift; sourceTree = "<group>"; };
73185325230EACA300BA9AE3 /* AddReciepientWireframe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientWireframe.swift; sourceTree = "<group>"; };
73185326230EACA300BA9AE3 /* AddReciepientWireframeInput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientWireframeInput.swift; sourceTree = "<group>"; };
73185329230EACA300BA9AE3 /* SendMoneyTransFerReasonViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendMoneyTransFerReasonViewModel.swift; sourceTree = "<group>"; };
7318532A230EACA300BA9AE3 /* SendMoneyRelationViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendMoneyRelationViewModel.swift; sourceTree = "<group>"; };
7318532B230EACA300BA9AE3 /* SendMoneyCountryViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendMoneyCountryViewModel.swift; sourceTree = "<group>"; };
7318532C230EACA300BA9AE3 /* SendMoneyDistrictViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendMoneyDistrictViewModel.swift; sourceTree = "<group>"; };
7318532D230EACA300BA9AE3 /* SendMoneyProvinceViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendMoneyProvinceViewModel.swift; sourceTree = "<group>"; };
7318532E230EACA300BA9AE3 /* AddReciepient.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = AddReciepient.storyboard; sourceTree = "<group>"; };
7318532F230EACA300BA9AE3 /* AddReciepientViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientViewController.swift; sourceTree = "<group>"; };
73185330230EACA300BA9AE3 /* AddReciepientViewInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddReciepientViewInterface.swift; sourceTree = "<group>"; };
73185333230EACA300BA9AE3 /* EditReciepientModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientModuleInterface.swift; sourceTree = "<group>"; };
73185336230EACA300BA9AE3 /* EditReciepientServiceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientServiceType.swift; sourceTree = "<group>"; };
73185337230EACA300BA9AE3 /* EditReciepientService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientService.swift; sourceTree = "<group>"; };
73185339230EACA300BA9AE3 /* EditReciepientInteractor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientInteractor.swift; sourceTree = "<group>"; };
7318533A230EACA300BA9AE3 /* EditReciepientInteractorIO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientInteractorIO.swift; sourceTree = "<group>"; };
7318533D230EACA300BA9AE3 /* EditReciepientPresenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientPresenter.swift; sourceTree = "<group>"; };
7318533E230EACA300BA9AE3 /* EditRecipientRecipientViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditRecipientRecipientViewModel.swift; sourceTree = "<group>"; };
73185340230EACA300BA9AE3 /* EditReciepientWireframeInput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientWireframeInput.swift; sourceTree = "<group>"; };
73185341230EACA300BA9AE3 /* EditReciepientWireframe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientWireframe.swift; sourceTree = "<group>"; };
73185343230EACA300BA9AE3 /* EditReciepientViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientViewController.swift; sourceTree = "<group>"; };
73185344230EACA300BA9AE3 /* EditReciepient.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = EditReciepient.storyboard; sourceTree = "<group>"; };
73185345230EACA300BA9AE3 /* EditReciepientViewInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditReciepientViewInterface.swift; sourceTree = "<group>"; };
73195A9D22FD14D400151434 /* SetupRecipientModuleInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetupRecipientModuleInterface.swift; sourceTree = "<group>"; };
73195AA122FD14D400151434 /* SetupRecipientServiceType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetupRecipientServiceType.swift; sourceTree = "<group>"; };
73195AA222FD14D400151434 /* SetupRecipientService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetupRecipientService.swift; sourceTree = "<group>"; };
@ -5821,184 +5775,6 @@
path = Request;
sourceTree = "<group>";
};
73185317230EACA200BA9AE3 /* AddReciepient */ = {
isa = PBXGroup;
children = (
73185318230EACA200BA9AE3 /* Module Interface */,
7318531A230EACA200BA9AE3 /* Application Logic */,
73185321230EACA300BA9AE3 /* User Interface */,
);
path = AddReciepient;
sourceTree = "<group>";
};
73185318230EACA200BA9AE3 /* Module Interface */ = {
isa = PBXGroup;
children = (
73185319230EACA200BA9AE3 /* AddReciepientModuleInterface.swift */,
);
path = "Module Interface";
sourceTree = "<group>";
};
7318531A230EACA200BA9AE3 /* Application Logic */ = {
isa = PBXGroup;
children = (
7318531B230EACA200BA9AE3 /* Service */,
7318531E230EACA300BA9AE3 /* Interactor */,
);
path = "Application Logic";
sourceTree = "<group>";
};
7318531B230EACA200BA9AE3 /* Service */ = {
isa = PBXGroup;
children = (
7318531C230EACA300BA9AE3 /* AddReciepientServiceType.swift */,
7318531D230EACA300BA9AE3 /* AddReciepientService.swift */,
);
path = Service;
sourceTree = "<group>";
};
7318531E230EACA300BA9AE3 /* Interactor */ = {
isa = PBXGroup;
children = (
7318531F230EACA300BA9AE3 /* AddReciepientInteractor.swift */,
73185320230EACA300BA9AE3 /* AddReciepientInteractorIO.swift */,
);
path = Interactor;
sourceTree = "<group>";
};
73185321230EACA300BA9AE3 /* User Interface */ = {
isa = PBXGroup;
children = (
73185322230EACA300BA9AE3 /* Presenter */,
73185324230EACA300BA9AE3 /* Wireframe */,
73185327230EACA300BA9AE3 /* View */,
);
path = "User Interface";
sourceTree = "<group>";
};
73185322230EACA300BA9AE3 /* Presenter */ = {
isa = PBXGroup;
children = (
73185323230EACA300BA9AE3 /* AddReciepientPresenter.swift */,
);
path = Presenter;
sourceTree = "<group>";
};
73185324230EACA300BA9AE3 /* Wireframe */ = {
isa = PBXGroup;
children = (
73185325230EACA300BA9AE3 /* AddReciepientWireframe.swift */,
73185326230EACA300BA9AE3 /* AddReciepientWireframeInput.swift */,
);
path = Wireframe;
sourceTree = "<group>";
};
73185327230EACA300BA9AE3 /* View */ = {
isa = PBXGroup;
children = (
73185328230EACA300BA9AE3 /* ViewModels */,
7318532E230EACA300BA9AE3 /* AddReciepient.storyboard */,
7318532F230EACA300BA9AE3 /* AddReciepientViewController.swift */,
73185330230EACA300BA9AE3 /* AddReciepientViewInterface.swift */,
);
path = View;
sourceTree = "<group>";
};
73185328230EACA300BA9AE3 /* ViewModels */ = {
isa = PBXGroup;
children = (
73185329230EACA300BA9AE3 /* SendMoneyTransFerReasonViewModel.swift */,
7318532A230EACA300BA9AE3 /* SendMoneyRelationViewModel.swift */,
7318532B230EACA300BA9AE3 /* SendMoneyCountryViewModel.swift */,
7318532C230EACA300BA9AE3 /* SendMoneyDistrictViewModel.swift */,
7318532D230EACA300BA9AE3 /* SendMoneyProvinceViewModel.swift */,
);
path = ViewModels;
sourceTree = "<group>";
};
73185331230EACA300BA9AE3 /* EditReciepient */ = {
isa = PBXGroup;
children = (
73185332230EACA300BA9AE3 /* Module Interface */,
73185334230EACA300BA9AE3 /* Application Logic */,
7318533B230EACA300BA9AE3 /* User Interface */,
);
path = EditReciepient;
sourceTree = "<group>";
};
73185332230EACA300BA9AE3 /* Module Interface */ = {
isa = PBXGroup;
children = (
73185333230EACA300BA9AE3 /* EditReciepientModuleInterface.swift */,
);
path = "Module Interface";
sourceTree = "<group>";
};
73185334230EACA300BA9AE3 /* Application Logic */ = {
isa = PBXGroup;
children = (
73185335230EACA300BA9AE3 /* Service */,
73185338230EACA300BA9AE3 /* Interactor */,
);
path = "Application Logic";
sourceTree = "<group>";
};
73185335230EACA300BA9AE3 /* Service */ = {
isa = PBXGroup;
children = (
73185336230EACA300BA9AE3 /* EditReciepientServiceType.swift */,
73185337230EACA300BA9AE3 /* EditReciepientService.swift */,
);
path = Service;
sourceTree = "<group>";
};
73185338230EACA300BA9AE3 /* Interactor */ = {
isa = PBXGroup;
children = (
73185339230EACA300BA9AE3 /* EditReciepientInteractor.swift */,
7318533A230EACA300BA9AE3 /* EditReciepientInteractorIO.swift */,
);
path = Interactor;
sourceTree = "<group>";
};
7318533B230EACA300BA9AE3 /* User Interface */ = {
isa = PBXGroup;
children = (
7318533C230EACA300BA9AE3 /* Presenter */,
7318533F230EACA300BA9AE3 /* Wireframe */,
73185342230EACA300BA9AE3 /* View */,
);
path = "User Interface";
sourceTree = "<group>";
};
7318533C230EACA300BA9AE3 /* Presenter */ = {
isa = PBXGroup;
children = (
7318533D230EACA300BA9AE3 /* EditReciepientPresenter.swift */,
7318533E230EACA300BA9AE3 /* EditRecipientRecipientViewModel.swift */,
);
path = Presenter;
sourceTree = "<group>";
};
7318533F230EACA300BA9AE3 /* Wireframe */ = {
isa = PBXGroup;
children = (
73185340230EACA300BA9AE3 /* EditReciepientWireframeInput.swift */,
73185341230EACA300BA9AE3 /* EditReciepientWireframe.swift */,
);
path = Wireframe;
sourceTree = "<group>";
};
73185342230EACA300BA9AE3 /* View */ = {
isa = PBXGroup;
children = (
73185343230EACA300BA9AE3 /* EditReciepientViewController.swift */,
73185344230EACA300BA9AE3 /* EditReciepient.storyboard */,
73185345230EACA300BA9AE3 /* EditReciepientViewInterface.swift */,
);
path = View;
sourceTree = "<group>";
};
73195A9B22FD14D400151434 /* SetupRecipient */ = {
isa = PBXGroup;
children = (
@ -6555,6 +6331,11 @@
D97785AB215DD23400754079 /* TransactionModel.swift */,
D9768C87213BAE92009E01BC /* User.swift */,
D96BD1202164828D00DFE7D8 /* WalletStatement.swift */,
73185329230EACA300BA9AE3 /* SendMoneyTransFerReasonViewModel.swift */,
7318532A230EACA300BA9AE3 /* SendMoneyRelationViewModel.swift */,
7318532B230EACA300BA9AE3 /* SendMoneyCountryViewModel.swift */,
7318532C230EACA300BA9AE3 /* SendMoneyDistrictViewModel.swift */,
7318532D230EACA300BA9AE3 /* SendMoneyProvinceViewModel.swift */,
);
path = Response;
sourceTree = "<group>";
@ -6984,8 +6765,6 @@
children = (
73210D8C22FBE73100715D6C /* Recipients */,
73195A9B22FD14D400151434 /* SetupRecipient */,
73185317230EACA200BA9AE3 /* AddReciepient */,
73185331230EACA300BA9AE3 /* EditReciepient */,
);
path = RecipientModules;
sourceTree = "<group>";
@ -12410,7 +12189,6 @@
D93C2B7A22000D660079BF03 /* iPad_transkey_number_key_random_9.png in Resources */,
D93C277422000D630079BF03 /* iPhone_transkey_alnum_cmd_0_down.png in Resources */,
D93C2BBA22000D660079BF03 /* transkey_input_sym_11.png in Resources */,
73185360230EACA400BA9AE3 /* EditReciepient.storyboard in Resources */,
D93C2A6A22000D650079BF03 /* iPhone_transkey_landscape_number_cmd_2_mongolian.png in Resources */,
D93C270922000D630079BF03 /* iPhone_transkey_landscape_alnum_dummy_2.png in Resources */,
D93C280622000D640079BF03 /* iPad_transkey_landscape_alnum_cap_3.png in Resources */,
@ -12609,7 +12387,6 @@
D93C29B022000D650079BF03 /* transkey_navi_complete2_down_thai.png in Resources */,
D93C2A4D22000D650079BF03 /* iPad_transkey_alnum_cmd_10_english.png in Resources */,
D93C27BA22000D630079BF03 /* iPad_transkey_landscape_alnum_sym_19.png in Resources */,
73185353230EACA400BA9AE3 /* AddReciepient.storyboard in Resources */,
D93C2C3022000D660079BF03 /* pt-icon34.png in Resources */,
D93C28A422000D640079BF03 /* iPad_transkey_alnum_key_6.png in Resources */,
D93C278722000D630079BF03 /* iPhone_transkey_alnum_eng_9.png in Resources */,
@ -14169,7 +13946,6 @@
730197A122535135001954AB /* kycForm3ModuleInterface.swift in Sources */,
9FD260F81FD00458007A511D /* AppDelegate.swift in Sources */,
D903113E214786EA00AD5BA9 /* ForgotPasswordService.swift in Sources */,
7318534D230EACA400BA9AE3 /* AddReciepientWireframeInput.swift in Sources */,
7301979222535135001954AB /* KycWireframeInput.swift in Sources */,
73B4C8C522A5F2440078D495 /* CouponCell.swift in Sources */,
D9790622223F58420025BD5B /* ResendPresenter.swift in Sources */,
@ -14181,7 +13957,6 @@
D979061F223F58420025BD5B /* ResendService.swift in Sources */,
73B4C8C022A5F2440078D495 /* SelectCouponInteractor.swift in Sources */,
7389600C22C2F208003FEA90 /* TablePresenterService.swift in Sources */,
7318535C230EACA400BA9AE3 /* EditRecipientRecipientViewModel.swift in Sources */,
D903113C214786EA00AD5BA9 /* ForgotPasswordModuleInterface.swift in Sources */,
730D78BD227A94F2007E517E /* SearchAddressViewInterface.swift in Sources */,
736A8C462277EB2A00337A50 /* BiometricNotificationWireframeInput.swift in Sources */,
@ -14189,7 +13964,6 @@
D946719D21426DFB003924DB /* LoginViewInterface.swift in Sources */,
D922D9AB21351B7400D43053 /* SendMoneyVerificationInteractorIO.swift in Sources */,
D96A4FD721460B4A00CFD507 /* SplashScreenInteractor.swift in Sources */,
73185356230EACA400BA9AE3 /* EditReciepientModuleInterface.swift in Sources */,
73FE8848228A595500A5EB56 /* Order.swift in Sources */,
D97785A7215DC55F00754079 /* TransactionHistoryViewInterface.swift in Sources */,
D946719921426DFB003924DB /* LoginInteractorIO.swift in Sources */,
@ -14210,7 +13984,6 @@
73149F6322E5AF8000D66B26 /* LauncherScreenModuleInterface.swift in Sources */,
730197A422535135001954AB /* kycForm3InteractorIO.swift in Sources */,
730D7887227A94E1007E517E /* RedeemViewInterface.swift in Sources */,
7318535D230EACA400BA9AE3 /* EditReciepientWireframeInput.swift in Sources */,
73FE8837228A4A8C00A5EB56 /* OrderHistoryModuleInterface.swift in Sources */,
736A8C442277EB2A00337A50 /* BiometricNotificationInteractorIO.swift in Sources */,
73FE8839228A4A8C00A5EB56 /* OrderHistoryServiceType.swift in Sources */,
@ -14219,7 +13992,6 @@
73195AB922FD14D500151434 /* SetupRecipientWireframeInputOutput.swift in Sources */,
D945F123213E1D5100A24824 /* SendMoneyReceiptWireframe.swift in Sources */,
7389600F22C2F208003FEA90 /* TablePresenterPresenter.swift in Sources */,
7318535F230EACA400BA9AE3 /* EditReciepientViewController.swift in Sources */,
739A778A228BB2B40018A1A9 /* DetailOrderViewInterface.swift in Sources */,
D922D9B221351B7400D43053 /* SendMoneyVerificationViewController.swift in Sources */,
D96A5002214668A000CFD507 /* RegisterRequestModel.swift in Sources */,
@ -14229,7 +14001,6 @@
BE74AFBD227C8FF200F05CE7 /* AddAccountServiceType.swift in Sources */,
043770E721AD04240005B22D /* PennyTestModuleInterface.swift in Sources */,
730D787E227A94E1007E517E /* RedeemServiceType.swift in Sources */,
73185348230EACA400BA9AE3 /* AddReciepientService.swift in Sources */,
73195ABD22FD14D500151434 /* SetupRecipientViewController.swift in Sources */,
D99D72AA212D595B00601F48 /* CountryInfo.swift in Sources */,
730D78BA227A94F2007E517E /* SearchAddressPresenter.swift in Sources */,
@ -14244,7 +14015,6 @@
7301978D22535135001954AB /* KycServiceType.swift in Sources */,
73B4C8A422A5F1DE0078D495 /* Coupon.swift in Sources */,
D9031140214786EA00AD5BA9 /* ForgotPasswordInteractorIO.swift in Sources */,
73185358230EACA400BA9AE3 /* EditReciepientService.swift in Sources */,
D96A4FD821460B4A00CFD507 /* SplashScreenInteractorIO.swift in Sources */,
D922D9B121351B7400D43053 /* SendMoneyVerificationViewInterface.swift in Sources */,
730D7895227A94E1007E517E /* RewardViewController.swift in Sources */,
@ -14281,12 +14051,10 @@
BE74AFC7227C8FF200F05CE7 /* AutoDebitService.swift in Sources */,
04E36E1A21AE585200783685 /* PennyTestSubmitServiceType.swift in Sources */,
D90A9D65213696E400A96E45 /* BankPickerCell.swift in Sources */,
7318534A230EACA400BA9AE3 /* AddReciepientInteractorIO.swift in Sources */,
D9A060DD223F680B00F5D7C4 /* ResendExchangeWireframe.swift in Sources */,
D922D98B21351AAE00D43053 /* SendMoneyExchangeRateWireframe.swift in Sources */,
73469F9F2293C1B00062946B /* SelectPaymentWireframeInput.swift in Sources */,
D9DC107A21639078008F3C51 /* MessageComposeService.swift in Sources */,
73185346230EACA400BA9AE3 /* AddReciepientModuleInterface.swift in Sources */,
D922D9412135124200D43053 /* SendMoneyPaymentModeService.swift in Sources */,
730D787D227A94E1007E517E /* RedeemModuleInterface.swift in Sources */,
D96A4FD521460B4A00CFD507 /* SplashScreenService.swift in Sources */,
@ -14387,7 +14155,6 @@
D903113D214786EA00AD5BA9 /* ForgotPasswordServiceType.swift in Sources */,
D9B39677214F7DDC0072A9B8 /* ImageCroper.swift in Sources */,
730D78B9227A94F2007E517E /* SearchAddressInteractor.swift in Sources */,
7318534C230EACA400BA9AE3 /* AddReciepientWireframe.swift in Sources */,
D923EBBB215C7E67008A3026 /* HomeCollectionModel.swift in Sources */,
730197B322535135001954AB /* kycForm2WireframeInput.swift in Sources */,
D90A9D5A2136942300A96E45 /* BankBranchPickerCell.swift in Sources */,
@ -14457,13 +14224,11 @@
73210DAB22FBE73100715D6C /* RecipientsViewController.swift in Sources */,
D945F124213E1D5100A24824 /* SendMoneyReceiptWireframeInput.swift in Sources */,
730D7890227A94E1007E517E /* RewardWireframeInput.swift in Sources */,
73185357230EACA400BA9AE3 /* EditReciepientServiceType.swift in Sources */,
D922D9A921351B7400D43053 /* SendMoneyVerificationServiceType.swift in Sources */,
D9A060D8223F680B00F5D7C4 /* ResendExchangeService.swift in Sources */,
7301979622535135001954AB /* kycForm1ModuleInterface.swift in Sources */,
D922D9642135145F00D43053 /* SendMoneyParentService.swift in Sources */,
D9790621223F58420025BD5B /* ResendInteractorIO.swift in Sources */,
73185359230EACA400BA9AE3 /* EditReciepientInteractor.swift in Sources */,
D96A50002146625C00CFD507 /* RegisterViewController.swift in Sources */,
D945F126213E1D5100A24824 /* SendMoneyReceiptViewController.swift in Sources */,
73BCCDD9228993040057B161 /* RewardGroupViewController.swift in Sources */,
@ -14524,7 +14289,6 @@
730197AB22535135001954AB /* kycForm3ViewController.swift in Sources */,
0496B84F1FE7DFCD0044810E /* String+Ext.swift in Sources */,
D9B7ADF52130048E009B0564 /* ExchangeRatesPresenter.swift in Sources */,
73185361230EACA400BA9AE3 /* EditReciepientViewInterface.swift in Sources */,
D9BE022821E2DD45003AA8C7 /* PaymentSelectionModuleInterface.swift in Sources */,
73A6E20422CEE51600E9BC68 /* BadgeLabel.swift in Sources */,
73FE883D228A4A8C00A5EB56 /* OrderHistoryWireframe.swift in Sources */,
@ -14555,7 +14319,6 @@
D922D9432135124200D43053 /* SendMoneyPaymentModeInteractorIO.swift in Sources */,
D96BD118216479E200DFE7D8 /* WalletStatementInteractorIO.swift in Sources */,
D922D9482135124200D43053 /* SendMoneyPaymentModeViewController.swift in Sources */,
7318535A230EACA400BA9AE3 /* EditReciepientInteractorIO.swift in Sources */,
BE74AFC9227C8FF200F05CE7 /* AutoDebitInteractor.swift in Sources */,
FF6E7D8E21BF951D00A003B9 /* AppUpdateInteractor.swift in Sources */,
D9B7ADFD2130073A009B0564 /* WireframeInput.swift in Sources */,
@ -14580,7 +14343,6 @@
73BCCDD6228993040057B161 /* RewardGroupWireframe.swift in Sources */,
73BCCDD0228993040057B161 /* RewardGroupServiceType.swift in Sources */,
D950BED321549242008367A1 /* HomeService.swift in Sources */,
73185349230EACA400BA9AE3 /* AddReciepientInteractor.swift in Sources */,
045976B221A3D8F30001E92A /* AutoRefundsViewController.swift in Sources */,
D9D22429224078D000C7313D /* ResendTableViewCell.swift in Sources */,
043770EF21AD04240005B22D /* PennyTestViewInterface.swift in Sources */,
@ -14609,7 +14371,6 @@
D90A9D66213696E400A96E45 /* BankPickerViewController.swift in Sources */,
04DC27EE21A51E83003714F5 /* autoRefundService.swift in Sources */,
D9BE022D21E2DD45003AA8C7 /* PaymentSelectionPresenter.swift in Sources */,
73185347230EACA400BA9AE3 /* AddReciepientServiceType.swift in Sources */,
73FE883B228A4A8C00A5EB56 /* OrderHistoryInteractor.swift in Sources */,
730197B622535135001954AB /* kycForm2ViewController.swift in Sources */,
049E61A51FF0AE9D00817C76 /* UrlManager.swift in Sources */,
@ -14618,13 +14379,11 @@
BE74AFC1227C8FF200F05CE7 /* AddAccountWireframeInput.swift in Sources */,
BEC9AFFC224FC49C00A2DA06 /* BiometricAuthenticationModuleInterface.swift in Sources */,
730D7886227A94E1007E517E /* RedeemViewController.swift in Sources */,
73185354230EACA400BA9AE3 /* AddReciepientViewController.swift in Sources */,
D97785A3215DC55F00754079 /* TransactionHistoryWireframeInput.swift in Sources */,
7383F43622DEB864003D6393 /* GMEDB.swift in Sources */,
04E36E2021AE585200783685 /* PennyTestSubmitWireframeInput.swift in Sources */,
D90A9D5C2136942300A96E45 /* BankBranchPickerViewController.swift in Sources */,
D922D9682135145F00D43053 /* SendMoneyParentWireframe.swift in Sources */,
7318535B230EACA400BA9AE3 /* EditReciepientPresenter.swift in Sources */,
736A8C402277EB2A00337A50 /* BiometricNotificationModuleInterface.swift in Sources */,
73149F6422E5AF8000D66B26 /* LauncherScreenServiceType.swift in Sources */,
73071ACD2296CF9B008840FD /* HotLineViewInterface.swift in Sources */,
@ -14632,8 +14391,6 @@
D922D9A821351B7400D43053 /* SendMoneyVerificationModuleInterface.swift in Sources */,
730197AE22535135001954AB /* kycForm2Service.swift in Sources */,
D950BEDB21549242008367A1 /* HomeViewInterface.swift in Sources */,
73185355230EACA400BA9AE3 /* AddReciepientViewInterface.swift in Sources */,
7318535E230EACA400BA9AE3 /* EditReciepientWireframe.swift in Sources */,
FF6E7D9121BF951D00A003B9 /* AppUpdateServiceType.swift in Sources */,
D945F11F213E1D5100A24824 /* SendMoneyReceiptServiceType.swift in Sources */,
D96BD117216479E200DFE7D8 /* WalletStatementService.swift in Sources */,
@ -14658,7 +14415,6 @@
D92E6570222620A0004D1B3D /* SendMoneyCodeViewInterface.swift in Sources */,
73469FA02293C1B00062946B /* SelectPaymentViewController.swift in Sources */,
D97785A4215DC55F00754079 /* TransactionHistoryWireframe.swift in Sources */,
7318534B230EACA400BA9AE3 /* AddReciepientPresenter.swift in Sources */,
D96848CC212D3F2300EF12B1 /* ExchangeRateApiService.swift in Sources */,
D9A060DB223F680B00F5D7C4 /* ResendExchangeInteractorIO.swift in Sources */,
D9DC108421639E56008F3C51 /* SuccessMessage.swift in Sources */,

28
GME Remit/Models/Response/SendMoneyCountryViewModel.swift

@ -0,0 +1,28 @@
//
// SendMoneyCountryStructure.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class SendMoneyCountryViewModel {
var id: String?
var name: String?
var title: String?
var code: String?
var proviencesRequired: String?
var proviences: [SendMoneyProvienceViewModel]?
}
extension SendMoneyCountryViewModel: TablePresenterProtocol {
var cellTitle: String? {
return name
}
var cellImage: UIImage? {
return CountryEnum(rawValue: code?.lowercased() ?? "")?.flag
}
}

2
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/ViewModels/SendMoneyDistrictViewModel.swift → GME Remit/Models/Response/SendMoneyDistrictViewModel.swift

@ -21,6 +21,4 @@ extension SendMoneyDistrictViewModel: TablePresenterProtocol {
var cellImage: UIImage? {
return nil
}
}

0
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/ViewModels/SendMoneyProvinceViewModel.swift → GME Remit/Models/Response/SendMoneyProvinceViewModel.swift

4
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/ViewModels/SendMoneyRelationViewModel.swift → GME Remit/Models/Response/SendMoneyRelationViewModel.swift

@ -21,7 +21,5 @@ extension SendMoneyRelationViewModel: TablePresenterProtocol {
var cellImage: UIImage? {
return nil
}
}
}

0
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/ViewModels/SendMoneyTransFerReasonViewModel.swift → GME Remit/Models/Response/SendMoneyTransFerReasonViewModel.swift

47
GME Remit/Modules/RecipientModules/AddReciepient/Application Logic/Interactor/AddReciepientInteractor.swift

@ -1,47 +0,0 @@
//
// AddReciepientInteractor.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class AddReciepientInteractor {
// MARK: Properties
weak var output: AddReciepientInteractorOutput?
private let service: AddReciepientServiceType
// MARK: Initialization
init(service: AddReciepientServiceType) {
self.service = service
}
// MARK: Converting entities
}
// MARK: AddReciepient interactor input interface
extension AddReciepientInteractor: AddReciepientInteractorInput {
func viewIsReady() {
self.service.fetch(success: { (model) in
self.output?.show(model: model)
}) { (error) in
self.output?.show(error: error)
}
}
func save(reciepient: Recipient) {
let myUsername = Utility.getMyUserName()
self.service.save(model: reciepient.serialize(), username: myUsername, success: { (reciepient) in
self.output?.success()
}) { (error) in
self.output?.show(error: error)
}
}
}

18
GME Remit/Modules/RecipientModules/AddReciepient/Application Logic/Interactor/AddReciepientInteractorIO.swift

@ -1,18 +0,0 @@
//
// AddReciepientInteractorIO.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol AddReciepientInteractorInput: class {
func viewIsReady()
func save(reciepient: Recipient)
}
protocol AddReciepientInteractorOutput: class {
func show(error: Error)
func show(model: SendMoneyModel?)
func success()
}

21
GME Remit/Modules/RecipientModules/AddReciepient/Application Logic/Service/AddReciepientService.swift

@ -1,21 +0,0 @@
//
// AddReciepientService.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
import Alamofire
class AddReciepientService: AddReciepientServiceType {
// MARK: Properties
// MARK: Initialization
// MARK: Data management
}

57
GME Remit/Modules/RecipientModules/AddReciepient/Application Logic/Service/AddReciepientServiceType.swift

@ -1,57 +0,0 @@
//
// AddReciepientServiceType.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
protocol AddReciepientServiceType: class, FetchSendMoneyInformation, SaveReciepientService {
}
protocol FetchSendMoneyInformation: ApiServiceType {
func fetch(success: @escaping (SendMoneyModel?) -> (), failure: @escaping (Error) -> () )
}
extension FetchSendMoneyInformation {
func fetch(success: @escaping (SendMoneyModel?) -> (), failure: @escaping (Error) -> () ) {
let url = baseUrl + "/mobile/loadform/receiver"
auth.request(method: .get, url: url, params: nil, success: { (response: SendMoneyInformationContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""])
failure(error)
}else {
let model = response.data
success(model)
}
}) { (error) in
failure(error)
}
}
}
protocol SaveReciepientService: ApiServiceType {
func save(model:[String: String], username: String, success: @escaping (Recipient?) -> (), failure: @escaping (Error) -> ())
}
extension SaveReciepientService {
func save(model:[String: String], username: String, success: @escaping (Recipient?) -> (), failure: @escaping (Error) -> ()) {
let url = baseUrl + "/mobile/receiver/save/" + username
auth.request(method: .post, url: url, params: model, success: { (response: RecipientContainer) in
if (response.errorCode ?? "") == "1" {
let error = NSError.init(domain: "Network", code: 0, userInfo: [NSLocalizedDescriptionKey : response.message ?? ""])
failure(error)
}else {
let model = response.data
success(model)
}
}) { (error) in
failure(error)
}
}
}

12
GME Remit/Modules/RecipientModules/AddReciepient/Module Interface/AddReciepientModuleInterface.swift

@ -1,12 +0,0 @@
//
// AddReciepientModuleInterface.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol AddReciepientModuleInterface: class {
func viewIsReady()
func save(model: ReceipientViewModel)
}

BIN
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/Presenter/.DS_Store

143
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/Presenter/AddReciepientPresenter.swift

@ -1,143 +0,0 @@
//
// AddReciepientPresenter.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class AddReciepientPresenter {
// MARK: Properties
var transferReasons: [TransferReason] = []
var relations: [Relation] = []
var countries: [CountryModel] = []
weak var view: AddReciepientViewInterface?
var interactor: AddReciepientInteractorInput?
var wireframe: AddReciepientWireframeInput?
// MARK: Converting entities
func convert(models: [CountryModel]) {
let viewmodels: [SendMoneyCountryViewModel] = models.map({
let viewmodel = SendMoneyCountryViewModel()
viewmodel.name = $0.name
viewmodel.code = $0.code
viewmodel.id = $0.id
viewmodel.proviencesRequired = $0.provienceRequired
viewmodel.proviences = self.convert(models: $0.proviences ?? [])
return viewmodel
})
self.view?.show(countries: viewmodels)
}
func convert(models: [Provience]) -> [SendMoneyProvienceViewModel] {
return models.map({
var viewmodel = SendMoneyProvienceViewModel()
viewmodel.name = $0.name
viewmodel.id = $0.id
viewmodel.districts = self.convert(models: $0.districts ?? [])
return viewmodel
})
}
func convert(models: [District]) -> [SendMoneyDistrictViewModel] {
let viewmodels: [SendMoneyDistrictViewModel] = models.map({
let viewmodel = SendMoneyDistrictViewModel()
viewmodel.name = $0.name
viewmodel.id = $0.id
return viewmodel
})
return viewmodels
}
func convert(models: [TransferReason]) {
let viewmodels: [SendMoneyTransferReasonViewModel] = models.map({
var viewmodel = SendMoneyTransferReasonViewModel()
viewmodel.title = $0.title
viewmodel.id = $0.id
return viewmodel
})
self.view?.show(transferReasons: viewmodels)
}
func convert(models: [Relation]) {
let viewmodels: [SendMoneyRelationViewModel] = models.map({
var viemodel = SendMoneyRelationViewModel()
viemodel.title = $0.title
viemodel.id = $0.id
return viemodel
})
self.view?.show(relations: viewmodels)
}
func convert(model: ReceipientViewModel) {
var reciepient = Recipient()
reciepient.firstName = model.firstName
reciepient.middleName = model.middleName
reciepient.lastName = model.lastName
reciepient.countryID = model.countryId
reciepient.stateID = model.stateId
reciepient.districtID = model.districtId
reciepient.city = model.city
reciepient.address = model.address
reciepient.relationshipID = model.relationId
reciepient.purposeOfRemitID = model.reasonId
reciepient.mobile = model.mobileNumber
reciepient.email = model.email
reciepient.idType = model.idType
reciepient.idNumber = model.idNumber
self.interactor?.save(reciepient: reciepient)
}
}
// MARK: AddReciepient module interface
extension AddReciepientPresenter: AddReciepientModuleInterface {
func viewIsReady() {
self.view?.showLoading()
self.interactor?.viewIsReady()
}
func save(model: ReceipientViewModel) {
self.convert(model: model)
}
}
// MARK: AddReciepient interactor output interface
extension AddReciepientPresenter: AddReciepientInteractorOutput {
func show(model: SendMoneyModel?) {
self.transferReasons = model?.transferReasons ?? []
self.relations = model?.relations ?? []
self.countries = model?.countries ?? []
//TODO: set IDTYPES
self.view?.setReceiverIDTypes(with: model?.receiverIDTypes)
self.view?.hideLoading()
self.convert(models: self.countries)
self.convert(models: self.transferReasons)
self.convert(models: self.relations)
}
func show(error: Error) {
self.view?.hideLoading()
self.view?.show(error: error.localizedDescription)
}
func success() {
print("successfully added")
self.wireframe?.dismiss()
}
}

BIN
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/.DS_Store

468
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/AddReciepient.storyboard

@ -1,468 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<customFonts key="customFonts">
<array key="SanFranciscoDisplay-Regular.otf">
<string>SanFranciscoDisplay-Regular</string>
</array>
<array key="SanFranciscoText-Regular.otf">
<string>SanFranciscoText-Regular</string>
</array>
</customFonts>
<scenes>
<!--Add Reciepient View Controller-->
<scene sceneID="ZG4-BZ-Fvd">
<objects>
<viewController storyboardIdentifier="AddReciepientViewController" id="qUw-b7-h89" customClass="AddReciepientViewController" customModule="GME_Remit" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="c8w-qG-Ce8">
<rect key="frame" x="0.0" y="0.0" width="375" height="1100"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" keyboardDismissMode="onDrag" translatesAutoresizingMaskIntoConstraints="NO" id="2cy-hR-Fme">
<rect key="frame" x="0.0" y="0.0" width="375" height="1100"/>
<subviews>
<view contentMode="scaleToFill" placeholderIntrinsicWidth="375" placeholderIntrinsicHeight="900" translatesAutoresizingMaskIntoConstraints="NO" id="MHV-aS-FoL">
<rect key="frame" x="0.0" y="0.0" width="375" height="1078"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="30" translatesAutoresizingMaskIntoConstraints="NO" id="bJg-iS-Pg8">
<rect key="frame" x="10" y="0.0" width="355" height="1048"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="Lsn-v9-r4g">
<rect key="frame" x="0.0" y="0.0" width="355" height="968"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="Fgq-xq-dmN" userLabel="TitleStackView">
<rect key="frame" x="0.0" y="0.0" width="355" height="63"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Who are you sending money to?" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5JE-5D-wSW">
<rect key="frame" x="0.0" y="0.0" width="355" height="63"/>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="63" id="375-5c-DNf"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="18"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="4GX-ko-nbw" userLabel="ContentStackView">
<rect key="frame" x="0.0" y="68" width="355" height="900"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="e8u-s3-fVl">
<rect key="frame" x="0.0" y="0.0" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="First Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RPh-p3-dap">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's full name" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="ydp-IU-Ddb">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="afy-81-2it"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="BQc-tA-RUn">
<rect key="frame" x="0.0" y="70" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Middle Name (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lwa-xS-Mou">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's middle name" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="Bgi-hL-Wf6">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="tLl-P0-Zbh"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="A3K-Ig-mN9">
<rect key="frame" x="0.0" y="140" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Last Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aos-AF-iaO">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's last name" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="xvn-Xq-Poa">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="Ls2-ds-JKU"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="kmX-kn-0uS">
<rect key="frame" x="0.0" y="210" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Country" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="gnB-aR-bJE">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="rTf-lL-eJb">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="69q-4x-Lyu"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="Uwb-JF-Lu9">
<rect key="frame" x="0.0" y="280" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="State/Province" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hX8-qF-mLG">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="SpT-9V-3C8">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="Tby-y3-sva"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="EtN-9R-GQt">
<rect key="frame" x="0.0" y="350" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="District" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QCa-CZ-ElQ">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="6qj-la-Mgu">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="pSC-rQ-oQk"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="fh8-Q6-q8A">
<rect key="frame" x="0.0" y="420" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="City" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="woC-KH-z7x">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's City" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="cHL-Cf-h5a">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="UAG-D4-uH5"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="blF-qq-qJe">
<rect key="frame" x="0.0" y="490" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Address" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Y1V-LP-rwg">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's Address" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="R9T-Lf-bM4">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="FVQ-W0-QKk"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="O4c-KR-vEE">
<rect key="frame" x="0.0" y="560" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Relation" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="aVB-K7-liY">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="vZS-DH-n7I">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="9YL-SW-YnM"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="7Tk-n4-kZ1">
<rect key="frame" x="0.0" y="630" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Mobile No." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="s2u-oR-Os8">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's mobile number" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="vAR-h8-elx">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="HQh-Pf-Mui"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="phonePad"/>
</textField>
</subviews>
</stackView>
<stackView hidden="YES" opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="2Kh-Q2-iMo">
<rect key="frame" x="0.0" y="695" width="355" height="43"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Email (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rIa-a1-cYb">
<rect key="frame" x="0.0" y="0.0" width="355" height="0.0"/>
<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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's email address" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="ipS-s7-o8E">
<rect key="frame" x="0.0" y="0.0" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="106-th-a9p"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="emailAddress"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="iLj-pG-L6B">
<rect key="frame" x="0.0" y="700" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Transfer Reason" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="F7d-NL-98o">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="LWI-ug-ZGq">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="Vvx-Qi-ol9"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="I2d-JJ-OvN" userLabel="IDType">
<rect key="frame" x="0.0" y="770" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ID Type (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LCW-9T-FLU">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="Aqq-Xq-pZT">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<color key="tintColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="gBF-W7-Tev"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="NH9-gT-qAV" userLabel="IDValue">
<rect key="frame" x="0.0" y="840" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ID Number (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="zyl-vG-rKF">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's ID value" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="1YP-BG-HGJ">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="uF9-AD-1Sx"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="numbersAndPunctuation"/>
</textField>
</subviews>
</stackView>
</subviews>
</stackView>
</subviews>
</stackView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BKY-7W-R56">
<rect key="frame" x="77.5" y="998" width="200" height="50"/>
<color key="backgroundColor" red="0.92941176469999998" green="0.10980392160000001" blue="0.14117647059999999" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="H0T-Sg-A4P"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="200" id="MDg-xE-elg"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="18"/>
<state key="normal" title="Save ">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="save:" destination="qUw-b7-h89" eventType="touchUpInside" id="OBq-sC-mBT"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="Lsn-v9-r4g" firstAttribute="top" secondItem="bJg-iS-Pg8" secondAttribute="top" id="Fel-kh-Gh3"/>
<constraint firstAttribute="trailing" secondItem="Lsn-v9-r4g" secondAttribute="trailing" id="g5C-L7-N6L"/>
<constraint firstItem="BKY-7W-R56" firstAttribute="top" secondItem="Lsn-v9-r4g" secondAttribute="bottom" constant="30" id="kmT-FY-Qoy"/>
<constraint firstItem="Lsn-v9-r4g" firstAttribute="leading" secondItem="bJg-iS-Pg8" secondAttribute="leading" id="y0q-5R-KpG"/>
</constraints>
</stackView>
</subviews>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="bJg-iS-Pg8" firstAttribute="leading" secondItem="MHV-aS-FoL" secondAttribute="leading" constant="10" id="OPe-2w-OP2"/>
<constraint firstAttribute="bottom" secondItem="bJg-iS-Pg8" secondAttribute="bottom" constant="30" id="U7a-4z-kCt"/>
<constraint firstItem="bJg-iS-Pg8" firstAttribute="top" secondItem="MHV-aS-FoL" secondAttribute="top" id="fEk-hQ-40p"/>
<constraint firstAttribute="trailing" secondItem="bJg-iS-Pg8" secondAttribute="trailing" constant="10" id="up5-gF-o1R"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="MHV-aS-FoL" secondAttribute="trailing" id="1ud-I2-6Lb"/>
<constraint firstItem="MHV-aS-FoL" firstAttribute="leading" secondItem="2cy-hR-Fme" secondAttribute="leading" id="90P-CP-PlW"/>
<constraint firstItem="MHV-aS-FoL" firstAttribute="width" secondItem="2cy-hR-Fme" secondAttribute="width" id="Sym-CB-EJL"/>
<constraint firstItem="MHV-aS-FoL" firstAttribute="top" secondItem="2cy-hR-Fme" secondAttribute="top" id="bi9-on-vM7"/>
<constraint firstAttribute="bottom" secondItem="MHV-aS-FoL" secondAttribute="bottom" constant="1" id="txH-Zh-JFi"/>
</constraints>
</scrollView>
</subviews>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="2cy-hR-Fme" firstAttribute="trailing" secondItem="Zop-On-Gen" secondAttribute="trailing" id="AdC-nH-U3C"/>
<constraint firstItem="2cy-hR-Fme" firstAttribute="bottom" secondItem="Zop-On-Gen" secondAttribute="bottom" id="POR-FA-cfC"/>
<constraint firstItem="2cy-hR-Fme" firstAttribute="top" secondItem="c8w-qG-Ce8" secondAttribute="top" id="f4T-NC-tiu"/>
<constraint firstItem="2cy-hR-Fme" firstAttribute="leading" secondItem="Zop-On-Gen" secondAttribute="leading" id="oY6-nd-Hs8"/>
</constraints>
<viewLayoutGuide key="safeArea" id="Zop-On-Gen"/>
</view>
<navigationItem key="navigationItem" id="tLQ-eY-0WT">
<barButtonItem key="leftBarButtonItem" systemItem="stop" id="gzw-iW-Xbh">
<color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<connections>
<action selector="touchClose:" destination="qUw-b7-h89" id="16f-VI-FRO"/>
</connections>
</barButtonItem>
</navigationItem>
<size key="freeformSize" width="375" height="1100"/>
<connections>
<outlet property="addressTextField" destination="R9T-Lf-bM4" id="BLz-cZ-WDi"/>
<outlet property="addressTitleLabel" destination="Y1V-LP-rwg" id="nI3-Z7-OcO"/>
<outlet property="cityTextField" destination="cHL-Cf-h5a" id="w9z-Ri-H3k"/>
<outlet property="cityTitleLabel" destination="woC-KH-z7x" id="yrM-iQ-Hqc"/>
<outlet property="countryNameTitleLabel" destination="gnB-aR-bJE" id="SgA-g3-1cr"/>
<outlet property="countryTextField" destination="rTf-lL-eJb" id="Y3T-Mm-ixS"/>
<outlet property="districtStackView" destination="EtN-9R-GQt" id="Usa-Zf-0eQ"/>
<outlet property="districtTextField" destination="6qj-la-Mgu" id="utY-Qw-TW7"/>
<outlet property="districtTitleLabel" destination="QCa-CZ-ElQ" id="9hB-yU-EZQ"/>
<outlet property="emailTextField" destination="ipS-s7-o8E" id="Wq1-Uf-JZ6"/>
<outlet property="firstNameTextField" destination="ydp-IU-Ddb" id="e3J-N4-YFB"/>
<outlet property="firstNameTitleLabel" destination="RPh-p3-dap" id="44g-gl-VAn"/>
<outlet property="headerTItleLabel" destination="5JE-5D-wSW" id="WeN-0w-VRr"/>
<outlet property="idNumberTextField" destination="1YP-BG-HGJ" id="tCU-4M-yUa"/>
<outlet property="idNumberTitleLabel" destination="zyl-vG-rKF" id="x7J-om-P54"/>
<outlet property="idTypeTextField" destination="Aqq-Xq-pZT" id="GCh-J8-0vU"/>
<outlet property="idTypeTitleLabel" destination="LCW-9T-FLU" id="eRu-iS-2Oo"/>
<outlet property="lastNameTextField" destination="xvn-Xq-Poa" id="N7h-0x-nDv"/>
<outlet property="lastNametitleLabel" destination="aos-AF-iaO" id="cHA-Hj-l7c"/>
<outlet property="middleNameTextField" destination="Bgi-hL-Wf6" id="TkH-5j-dq6"/>
<outlet property="middleNameTitleLabel" destination="Lwa-xS-Mou" id="l4m-Vv-q2P"/>
<outlet property="mobileTextField" destination="vAR-h8-elx" id="MjH-nq-c98"/>
<outlet property="mobileTitleLabel" destination="s2u-oR-Os8" id="JIR-vw-QzN"/>
<outlet property="provienceStackView" destination="Uwb-JF-Lu9" id="xOP-ad-oDa"/>
<outlet property="relationTextField" destination="vZS-DH-n7I" id="L6v-QI-VNp"/>
<outlet property="relationTitleLabel" destination="aVB-K7-liY" id="O6y-4R-eTd"/>
<outlet property="saveButton" destination="BKY-7W-R56" id="L0d-XR-kgw"/>
<outlet property="scrollView" destination="2cy-hR-Fme" id="qms-TX-vgv"/>
<outlet property="stateProvinceTextField" destination="SpT-9V-3C8" id="eV6-zF-NWg"/>
<outlet property="stateTitleLabel" destination="hX8-qF-mLG" id="In4-Zh-xLw"/>
<outlet property="transferReasonTextField" destination="LWI-ug-ZGq" id="2wH-pT-rE9"/>
<outlet property="transferTitleLabel" destination="F7d-NL-98o" id="Lz2-UX-ubs"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Xhm-p5-X8Q" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="6138.4057971014499" y="97.098214285714278"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="lM5-1D-ORq">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="uK7-c5-BbW" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="V11-QE-3bn">
<rect key="frame" x="0.0" y="20" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="qUw-b7-h89" kind="relationship" relationship="rootViewController" id="SzN-4G-9E8"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="gNb-BS-V8g" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="5228.985507246377" y="97.098214285714278"/>
</scene>
</scenes>
<color key="tintColor" red="0.78177064659999995" green="0.55228364470000002" blue="0.018981300289999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</document>

493
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/AddReciepientViewController.swift

@ -1,493 +0,0 @@
//
// AddReciepientViewController.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
import IQKeyboardManagerSwift
class AddReciepientViewController: UIViewController {
// MARK: IBOutlets
@IBOutlet private weak var scrollView: UIScrollView!
@IBOutlet private weak var firstNameTextField: UITextField!
@IBOutlet private weak var middleNameTextField: UITextField!
@IBOutlet private weak var lastNameTextField: UITextField!
@IBOutlet private weak var countryTextField: UITextField!
@IBOutlet private weak var stateProvinceTextField: UITextField!
@IBOutlet private weak var districtTextField: UITextField!
@IBOutlet private weak var addressTextField: UITextField!
@IBOutlet private weak var relationTextField: UITextField!
@IBOutlet private weak var mobileTextField: UITextField!
@IBOutlet private weak var emailTextField: UITextField!
@IBOutlet private weak var transferReasonTextField: UITextField!
@IBOutlet private weak var cityTextField: UITextField!
@IBOutlet private weak var saveButton: UIButton!
@IBOutlet private weak var provienceStackView: UIStackView!
@IBOutlet private weak var districtStackView: UIStackView!
// titles
@IBOutlet private weak var headerTItleLabel: UILabel!
@IBOutlet private weak var firstNameTitleLabel: UILabel!
@IBOutlet private weak var middleNameTitleLabel: UILabel!
@IBOutlet private weak var lastNametitleLabel: UILabel!
@IBOutlet private weak var countryNameTitleLabel: UILabel!
@IBOutlet private weak var stateTitleLabel: UILabel!
@IBOutlet private weak var districtTitleLabel: UILabel!
@IBOutlet private weak var addressTitleLabel: UILabel!
@IBOutlet private weak var relationTitleLabel: UILabel!
@IBOutlet private weak var mobileTitleLabel: UILabel!
@IBOutlet private weak var transferTitleLabel: UILabel!
@IBOutlet private weak var cityTitleLabel: UILabel!
// Optional
@IBOutlet weak var idTypeTitleLabel: UILabel!
@IBOutlet weak var idTypeTextField: UITextField!
@IBOutlet weak var idNumberTitleLabel: UILabel!
@IBOutlet weak var idNumberTextField: UITextField!
// MARK: Properties
var presenter: AddReciepientModuleInterface?
private var countries: [SendMoneyCountryViewModel]?
private var transferReasons: [SendMoneyTransferReasonViewModel]?
private var relations: [SendMoneyRelationViewModel]?
private var receiverIDTypes: [ReceiverIdType]?
private var idTypes = [" --- Select ID Type --- "]
private var reciepient: ReceipientViewModel?
private var selectedIDType: ReceiverIdType? {
didSet {
reciepient?.idType = selectedIDType?.id
idTypeTextField.text = selectedIDType?.text
idNumberTextField.isEnabled = selectedIDType != nil ? true : false
if !idNumberTextField.isEnabled {
idNumberTextField.text = nil
}
}
}
private var selectedCountry: SendMoneyCountryViewModel? {
didSet {
self.countryTextField.text = selectedCountry?.name
let shouldShowProvienceField = (selectedCountry?.proviencesRequired ?? "" ) == "true"
self.provienceStackView.isHidden = !shouldShowProvienceField
self.districtStackView.isHidden = !shouldShowProvienceField
self.reciepient?.countryId = self.selectedCountry?.id
mobileTextField.setCoutryFlag(with: selectedCountry?.code)
}
}
private var selectedProvience: SendMoneyProvienceViewModel? {
didSet {
self.stateProvinceTextField.text = selectedProvience?.name
self.reciepient?.stateId = self.selectedProvience?.id
}
}
private var selectedDistrict: SendMoneyDistrictViewModel? {
didSet {
self.districtTextField.text = selectedDistrict?.name
self.reciepient?.districtId = self.selectedDistrict?.id
}
}
private var selectedRelation: SendMoneyRelationViewModel? {
didSet {
self.relationTextField.text = selectedRelation?.title
self.reciepient?.relationId = self.selectedRelation?.id
}
}
private var selectedTransferReason: SendMoneyTransferReasonViewModel? {
didSet {
self.transferReasonTextField.text = selectedTransferReason?.title
self.reciepient?.reasonId = selectedTransferReason?.id
}
}
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setup()
self.setupDelegates()
self.setupTargets()
self.reciepient = ReceipientViewModel()
self.presenter?.viewIsReady()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = "add_recipient_text".localized()
}
// Trying to show keyboard from viewDidLoad where the view might not be loaded fully.
// So try to move becomeFirstResponse related code to viewDidAppear where view loaded fully.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.firstNameTextField.becomeFirstResponder()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = ""
}
// MARK: IBActions
@IBAction private func save(_ sender: UIButton) {
if let reciepient = self.reciepient {
if let code = selectedCountry?.code?.lowercased(),
let countryCode = CountryEnum(rawValue: code),
let mobileNumber = mobileTextField.text {
reciepient.mobileNumber = countryCode.phoneCode + mobileNumber
}
self.presenter?.save(model: reciepient)
}
}
@IBAction func touchClose(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
}
// MARK: Other Functions
private func setTextField(){
self.firstNameTextField.keyboardType = .asciiCapable
self.firstNameTextField.returnKeyType = .next
self.firstNameTextField.autocorrectionType = .no
self.middleNameTextField.keyboardType = .asciiCapable
self.middleNameTextField.returnKeyType = .next
self.middleNameTextField.autocorrectionType = .no
self.lastNameTextField.keyboardType = .asciiCapable
self.lastNameTextField.returnKeyType = .next
self.lastNameTextField.autocorrectionType = .no
self.addressTextField.keyboardType = .asciiCapable
self.addressTextField.returnKeyType = .next
self.addressTextField.autocorrectionType = .no
// for pickerView
let pickerView = UIPickerView()
idTypeTextField.inputView = pickerView
pickerView.delegate = self
pickerView.dataSource = self
}
private func setup() {
// all setup should be done here
self.setupNavigation()
self.configureView()
self.configureLanguage()
self.setTextField()
}
private func configureLanguage() {
self.headerTItleLabel.text = "who_to_send_text".localized()
self.firstNameTitleLabel.text = "first_name_text".localized()
self.middleNameTitleLabel.text = "enter_receiver_middlename_text".localized()
self.lastNametitleLabel.text = "last_name_text".localized()
self.countryNameTitleLabel.text = "country_text".localized()
self.stateTitleLabel.text = "state_text".localized()
self.districtTitleLabel.text = "district_text".localized()
self.addressTitleLabel.text = "address_text".localized()
self.relationTitleLabel.text = "relation_text".localized()
self.mobileTitleLabel.text = "mobile_number_text".localized()
self.transferTitleLabel.text = "transfer_reason_text".localized()
cityTitleLabel.text = "city_text".localized()
saveButton.setTitle("save_text".localized(), for: .normal)
idTypeTitleLabel.text = "id_type_title_text".localized()
idNumberTitleLabel.text = "id_number_title_text".localized()
idTypeTextField.placeholder = "placeholder_enter_id_type_text".localized()
idNumberTextField.placeholder = "placeholder_enter_id_number_text".localized()
// placeholders
self.firstNameTextField.placeholder = "placeholder_enter_receiver_firstname_text".localized()
self.middleNameTextField.placeholder = "placeholder_enter_receiver_middle_text".localized()
self.lastNameTextField.placeholder = "placeholder_enter_receiver_lastname_text".localized()
self.countryTextField.placeholder = "placeholder_select_country_text".localized()
self.stateProvinceTextField.placeholder = "state_placeholder_text".localized()
self.districtTextField.placeholder = "district_placeholder_text".localized()
self.addressTextField.placeholder = "placeholder_enter_receiver_address_text".localized()
self.relationTextField.placeholder = "placeholder_select_relation_text".localized()
self.mobileTextField.placeholder = "placeholder_enter_reciever_mobile_number_text".localized()
self.transferReasonTextField.placeholder = "placeholder_select_transfer_reason_text".localized()
cityTextField.placeholder = "placeholder_enter_city_text".localized()
}
private func configureView() {
self.provienceStackView.isHidden = true
self.districtStackView.isHidden = true
}
private func setupDelegates() {
self.countryTextField.delegate = self
self.stateProvinceTextField.delegate = self
self.districtTextField.delegate = self
self.relationTextField.delegate = self
self.transferReasonTextField.delegate = self
self.firstNameTextField.delegate = self
self.middleNameTextField.delegate = self
self.lastNameTextField.delegate = self
self.countryTextField.delegate = self
self.stateProvinceTextField.delegate = self
self.districtTextField.delegate = self
self.addressTextField.delegate = self
self.relationTextField.delegate = self
self.mobileTextField.delegate = self
}
private func setupTargets() {
[firstNameTextField, middleNameTextField, lastNameTextField, countryTextField, stateProvinceTextField, districtTextField, addressTextField, relationTextField, mobileTextField, emailTextField, transferReasonTextField, cityTextField, idNumberTextField].forEach({
$0.addTarget(self, action: #selector(self.textFieldChanged(sender:)), for: UIControl.Event.editingChanged)
})
}
@objc private func textFieldChanged(sender: UITextField) {
sender.removeNonASCII()
switch sender {
case firstNameTextField:
self.reciepient?.firstName = firstNameTextField.text
case middleNameTextField:
self.reciepient?.middleName = middleNameTextField.text
case lastNameTextField: ()
//FIXME
// self.reciepient?.lastName1 = lastNameTextField.text
case cityTextField:
self.reciepient?.city = cityTextField.text
case addressTextField:
self.reciepient?.address = addressTextField.text
case mobileTextField:
self.reciepient?.mobileNumber = mobileTextField.text
case emailTextField:
self.reciepient?.email = emailTextField.text
case idNumberTextField:
reciepient?.idNumber = idNumberTextField.text
default:
break
}
}
private func setupNavigation() {
self.navigationItem.backBarButtonItem?.image =
#imageLiteral(resourceName: "backIconBlack")
self.navigationController?.navigationBar.tintColor = UIColor.black
}
private func showCountryPickerview() {
TablePresenterWireframe().openWith(
tag: 0,
delegate: self,
model: countries,
source: self
)
}
private func showProviencePickerview() {
TablePresenterWireframe().openWith(
tag: 1,
delegate: self,
model: self.selectedCountry?.proviences,
source: self
)
}
private func showDistrictPickerview() {
TablePresenterWireframe().openWith(
tag: 2,
delegate: self,
model: selectedProvience?.districts,
source: self
)
}
private func showRelationPickerView() {
TablePresenterWireframe().openWith(
tag: 3,
delegate: self,
model: relations,
source: self
)
}
private func showTransferReasonPickerView() {
TablePresenterWireframe().openWith(
tag: 4,
delegate: self,
model: self.transferReasons,
source: self
)
}
internal func showLoading() {
self.showProgressHud()
}
internal func hideLoading() {
self.hideProgressHud()
}
internal func show(error: String) {
self.alert(type: .error, message: error)
}
}
// MARK: AddReciepientViewInterface
extension AddReciepientViewController: AddReciepientViewInterface {
func show(countries: [SendMoneyCountryViewModel]) {
self.countries = countries
}
func show(transferReasons: [SendMoneyTransferReasonViewModel]) {
self.transferReasons = transferReasons
}
func show(relations: [SendMoneyRelationViewModel]) {
self.relations = relations
}
func setReceiverIDTypes(with model: [ReceiverIdType]?) {
receiverIDTypes = model
guard let types = receiverIDTypes?.compactMap ({ $0.text }) else {
return
}
idTypes.append(contentsOf: types)
print("idTypes count: \(idTypes.count)")
}
}
// MARK: - UITextFieldDelegate
extension AddReciepientViewController: UITextFieldDelegate {
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
switch textField {
case countryTextField:
showCountryPickerview()
return false
case stateProvinceTextField:
self.showProviencePickerview()
return false
case districtTextField:
self.showDistrictPickerview()
return false
case relationTextField:
self.showRelationPickerView()
return false
case transferReasonTextField:
self.showTransferReasonPickerView()
return false
default:
return true
}
}
}
// MARK: - UIPickerViewDataSource
extension AddReciepientViewController: UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return idTypes.count
}
}
extension AddReciepientViewController: UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return idTypes[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedIDType = row > 0 ? receiverIDTypes?[row - 1] : nil
}
}
// MARK: - TablePresenterDelegate
extension AddReciepientViewController: TablePresenterDelegate {
func tablePresenterView(_ viewController: TablePresenterViewController) -> TablePresenterConfiguration {
let title: String
let searchPlaceholder: String
switch viewController.view.tag {
case 0:
title = "select_country_text".localized()
searchPlaceholder = "search_country_text".localized()
case 1:
title = "province_placeholder_text".localized()
searchPlaceholder = "search_province_text".localized()
case 2:
title = "select_district_text".localized()
searchPlaceholder = "search_district_text".localized()
case 3:
title = "select_relation_text".localized()
searchPlaceholder = "search_relation_text".localized()
case 4:
title = "select_transfer_reason_text".localized()
searchPlaceholder = "search_transfer_reason_text".localized()
default:
title = ""
searchPlaceholder = ""
}
return TablePresenterConfiguration(
presenterTitle: title,
closeButtonTitle: "cancel_text".localized(),
notFoundTitle: "no_result_found_text".localized(),
searchBarPlaceHolder: searchPlaceholder,
isUseSearchBar: true
)
}
func tablePresenterView(
_ viewController: TablePresenterViewController,
didSelectModel model: TablePresenterProtocol?
) {
switch viewController.view.tag {
case 0: selectedCountry = model as? SendMoneyCountryViewModel
case 1: selectedProvience = model as? SendMoneyProvienceViewModel
case 2: selectedDistrict = model as? SendMoneyDistrictViewModel
case 3: selectedRelation = model as? SendMoneyRelationViewModel
case 4: selectedTransferReason = model as? SendMoneyTransferReasonViewModel
default: break
}
}
}

19
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/AddReciepientViewInterface.swift

@ -1,19 +0,0 @@
//
// AddReciepientViewInterface.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol AddReciepientViewInterface: class {
func show(error: String)
func show(countries: [SendMoneyCountryViewModel])
func show(transferReasons: [SendMoneyTransferReasonViewModel])
func show(relations: [SendMoneyRelationViewModel])
func showLoading()
func hideLoading()
func setReceiverIDTypes(with model: [ReceiverIdType]?)
}

BIN
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/ViewModels/.DS_Store

135
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/View/ViewModels/SendMoneyCountryViewModel.swift

@ -1,135 +0,0 @@
//
// SendMoneyCountryStructure.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class SendMoneyCountryViewModel {
var id: String?
var name: String?
var title: String?
var code: String?
var proviencesRequired: String?
var proviences: [SendMoneyProvienceViewModel]?
}
extension SendMoneyCountryViewModel: TablePresenterProtocol {
var cellTitle: String? {
return name
}
var cellImage: UIImage? {
return CountryEnum(rawValue: code?.lowercased() ?? "")?.flag
}
}
/*
code: AZ // image: Optional(<UIImage: 0x600003517640> size {512, 512} orientation 0 scale 1.000000)
code: AZ // image: Optional(<UIImage: 0x600003517640> size {512, 512} orientation 0 scale 1.000000)
code: BH // image: Optional(<UIImage: 0x60000350eca0> size {512, 512} orientation 0 scale 1.000000)
code: BH // image: Optional(<UIImage: 0x60000350eca0> size {512, 512} orientation 0 scale 1.000000)
code: BD // image: Optional(<UIImage: 0x600003514af0> size {512, 512} orientation 0 scale 1.000000)
code: BD // image: Optional(<UIImage: 0x600003514af0> size {512, 512} orientation 0 scale 1.000000)
code: BY // image: Optional(<UIImage: 0x60000350a5a0> size {512, 512} orientation 0 scale 1.000000)
code: BY // image: Optional(<UIImage: 0x60000350a5a0> size {512, 512} orientation 0 scale 1.000000)
code: BW // image: Optional(<UIImage: 0x600003508460> size {512, 512} orientation 0 scale 1.000000)
code: BW // image: Optional(<UIImage: 0x600003508460> size {512, 512} orientation 0 scale 1.000000)
code: KH // image: Optional(<UIImage: 0x60000350d340> size {512, 512} orientation 0 scale 1.000000)
code: KH // image: Optional(<UIImage: 0x60000350d340> size {512, 512} orientation 0 scale 1.000000)
code: CG // image: nil
code: CG // image: nil
code: ET // image: Optional(<UIImage: 0x600003500bd0> size {512, 512} orientation 0 scale 1.000000)
code: ET // image: Optional(<UIImage: 0x600003500bd0> size {512, 512} orientation 0 scale 1.000000)
code: GM // image: Optional(<UIImage: 0x6000035161b0> size {512, 512} orientation 0 scale 1.000000)
code: GM // image: Optional(<UIImage: 0x6000035161b0> size {512, 512} orientation 0 scale 1.000000)
code: GE // image: Optional(<UIImage: 0x60000352df10> size {512, 512} orientation 0 scale 1.000000)
code: GE // image: Optional(<UIImage: 0x60000352df10> size {512, 512} orientation 0 scale 1.000000)
code: GH // image: Optional(<UIImage: 0x600003515ff0> size {512, 512} orientation 0 scale 1.000000)
code: GH // image: Optional(<UIImage: 0x600003515ff0> size {512, 512} orientation 0 scale 1.000000)
2019-07-25 00:17:03.840151+0900 GME Remit[11447:90229] [UIWorkIntervalTiming] workIntervalStart: startTimestamp > targetTimestamp; rolling forward by 0.100000
code: BY // image: Optional(<UIImage: 0x60000350c0e0> size {512, 512} orientation 0 scale 1.000000)
code: BY // image: Optional(<UIImage: 0x60000350c0e0> size {512, 512} orientation 0 scale 1.000000)
code: GH // image: Optional(<UIImage: 0x60000352d810> size {512, 512} orientation 0 scale 1.000000)
code: GH // image: Optional(<UIImage: 0x60000352d810> size {512, 512} orientation 0 scale 1.000000)
code: IN // image: Optional(<UIImage: 0x600003520d20> size {512, 512} orientation 0 scale 1.000000)
code: IN // image: Optional(<UIImage: 0x600003520d20> size {512, 512} orientation 0 scale 1.000000)
code: ID // image: Optional(<UIImage: 0x60000353fa30> size {256, 256} orientation 0 scale 2.000000)
code: ID // image: Optional(<UIImage: 0x60000353fa30> size {256, 256} orientation 0 scale 2.000000)
2019-07-25 00:17:06.614343+0900 GME Remit[11447:90229] [UIWorkIntervalTiming] workIntervalStart: startTimestamp > targetTimestamp; rolling forward by 0.650000
code: KZ // image: Optional(<UIImage: 0x60000352cbd0> size {512, 512} orientation 0 scale 1.000000)
code: KZ // image: Optional(<UIImage: 0x60000352cbd0> size {512, 512} orientation 0 scale 1.000000)
code: KE // image: Optional(<UIImage: 0x600003513db0> size {512, 512} orientation 0 scale 1.000000)
code: KE // image: Optional(<UIImage: 0x600003513db0> size {512, 512} orientation 0 scale 1.000000)
code: KW // image: Optional(<UIImage: 0x6000035236b0> size {512, 512} orientation 0 scale 1.000000)
code: KW // image: Optional(<UIImage: 0x6000035236b0> size {512, 512} orientation 0 scale 1.000000)
2019-07-25 00:17:07.858126+0900 GME Remit[11447:90229] [WindowServer] display_timer_callback: unexpected state (now:294e8e0d6f6 < expected:294e9da3951)
code: KG // image: Optional(<UIImage: 0x600003501490> size {512, 512} orientation 0 scale 1.000000)
code: KG // image: Optional(<UIImage: 0x600003501490> size {512, 512} orientation 0 scale 1.000000)
code: MY // image: Optional(<UIImage: 0x60000350ce00> size {512, 512} orientation 0 scale 1.000000)
code: MY // image: Optional(<UIImage: 0x60000350ce00> size {512, 512} orientation 0 scale 1.000000)
code: MD // image: Optional(<UIImage: 0x6000035280e0> size {512, 512} orientation 0 scale 1.000000)
code: MD // image: Optional(<UIImage: 0x6000035280e0> size {512, 512} orientation 0 scale 1.000000)
2019-07-25 00:17:08.685048+0900 GME Remit[11447:90229] [UIWorkIntervalTiming] workIntervalStart: startTimestamp > targetTimestamp; rolling forward by 0.083333
code: MN // image: Optional(<UIImage: 0x60000352f090> size {512, 512} orientation 0 scale 1.000000)
code: MN // image: Optional(<UIImage: 0x60000352f090> size {512, 512} orientation 0 scale 1.000000)
code: MA // image: Optional(<UIImage: 0x600003513e90> size {512, 512} orientation 0 scale 1.000000)
code: MA // image: Optional(<UIImage: 0x600003513e90> size {512, 512} orientation 0 scale 1.000000)
code: MM // image: Optional(<UIImage: 0x60000352cbd0> size {512, 512} orientation 0 scale 1.000000)
code: MM // image: Optional(<UIImage: 0x60000352cbd0> size {512, 512} orientation 0 scale 1.000000)
code: NP // image: Optional(<UIImage: 0x600003517d40> size {512, 512} orientation 0 scale 1.000000)
code: NP // image: Optional(<UIImage: 0x600003517d40> size {512, 512} orientation 0 scale 1.000000)
code: NG // image: Optional(<UIImage: 0x6000035153b0> size {512, 512} orientation 0 scale 1.000000)
code: NG // image: Optional(<UIImage: 0x6000035153b0> size {512, 512} orientation 0 scale 1.000000)
code: OM // image: Optional(<UIImage: 0x600003522fb0> size {512, 512} orientation 0 scale 1.000000)
code: OM // image: Optional(<UIImage: 0x600003522fb0> size {512, 512} orientation 0 scale 1.000000)
code: PK // image: Optional(<UIImage: 0x60000352fa30> size {512, 512} orientation 0 scale 1.000000)
code: PK // image: Optional(<UIImage: 0x60000352fa30> size {512, 512} orientation 0 scale 1.000000)
code: PH // image: Optional(<UIImage: 0x60000350cc40> size {512, 512} orientation 0 scale 1.000000)
code: PH // image: Optional(<UIImage: 0x60000350cc40> size {512, 512} orientation 0 scale 1.000000)
code: QA // image: Optional(<UIImage: 0x60000352afb0> size {512, 512} orientation 0 scale 1.000000)
code: QA // image: Optional(<UIImage: 0x60000352afb0> size {512, 512} orientation 0 scale 1.000000)
2019-07-25 00:17:10.467533+0900 GME Remit[11447:90229] [UIWorkIntervalTiming] workIntervalStart: startTimestamp > targetTimestamp; rolling forward by 0.050000
code: RU // image: Optional(<UIImage: 0x600003502bc0> size {512, 512} orientation 0 scale 1.000000)
code: RU // image: Optional(<UIImage: 0x600003502bc0> size {512, 512} orientation 0 scale 1.000000)
code: RW // image: Optional(<UIImage: 0x600003508380> size {512, 512} orientation 0 scale 1.000000)
code: RW // image: Optional(<UIImage: 0x600003508380> size {512, 512} orientation 0 scale 1.000000)
code: SN // image: Optional(<UIImage: 0x6000035088c0> size {512, 512} orientation 0 scale 1.000000)
code: SN // image: Optional(<UIImage: 0x6000035088c0> size {512, 512} orientation 0 scale 1.000000)
code: SC // image: Optional(<UIImage: 0x6000035089a0> size {512, 512} orientation 0 scale 1.000000)
code: SC // image: Optional(<UIImage: 0x6000035089a0> size {512, 512} orientation 0 scale 1.000000)
code: SL // image: Optional(<UIImage: 0x600003514a10> size {512, 512} orientation 0 scale 1.000000)
code: SL // image: Optional(<UIImage: 0x600003514a10> size {512, 512} orientation 0 scale 1.000000)
code: SG // image: Optional(<UIImage: 0x600003509340> size {512, 512} orientation 0 scale 1.000000)
code: SG // image: Optional(<UIImage: 0x600003509340> size {512, 512} orientation 0 scale 1.000000)
code: ZA // image: Optional(<UIImage: 0x600003521b20> size {512, 512} orientation 0 scale 1.000000)
code: ZA // image: Optional(<UIImage: 0x600003521b20> size {512, 512} orientation 0 scale 1.000000)
code: LK // image: Optional(<UIImage: 0x60000350fb10> size {512, 512} orientation 0 scale 1.000000)
code: LK // image: Optional(<UIImage: 0x60000350fb10> size {512, 512} orientation 0 scale 1.000000)
code: TJ // image: Optional(<UIImage: 0x60000352cf50> size {512, 512} orientation 0 scale 1.000000)
code: TJ // image: Optional(<UIImage: 0x60000352cf50> size {512, 512} orientation 0 scale 1.000000)
code: TH // image: Optional(<UIImage: 0x60000350f170> size {512, 512} orientation 0 scale 1.000000)
code: TH // image: Optional(<UIImage: 0x60000350f170> size {512, 512} orientation 0 scale 1.000000)
code: TN // image: Optional(<UIImage: 0x60000352a990> size {512, 512} orientation 0 scale 1.000000)
code: TN // image: Optional(<UIImage: 0x60000352a990> size {512, 512} orientation 0 scale 1.000000)
code: UG // image: Optional(<UIImage: 0x600003502d80> size {512, 512} orientation 0 scale 1.000000)
code: UG // image: Optional(<UIImage: 0x600003502d80> size {512, 512} orientation 0 scale 1.000000)
code: AE // image: Optional(<UIImage: 0x60000352b330> size {512, 512} orientation 0 scale 1.000000)
code: AE // image: Optional(<UIImage: 0x60000352b330> size {512, 512} orientation 0 scale 1.000000)
2019-07-25 00:17:12.511614+0900 GME Remit[11447:90229] [UIWorkIntervalTiming] workIntervalStart: startTimestamp > targetTimestamp; rolling forward by 0.100000
code: UZ // image: Optional(<UIImage: 0x600003520700> size {512, 512} orientation 0 scale 1.000000)
code: UZ // image: Optional(<UIImage: 0x600003520700> size {512, 512} orientation 0 scale 1.000000)
code: VN // image: Optional(<UIImage: 0x60000353bdb0> size {512, 512} orientation 0 scale 1.000000)
code: VN // image: Optional(<UIImage: 0x60000353bdb0> size {512, 512} orientation 0 scale 1.000000)
code: YE // image: Optional(<UIImage: 0x6000035018f0> size {512, 512} orientation 0 scale 1.000000)
code: YE // image: Optional(<UIImage: 0x6000035018f0> size {512, 512} orientation 0 scale 1.000000)
code: TN // image: Optional(<UIImage: 0x60000352a990> size {512, 512} orientation 0 scale 1.000000)
code: TN // image: Optional(<UIImage: 0x60000352a990> size {512, 512} orientation 0 scale 1.000000)
*/

40
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/Wireframe/AddReciepientWireframe.swift

@ -1,40 +0,0 @@
//
// AddReciepientWireframe.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class AddReciepientWireframe {
weak var view: UIViewController!
}
extension AddReciepientWireframe: AddReciepientWireframeInput {
var storyboardName: String {return "AddReciepient"}
func getMainView() -> UIViewController {
let service = AddReciepientService()
let interactor = AddReciepientInteractor(service: service)
let presenter = AddReciepientPresenter()
let viewController = viewControllerFromStoryboard(of: AddReciepientViewController.self)
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
self.view = viewController
return viewController
}
func dismiss() {
if let navigation = self.view.navigationController {
navigation.popViewController(animated: true)
}
}
}

13
GME Remit/Modules/RecipientModules/AddReciepient/User Interface/Wireframe/AddReciepientWireframeInput.swift

@ -1,13 +0,0 @@
//
// AddReciepientWireframeInput.swift
// GMERemittance
//
// Created by gme_2 on 26/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
protocol AddReciepientWireframeInput: WireframeInput {
func dismiss()
}

BIN
GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Interactor/.DS_Store

50
GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Interactor/EditReciepientInteractor.swift

@ -1,50 +0,0 @@
//
// EditReciepientInteractor.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class EditReciepientInteractor {
// MARK: Properties
weak var output: EditReciepientInteractorOutput?
private let service: EditReciepientServiceType
var reciepient: Recipient
// MARK: Initialization
init(service: EditReciepientServiceType, reciepient: Recipient) {
self.service = service
self.reciepient = reciepient
}
// MARK: Converting entities
}
// MARK: EditReciepient interactor input interface
extension EditReciepientInteractor: EditReciepientInteractorInput {
func viewIsReady() {
self.service.fetch(success: { (model) in
self.output?.show(model: model)
self.output?.show(recipient: self.reciepient)
}) { (error) in
self.output?.show(error: error)
}
}
func save(reciepient: Recipient) {
let myUsername = GMEDB.shared.user.string(.userId) ?? ""
self.service.save(model: reciepient.serialize(), username: myUsername, success: { (reciepient) in
self.output?.success()
}) { (error) in
self.output?.show(error: error)
}
}
}

19
GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Interactor/EditReciepientInteractorIO.swift

@ -1,19 +0,0 @@
//
// EditReciepientInteractorIO.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol EditReciepientInteractorInput: class {
func viewIsReady()
func save(reciepient: Recipient)
}
protocol EditReciepientInteractorOutput: class {
func show(error: Error)
func show(model: SendMoneyModel?)
func success()
func show(recipient: Recipient)
}

18
GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Service/EditReciepientService.swift

@ -1,18 +0,0 @@
//
// EditReciepientService.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class EditReciepientService: EditReciepientServiceType {
// MARK: Properties
// MARK: Initialization
// MARK: Data management
}

13
GME Remit/Modules/RecipientModules/EditReciepient/Application Logic/Service/EditReciepientServiceType.swift

@ -1,13 +0,0 @@
//
// EditReciepientServiceType.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
protocol EditReciepientServiceType: class, FetchSendMoneyInformation, SaveReciepientService {
}

12
GME Remit/Modules/RecipientModules/EditReciepient/Module Interface/EditReciepientModuleInterface.swift

@ -1,12 +0,0 @@
//
// EditReciepientModuleInterface.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol EditReciepientModuleInterface: class {
func viewIsReady()
func save(model: EditRecipientRecipientViewModel)
}

BIN
GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Presenter/.DS_Store

178
GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Presenter/EditReciepientPresenter.swift

@ -1,178 +0,0 @@
//
// EditReciepientPresenter.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class EditReciepientPresenter {
// MARK: Properties
var transferReasons: [TransferReason] = []
var relations: [Relation] = []
var countries: [CountryModel] = []
weak var view: EditReciepientViewInterface?
var interactor: EditReciepientInteractorInput?
var wireframe: EditReciepientWireframeInput?
// MARK: Converting entities
func convert(models: [CountryModel]) {
let viewmodels: [SendMoneyCountryViewModel] = models.map({
let viewmodel = SendMoneyCountryViewModel()
viewmodel.name = $0.name
viewmodel.code = $0.code
viewmodel.id = $0.id
viewmodel.proviencesRequired = $0.provienceRequired
viewmodel.proviences = self.convert(models: $0.proviences ?? [])
return viewmodel
})
self.view?.show(countries: viewmodels)
}
func convert(models: [Provience]) -> [SendMoneyProvienceViewModel] {
return models.map({
var viewmodel = SendMoneyProvienceViewModel()
viewmodel.name = $0.name
viewmodel.id = $0.id
viewmodel.districts = self.convert(models: $0.districts ?? [])
return viewmodel
})
}
func convert(models: [District]) -> [SendMoneyDistrictViewModel] {
let viewmodels: [SendMoneyDistrictViewModel] = models.map({
let viewmodel = SendMoneyDistrictViewModel()
viewmodel.name = $0.name
viewmodel.id = $0.id
return viewmodel
})
return viewmodels
}
func convert(models: [TransferReason]) {
let viewmodels: [SendMoneyTransferReasonViewModel] = models.map({
var viewmodel = SendMoneyTransferReasonViewModel()
viewmodel.title = $0.title
viewmodel.id = $0.id
return viewmodel
})
self.view?.show(transferReasons: viewmodels)
}
func convert(models: [Relation]) {
let viewmodels: [SendMoneyRelationViewModel] = models.map({
var viemodel = SendMoneyRelationViewModel()
viemodel.title = $0.title
viemodel.id = $0.id
return viemodel
})
self.view?.show(relations: viewmodels)
}
func convert(model: EditRecipientRecipientViewModel) {
var reciepient = Recipient()
reciepient.receiverID = model.id
reciepient.firstName = model.firstName
reciepient.middleName = model.middleName
reciepient.lastName = model.lastName
reciepient.countryID = model.countryId
reciepient.country = model.country
reciepient.stateID = model.stateId
reciepient.state = model.state
reciepient.district = model.district
reciepient.districtID = model.districtId
reciepient.city = model.city
reciepient.address = model.address
reciepient.relationship = model.relation
reciepient.relationshipID = model.relationId
reciepient.purposeOfRemit = model.reason
reciepient.purposeOfRemitID = model.reasonId
reciepient.mobile = model.mobileNumber
reciepient.email = model.email
reciepient.idType = model.idType
reciepient.idNumber = model.idNumber
self.interactor?.save(reciepient: reciepient)
}
func convert(model: Recipient) {
let reciepient = EditRecipientRecipientViewModel()
reciepient.id = model.receiverID
reciepient.firstName = model.firstName
reciepient.middleName = model.middleName
reciepient.lastName = model.lastName
reciepient.country = model.country
reciepient.countryId = model.countryID
reciepient.state = model.state
reciepient.stateId = model.stateID
reciepient.city = model.city
reciepient.address = model.address
reciepient.relation = model.relationship
reciepient.relationId = model.relationshipID
reciepient.reason = model.purposeOfRemit
reciepient.reasonId = model.purposeOfRemitID
reciepient.mobileNumber = model.mobile
reciepient.email = model.email
reciepient.district = model.district
reciepient.districtId = model.districtID
reciepient.idType = model.idType
reciepient.idNumber = model.idNumber
self.view?.show(recipient: reciepient)
}
}
// MARK: EditReciepient module interface
extension EditReciepientPresenter: EditReciepientModuleInterface {
func viewIsReady() {
self.view?.showLoading()
self.interactor?.viewIsReady()
}
func save(model: EditRecipientRecipientViewModel) {
self.convert(model: model)
}
}
// MARK: EditReciepient interactor output interface
extension EditReciepientPresenter: EditReciepientInteractorOutput {
func show(model: SendMoneyModel?) {
self.transferReasons = model?.transferReasons ?? []
self.relations = model?.relations ?? []
self.countries = model?.countries ?? []
//TODO: set IDTYPES
self.view?.setReceiverIDTypes(with: model?.receiverIDTypes)
self.view?.hideLoading()
self.convert(models: self.countries)
self.convert(models: self.transferReasons)
self.convert(models: self.relations)
}
func show(error: Error) {
self.view?.hideLoading()
self.view?.show(error: error.localizedDescription)
}
func success() {
print("successfully added")
self.wireframe?.dismiss()
}
func show(recipient: Recipient) {
self.convert(model: recipient)
}
}

33
GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Presenter/EditRecipientRecipientViewModel.swift

@ -1,33 +0,0 @@
//
// EditRecipientRecipientViewModel.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
// Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
class EditRecipientRecipientViewModel {
var id: String?
var firstName: String?
var middleName: String?
var lastName: String?
var country: String?
var state: String?
var stateId: String?
var city: String?
var address: String?
var district: String?
var districtId: String?
var relation: String?
var relationId: String?
var mobileNumber: String?
var email: String?
var recipientId: String?
var reason: String?
var reasonId: String?
var countryId: String?
var idType: String?
var idNumber: String?
}

BIN
GME Remit/Modules/RecipientModules/EditReciepient/User Interface/View/.DS_Store

466
GME Remit/Modules/RecipientModules/EditReciepient/User Interface/View/EditReciepient.storyboard

@ -1,466 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<customFonts key="customFonts">
<array key="SanFranciscoDisplay-Regular.otf">
<string>SanFranciscoDisplay-Regular</string>
</array>
<array key="SanFranciscoText-Regular.otf">
<string>SanFranciscoText-Regular</string>
</array>
</customFonts>
<scenes>
<!--Edit Reciepient View Controller-->
<scene sceneID="lea-Vo-MFn">
<objects>
<viewController storyboardIdentifier="EditReciepientViewController" id="kMF-hK-7F1" customClass="EditReciepientViewController" customModule="GME_Remit" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="yoy-Sr-xLN">
<rect key="frame" x="0.0" y="0.0" width="375" height="1100"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3nW-iI-E46">
<rect key="frame" x="0.0" y="0.0" width="375" height="1100"/>
<subviews>
<view contentMode="scaleToFill" placeholderIntrinsicWidth="375" placeholderIntrinsicHeight="1100" translatesAutoresizingMaskIntoConstraints="NO" id="M1b-5m-MXH">
<rect key="frame" x="0.0" y="0.0" width="375" height="1148"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" spacing="30" translatesAutoresizingMaskIntoConstraints="NO" id="akh-17-UFk">
<rect key="frame" x="10" y="0.0" width="355" height="1118"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="z9e-FF-DG8">
<rect key="frame" x="0.0" y="0.0" width="355" height="1038"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="pjd-YW-ZnH">
<rect key="frame" x="0.0" y="0.0" width="355" height="63"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Who are you sending money to?" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Gt4-fi-XBm">
<rect key="frame" x="0.0" y="0.0" width="355" height="63"/>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="63" id="JEL-6w-EYR"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="18"/>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="fillEqually" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="e9s-tP-DdN">
<rect key="frame" x="0.0" y="68" width="355" height="970"/>
<subviews>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="a7v-9T-Kcl">
<rect key="frame" x="0.0" y="0.0" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="First Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uA5-jW-mEK">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's first name" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="9Hx-oK-GHi">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="BFc-f4-Df9"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="XxH-Jy-JZG">
<rect key="frame" x="0.0" y="70" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Middle Name (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="K3e-7G-CJy">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's middle name" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="Eej-kG-wrd">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="hyU-Gu-CK0"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="5rx-Wn-cUa">
<rect key="frame" x="0.0" y="140" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Last Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tkw-bR-Oy9">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's last name" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="Wd8-zG-klN">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="uAd-ed-1fn"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="QCh-a4-Tx8">
<rect key="frame" x="0.0" y="210" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Country" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="alw-ys-yay">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="DdO-f1-13k">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="dF5-bD-WvK"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="Ju9-Yd-QNB">
<rect key="frame" x="0.0" y="280" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="State/Province" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2Ta-4K-fuz">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="3aF-XI-LRm">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="L5Y-xb-hga"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="3v6-GM-odc">
<rect key="frame" x="0.0" y="350" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="District" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1Oh-OJ-MbF">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="c9l-2n-RJY">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="7dg-OF-1iL"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="bzY-A3-FCG">
<rect key="frame" x="0.0" y="420" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="City" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qfo-M5-t8w">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's city" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="N3C-4L-Ki7">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="ZJj-ea-FF9"/>
</constraints>
<color key="textColor" red="0.2901960784" green="0.2901960784" blue="0.2901960784" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="9F3-Xx-a4b">
<rect key="frame" x="0.0" y="490" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Address" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LNf-pd-Eek">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's Address" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="vGP-fz-jbt">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="aT8-I4-gb5"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="alphabet"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="gkA-0g-al0">
<rect key="frame" x="0.0" y="560" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Relation" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cpR-Ig-Yjj">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="cpV-EL-0Z1">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="4Mm-K7-RVg"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="tiu-zQ-uyv">
<rect key="frame" x="0.0" y="630" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Mobile No." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0EU-CA-Xqg">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's mobile number" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="I91-DE-eBH">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="foA-9z-yu9"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="phonePad"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="0Pw-sK-dSz">
<rect key="frame" x="0.0" y="700" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Email (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VuB-gh-lpj">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's email address" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="9ed-NF-4Bh">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="gjZ-nr-ohs"/>
</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="14"/>
<textInputTraits key="textInputTraits" keyboardType="emailAddress"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="LKF-1o-Pqq">
<rect key="frame" x="0.0" y="770" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Transfer Reason" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lea-V1-U7a">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="mXe-ay-5tu">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="TWh-Sv-GdZ"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="y6j-nq-IbR" userLabel="IDType">
<rect key="frame" x="0.0" y="840" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ID Type (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0Ex-bx-3lb">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Select" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="1WU-BO-ZpU">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="C3g-2v-oL8"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="BYi-if-5GJ" userLabel="IDValue">
<rect key="frame" x="0.0" y="910" width="355" height="60"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="ID Value (Optional)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="87k-Ld-cG5">
<rect key="frame" x="0.0" y="0.0" width="355" 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>
<textField opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Enter receiver's ID number" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="Ltw-9N-ptX">
<rect key="frame" x="0.0" y="17" width="355" height="43"/>
<constraints>
<constraint firstAttribute="height" constant="43" id="dby-rF-LPT"/>
</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="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
</stackView>
</subviews>
</stackView>
</subviews>
</stackView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hBn-N7-WLX">
<rect key="frame" x="77.5" y="1068" width="200" height="50"/>
<color key="backgroundColor" red="0.92941176469999998" green="0.10980392160000001" blue="0.14117647059999999" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="Pf2-eV-pfK"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="200" id="Vvb-MP-l4m"/>
</constraints>
<fontDescription key="fontDescription" name="SanFranciscoText-Regular" family="San Francisco Text" pointSize="18"/>
<state key="normal" title="Save ">
<color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="save:" destination="kMF-hK-7F1" eventType="touchUpInside" id="D6V-Ym-MO4"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="z9e-FF-DG8" firstAttribute="top" secondItem="akh-17-UFk" secondAttribute="top" id="35H-UP-oGI"/>
<constraint firstAttribute="trailing" secondItem="z9e-FF-DG8" secondAttribute="trailing" id="EtU-2z-bzD"/>
<constraint firstItem="hBn-N7-WLX" firstAttribute="top" secondItem="z9e-FF-DG8" secondAttribute="bottom" constant="30" id="REn-Yx-r0i"/>
<constraint firstItem="z9e-FF-DG8" firstAttribute="leading" secondItem="akh-17-UFk" secondAttribute="leading" id="gZR-eI-pdM"/>
</constraints>
</stackView>
</subviews>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="akh-17-UFk" firstAttribute="top" secondItem="M1b-5m-MXH" secondAttribute="top" id="Jcl-xd-Byn"/>
<constraint firstAttribute="trailing" secondItem="akh-17-UFk" secondAttribute="trailing" constant="10" id="Ld3-Yf-MaS"/>
<constraint firstItem="akh-17-UFk" firstAttribute="leading" secondItem="M1b-5m-MXH" secondAttribute="leading" constant="10" id="SdE-uQ-cgJ"/>
<constraint firstAttribute="bottom" secondItem="akh-17-UFk" secondAttribute="bottom" constant="30" id="ZJE-3z-IvH"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstItem="M1b-5m-MXH" firstAttribute="width" secondItem="3nW-iI-E46" secondAttribute="width" id="OJH-xN-4FE"/>
<constraint firstAttribute="trailing" secondItem="M1b-5m-MXH" secondAttribute="trailing" id="RCv-dS-Gyh"/>
<constraint firstItem="M1b-5m-MXH" firstAttribute="top" secondItem="3nW-iI-E46" secondAttribute="top" id="Sr9-ko-AKR"/>
<constraint firstAttribute="bottom" secondItem="M1b-5m-MXH" secondAttribute="bottom" constant="1" id="lR1-0V-0z4"/>
<constraint firstItem="M1b-5m-MXH" firstAttribute="leading" secondItem="3nW-iI-E46" secondAttribute="leading" id="pg5-Ph-Mxb"/>
</constraints>
</scrollView>
</subviews>
<color key="backgroundColor" red="0.90588235289999997" green="0.92941176469999998" blue="0.94901960780000005" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstItem="3nW-iI-E46" firstAttribute="leading" secondItem="3Iv-qS-bw4" secondAttribute="leading" id="Cm8-Qj-P3n"/>
<constraint firstItem="3nW-iI-E46" firstAttribute="trailing" secondItem="3Iv-qS-bw4" secondAttribute="trailing" id="Fzh-Lq-bo0"/>
<constraint firstItem="3Iv-qS-bw4" firstAttribute="bottom" secondItem="3nW-iI-E46" secondAttribute="bottom" id="U86-gg-H9I"/>
<constraint firstItem="3nW-iI-E46" firstAttribute="top" secondItem="yoy-Sr-xLN" secondAttribute="top" id="YB6-t2-bit"/>
</constraints>
<viewLayoutGuide key="safeArea" id="3Iv-qS-bw4"/>
</view>
<navigationItem key="navigationItem" id="LaZ-5l-poO">
<barButtonItem key="leftBarButtonItem" systemItem="stop" id="N9z-U9-oZS">
<color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<connections>
<action selector="touchClose:" destination="kMF-hK-7F1" id="YIj-Ux-Ee8"/>
</connections>
</barButtonItem>
</navigationItem>
<size key="freeformSize" width="375" height="1100"/>
<connections>
<outlet property="addressTextField" destination="vGP-fz-jbt" id="1pN-zR-qH8"/>
<outlet property="addressTitleLabel" destination="LNf-pd-Eek" id="fa3-08-4RQ"/>
<outlet property="cityTextField" destination="N3C-4L-Ki7" id="ilJ-we-lbg"/>
<outlet property="cityTitleLabel" destination="qfo-M5-t8w" id="N7d-e3-1rB"/>
<outlet property="countryNameTitleLabel" destination="alw-ys-yay" id="vRQ-Oa-Pfm"/>
<outlet property="countryTextField" destination="DdO-f1-13k" id="wBn-TT-uSg"/>
<outlet property="districtStackView" destination="3v6-GM-odc" id="cOf-hf-cya"/>
<outlet property="districtTextField" destination="c9l-2n-RJY" id="fro-Am-Qzk"/>
<outlet property="districtTitleLabel" destination="1Oh-OJ-MbF" id="mbC-V4-ERq"/>
<outlet property="emailTextField" destination="9ed-NF-4Bh" id="JKY-4a-kGk"/>
<outlet property="firstNameTextField" destination="9Hx-oK-GHi" id="p0R-9y-ddA"/>
<outlet property="firstNameTitleLabel" destination="uA5-jW-mEK" id="LW5-dY-6u1"/>
<outlet property="headerTItleLabel" destination="Gt4-fi-XBm" id="ZxT-SD-W8B"/>
<outlet property="idNumberTextField" destination="Ltw-9N-ptX" id="wsj-ox-uHZ"/>
<outlet property="idNumberTitleLabel" destination="87k-Ld-cG5" id="POX-We-zdJ"/>
<outlet property="idTypeTextField" destination="1WU-BO-ZpU" id="8gL-nW-9Ny"/>
<outlet property="idTypeTitleLabel" destination="0Ex-bx-3lb" id="yqu-dL-fTh"/>
<outlet property="lastNameTextField" destination="Wd8-zG-klN" id="SwR-Rv-7au"/>
<outlet property="lastNametitleLabel" destination="tkw-bR-Oy9" id="O5M-hY-gva"/>
<outlet property="middleNameTextField" destination="Eej-kG-wrd" id="qZZ-WV-0Fb"/>
<outlet property="middleNameTitleLabel" destination="K3e-7G-CJy" id="ejQ-T4-Hhb"/>
<outlet property="mobileTextField" destination="I91-DE-eBH" id="lCt-uX-rjw"/>
<outlet property="mobileTitleLabel" destination="0EU-CA-Xqg" id="qPr-EH-xwc"/>
<outlet property="provienceStackView" destination="Ju9-Yd-QNB" id="YnN-ze-HYG"/>
<outlet property="relationTextField" destination="cpV-EL-0Z1" id="GlD-vw-GUi"/>
<outlet property="relationTitleLabel" destination="cpR-Ig-Yjj" id="hHf-aF-nEf"/>
<outlet property="saveButton" destination="hBn-N7-WLX" id="d0E-Jg-y6d"/>
<outlet property="stateProvinceTextField" destination="3aF-XI-LRm" id="HeN-hq-hZ8"/>
<outlet property="stateTitleLabel" destination="2Ta-4K-fuz" id="dMe-e9-Mz4"/>
<outlet property="transferReasonTextField" destination="mXe-ay-5tu" id="49A-we-hRd"/>
<outlet property="transferTitleLabel" destination="Lea-V1-U7a" id="0Qg-Ga-3Rr"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="L82-2L-Rzd" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="6168.8000000000002" y="100.74962518740631"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="SGX-0a-Mas">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="Lf4-Nk-n85" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="yVa-5W-WN4">
<rect key="frame" x="0.0" y="20" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="kMF-hK-7F1" kind="relationship" relationship="rootViewController" id="vQw-j4-oqI"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="py8-2F-JDg" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="5229.6000000000004" y="100.29985007496252"/>
</scene>
</scenes>
<color key="tintColor" red="0.78177064659999995" green="0.55228364470000002" blue="0.018981300289999999" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</document>

536
GME Remit/Modules/RecipientModules/EditReciepient/User Interface/View/EditReciepientViewController.swift

@ -1,536 +0,0 @@
//
// EditReciepientViewController.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class EditReciepientViewController: UIViewController {
struct StringConstants {
let headerText = "who_to_send_text".localized()
let firstNameText = "first_name_text".localized()
let middleNameText = "enter_receiver_middlename_text".localized()
let lastNameText = "last_name_text".localized()
let countryNameText = "country_text".localized()
let stateText = "state_text".localized()
let districtText = "district_text".localized()
let addressText = "address_text".localized()
let relationText = "relation_text".localized()
let mobileText = "mobile_number_text".localized()
let transferText = "transfer_reason_text".localized()
let cityText = "city_text".localized()
let saveText = "save_text".localized()
// placeholder
let firstnamePlaceholder = "placeholder_enter_receiver_firstname_text".localized()
let lastnamePlaceholder = "placeholder_enter_receiver_middle_text".localized()
let middlenamePlaceholder = "placeholder_enter_receiver_lastname_text".localized()
let countryPlaceholder = "placeholder_select_country_text".localized()
let statePlaceholder = "state_placeholder_text".localized()
let districtPlaceholder = "district_placeholder_text".localized()
let addressPlaceholder = "placeholder_enter_receiver_address_text".localized()
let relationPlaceholder = "placeholder_select_relation_text".localized()
let mobilePlaceholder = "placeholder_enter_reciever_mobile_number_text".localized()
let transferPlaceholder = "placeholder_select_transfer_reason_text".localized()
let cityPlaceholder = "placeholder_enter_city_text".localized()
}
// MARK: IBOutlets
@IBOutlet weak var firstNameTextField: UITextField!
@IBOutlet weak var middleNameTextField: UITextField!
@IBOutlet weak var lastNameTextField: UITextField!
@IBOutlet weak var countryTextField: UITextField!
@IBOutlet weak var stateProvinceTextField: UITextField!
@IBOutlet weak var districtTextField: UITextField!
@IBOutlet weak var addressTextField: UITextField!
@IBOutlet weak var relationTextField: UITextField!
@IBOutlet weak var mobileTextField: UITextField!
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var transferReasonTextField: UITextField!
@IBOutlet weak var cityTextField: UITextField!
@IBOutlet weak var saveButton: UIButton!
@IBOutlet weak var provienceStackView: UIStackView!
@IBOutlet weak var districtStackView: UIStackView!
// titles
@IBOutlet weak var headerTItleLabel: UILabel!
@IBOutlet weak var firstNameTitleLabel: UILabel!
@IBOutlet weak var middleNameTitleLabel: UILabel!
@IBOutlet weak var lastNametitleLabel: UILabel!
@IBOutlet weak var countryNameTitleLabel: UILabel!
@IBOutlet weak var stateTitleLabel: UILabel!
@IBOutlet weak var districtTitleLabel: UILabel!
@IBOutlet weak var addressTitleLabel: UILabel!
@IBOutlet weak var relationTitleLabel: UILabel!
@IBOutlet weak var mobileTitleLabel: UILabel!
@IBOutlet weak var transferTitleLabel: UILabel!
@IBOutlet weak var cityTitleLabel: UILabel!
// Optional
@IBOutlet weak var idTypeTitleLabel: UILabel!
@IBOutlet weak var idTypeTextField: UITextField!
@IBOutlet weak var idNumberTitleLabel: UILabel!
@IBOutlet weak var idNumberTextField: UITextField!
// MARK: Properties
var presenter: EditReciepientModuleInterface?
var countries: [SendMoneyCountryViewModel]?
var transferReasons: [SendMoneyTransferReasonViewModel]?
var relations: [SendMoneyRelationViewModel]?
private var receiverIDTypes: [ReceiverIdType]?
private var idTypes = [" --- Select ID Type --- "]
private var selectedIDType: ReceiverIdType? {
didSet {
reciepient?.idType = selectedIDType?.id
idTypeTextField.text = selectedIDType?.text
idNumberTextField.isEnabled = selectedIDType != nil ? true : false
if !idNumberTextField.isEnabled {
idNumberTextField.text = nil
}
}
}
var reciepient: EditRecipientRecipientViewModel? {
didSet {
self.populateInformations()
}
}
var selectedCountry: SendMoneyCountryViewModel? {
didSet {
self.countryTextField.text = selectedCountry?.name
let shouldShowProvienceField = (selectedCountry?.proviencesRequired ?? "" ) == "true"
self.configureView(isHidden: !shouldShowProvienceField)
self.reciepient?.countryId = self.selectedCountry?.id
self.reciepient?.country = self.selectedCountry?.name
mobileTextField.setCoutryFlag(with: selectedCountry?.code)
}
}
var selectedProvience: SendMoneyProvienceViewModel? {
didSet {
self.stateProvinceTextField.text = selectedProvience?.name
self.reciepient?.stateId = self.selectedProvience?.id
}
}
var selectedDistrict: SendMoneyDistrictViewModel? {
didSet {
self.districtTextField.text = selectedDistrict?.name
self.reciepient?.districtId = self.selectedDistrict?.id
}
}
var selectedRelation: SendMoneyRelationViewModel? {
didSet {
self.relationTextField.text = selectedRelation?.title
self.reciepient?.relationId = self.selectedRelation?.id
}
}
var selectedTransferReason: SendMoneyTransferReasonViewModel? {
didSet {
self.transferReasonTextField.text = selectedTransferReason?.title
self.reciepient?.reasonId = selectedTransferReason?.id
}
}
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
self.setup()
self.setupDelegates()
self.setupTargets()
self.presenter?.viewIsReady()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.title = "Edit Receipient"
}
// MARK: IBActions
@IBAction func save(_ sender: UIButton) {
self.view.endEditing(true)
if let reciepient = self.reciepient {
guard
let code = selectedCountry?.code?.lowercased(),
let countryCode = CountryEnum(rawValue: code),
let mobileNumber = mobileTextField.text else { return }
reciepient.mobileNumber = countryCode.phoneCode + mobileNumber
self.presenter?.save(model: reciepient)
}
}
@IBAction func touchClose(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
}
// MARK: Other Functions
private func setup() {
// all setup should be done here
self.setupNavigation()
self.configureView(isHidden: true)
self.configureLanguage()
// for pickerView
let pickerView = UIPickerView()
idTypeTextField.inputView = pickerView
pickerView.delegate = self
pickerView.dataSource = self
}
private func configureLanguage() {
self.headerTItleLabel.text = StringConstants().headerText
self.firstNameTitleLabel.text = StringConstants().firstNameText
self.middleNameTitleLabel.text = StringConstants().middleNameText
self.lastNametitleLabel.text = StringConstants().lastNameText
self.countryNameTitleLabel.text = StringConstants().countryNameText
self.stateTitleLabel.text = StringConstants().stateText
self.districtTitleLabel.text = StringConstants().districtText
self.addressTitleLabel.text = StringConstants().addressText
self.relationTitleLabel.text = StringConstants().relationText
self.mobileTitleLabel.text = StringConstants().mobileText
self.transferTitleLabel.text = StringConstants().transferText
idTypeTitleLabel.text = "id_type_title_text".localized()
idNumberTitleLabel.text = "id_number_title_text".localized()
idTypeTextField.placeholder = "placeholder_enter_id_type_text".localized()
idNumberTextField.placeholder = "placeholder_enter_id_number_text".localized()
cityTitleLabel.text = StringConstants().cityText
saveButton.setTitle(StringConstants().saveText, for: .normal)
// placeholders
self.firstNameTextField.placeholder = StringConstants().firstnamePlaceholder
self.middleNameTextField.placeholder = StringConstants().middlenamePlaceholder
self.lastNameTextField.placeholder = StringConstants().lastnamePlaceholder
self.countryTextField.placeholder = StringConstants().countryPlaceholder
self.stateProvinceTextField.placeholder = StringConstants().statePlaceholder
self.districtTextField.placeholder = StringConstants().districtPlaceholder
self.addressTextField.placeholder = StringConstants().addressPlaceholder
self.relationTextField.placeholder = StringConstants().relationPlaceholder
self.mobileTextField.placeholder = StringConstants().mobilePlaceholder
self.transferReasonTextField.placeholder = StringConstants().transferPlaceholder
cityTextField.placeholder = StringConstants().cityPlaceholder
}
private func configureView(isHidden: Bool) {
self.provienceStackView.isHidden = isHidden
self.districtStackView.isHidden = isHidden
}
private func setupDelegates() {
self.countryTextField.delegate = self
self.stateProvinceTextField.delegate = self
self.districtTextField.delegate = self
self.relationTextField.delegate = self
self.transferReasonTextField.delegate = self
}
private func setupTargets() {
[firstNameTextField, middleNameTextField, lastNameTextField, countryTextField, stateProvinceTextField, districtTextField, addressTextField, relationTextField, mobileTextField, emailTextField, transferReasonTextField, cityTextField, idNumberTextField].forEach({
$0?.addTarget(self, action: #selector(self.textFieldChanged(sender:)), for: UIControl.Event.editingChanged)
})
}
@objc private func textFieldChanged(sender: UITextField) {
sender.removeNonASCII()
switch sender {
case firstNameTextField:
self.reciepient?.firstName = firstNameTextField.text!
case middleNameTextField:
self.reciepient?.middleName = middleNameTextField.text!
case lastNameTextField: ()
//FIXME
// self.reciepient?.lastName = lastNameTextField.text!
case cityTextField:
self.reciepient?.city = cityTextField.text!
case addressTextField:
self.reciepient?.address = addressTextField.text!
case mobileTextField:
self.reciepient?.mobileNumber = mobileTextField.text!
case emailTextField:
self.reciepient?.email = emailTextField.text!
case idNumberTextField:
reciepient?.idNumber = idNumberTextField.text
default:
break
}
}
private func populateInformations() {
self.firstNameTextField.text = self.reciepient?.firstName
self.middleNameTextField.text = self.reciepient?.middleName
//FIXME
// self.lastNameTextField.text = self.reciepient?.lastName
let relation = self.relations?.filter({
$0.title == self.reciepient?.relation
}).first?.title
self.relationTextField.text = relation
self.emailTextField.text = self.reciepient?.email
let transferReason = self.transferReasons?.filter({
$0.title == self.reciepient?.reason
}).first?.title
self.transferReasonTextField.text = transferReason
self.cityTextField.text = reciepient?.city
self.addressTextField.text = reciepient?.address
self.selectedIDType = receiverIDTypes?
.filter{ $0.id == self.reciepient?.idType}
.first
self.idNumberTextField.text = reciepient?.idNumber
// For sync country in reciepient model
self.selectedCountry = self.countries?.filter{
$0.name == self.reciepient?.country
}.first
// For sync provience in reciepient model
self.selectedProvience = self.selectedCountry?.proviences?.filter{
$0.id == self.reciepient?.stateId
}.first
// For sync district in reciepient model
self.selectedDistrict = self.selectedProvience?.districts?.filter{
$0.id == self.reciepient?.districtId
}.first
guard
let code = selectedCountry?.code?.lowercased(),
let countryCode = CountryEnum(rawValue: code) else { return }
self.mobileTextField.text = self.reciepient?.mobileNumber?.replacingOccurrences(of: countryCode.phoneCode, with: "")
}
private func setupNavigation() {
self.navigationItem.backBarButtonItem?.image =
#imageLiteral(resourceName: "backIconBlack")
self.navigationController?.navigationBar.tintColor = UIColor.black
}
private func showCountryPickerview() {
TablePresenterWireframe().openWith(
tag: 0,
delegate: self,
model: countries,
source: self
)
}
private func showProviencePickerview() {
TablePresenterWireframe().openWith(
tag: 1,
delegate: self,
model: self.selectedCountry?.proviences,
source: self
)
}
private func showDistrictPickerview() {
TablePresenterWireframe().openWith(
tag: 2,
delegate: self,
model: selectedProvience?.districts,
source: self
)
}
private func showRelationPickerView() {
TablePresenterWireframe().openWith(
tag: 3,
delegate: self,
model: relations,
source: self
)
}
private func showTransferReasonPickerView() {
TablePresenterWireframe().openWith(
tag: 4,
delegate: self,
model: self.transferReasons,
source: self
)
}
func showLoading() {
self.showProgressHud()
}
func hideLoading() {
self.hideProgressHud()
}
func show(error: String) {
self.alert(type: .error, message: error)
}
}
// MARK: EditReciepientViewInterface
extension EditReciepientViewController: EditReciepientViewInterface {
func show(countries: [SendMoneyCountryViewModel]) {
self.countries = countries
}
func show(transferReasons: [SendMoneyTransferReasonViewModel]) {
self.transferReasons = transferReasons
}
func show(relations: [SendMoneyRelationViewModel]) {
self.relations = relations
}
func show(recipient: EditRecipientRecipientViewModel) {
self.reciepient = recipient
}
func setReceiverIDTypes(with model: [ReceiverIdType]?) {
receiverIDTypes = model
guard let types = receiverIDTypes?.compactMap ({ $0.text }) else {
return
}
idTypes.append(contentsOf: types)
}
}
extension EditReciepientViewController: UITextFieldDelegate {
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
switch textField {
case countryTextField:
showCountryPickerview()
return false
case stateProvinceTextField:
self.showProviencePickerview()
return false
case districtTextField:
self.showDistrictPickerview()
return false
case relationTextField:
self.showRelationPickerView()
return false
case transferReasonTextField:
self.showTransferReasonPickerView()
return false
default:
return true
}
}
}
// MARK: - TablePresenterDelegate
extension EditReciepientViewController: TablePresenterDelegate {
func tablePresenterView(_ viewController: TablePresenterViewController) -> TablePresenterConfiguration {
let title: String
let searchPlaceholder: String
switch viewController.view.tag {
case 0:
title = "select_country_text".localized()
searchPlaceholder = "search_country_text".localized()
case 1:
title = "province_placeholder_text".localized()
searchPlaceholder = "search_province_text".localized()
case 2:
title = "select_district_text".localized()
searchPlaceholder = "search_district_text".localized()
case 3:
title = "select_relation_text".localized()
searchPlaceholder = "search_relation_text".localized()
case 4:
title = "select_transfer_reason_text".localized()
searchPlaceholder = "search_transfer_reason_text".localized()
default:
title = ""
searchPlaceholder = ""
}
return TablePresenterConfiguration(
presenterTitle: title,
closeButtonTitle: "cancel_text".localized(),
notFoundTitle: "no_result_found_text".localized(),
searchBarPlaceHolder: searchPlaceholder,
isUseSearchBar: true
)
}
func tablePresenterView(_ viewController: TablePresenterViewController, didSelectModel model: TablePresenterProtocol?) {
switch viewController.view.tag {
case 0: selectedCountry = model as? SendMoneyCountryViewModel
case 1: selectedProvience = model as? SendMoneyProvienceViewModel
case 2: selectedDistrict = model as? SendMoneyDistrictViewModel
case 3: selectedRelation = model as? SendMoneyRelationViewModel
case 4: selectedTransferReason = model as? SendMoneyTransferReasonViewModel
default: break
}
}
}
// MARK: - UIPickerViewDataSource
extension EditReciepientViewController: UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return idTypes.count
}
}
extension EditReciepientViewController: UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return idTypes[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
selectedIDType = row > 0 ? receiverIDTypes?[row - 1] : nil
}
}

19
GME Remit/Modules/RecipientModules/EditReciepient/User Interface/View/EditReciepientViewInterface.swift

@ -1,19 +0,0 @@
//
// EditReciepientViewInterface.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
protocol EditReciepientViewInterface: class {
func show(error: String)
func show(countries: [SendMoneyCountryViewModel])
func show(transferReasons: [SendMoneyTransferReasonViewModel])
func show(relations: [SendMoneyRelationViewModel])
func show(recipient: EditRecipientRecipientViewModel)
func showLoading()
func hideLoading()
func setReceiverIDTypes(with model: [ReceiverIdType]?)
}

54
GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Wireframe/EditReciepientWireframe.swift

@ -1,54 +0,0 @@
//
// EditReciepientWireframe.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import UIKit
class EditReciepientWireframe {
weak var view: UIViewController!
var receipient: Recipient!
}
extension EditReciepientWireframe: EditReciepientWireframeInput {
var storyboardName: String {return "EditReciepient"}
func getMainView() -> UIViewController {
let service = EditReciepientService()
let interactor = EditReciepientInteractor.init(service: service, reciepient: receipient)
let presenter = EditReciepientPresenter()
let viewController = viewControllerFromStoryboard(of: EditReciepientViewController.self)
viewController.presenter = presenter
interactor.output = presenter
presenter.interactor = interactor
presenter.wireframe = self
presenter.view = viewController
self.view = viewController
return viewController
}
func edit(reciepient: Recipient, source: UINavigationController) {
self.receipient = reciepient
self.pushMainView(in: source)
}
func editWithNavigation(who recipient: Recipient, on base: UIViewController) {
self.receipient = recipient
let navigationVC = UINavigationController(rootViewController: getMainView())
base.present(navigationVC, animated: true, completion: nil)
}
func dismiss() {
if let navigation = self.view.navigationController {
navigation.popViewController(animated: true)
}
}
}

13
GME Remit/Modules/RecipientModules/EditReciepient/User Interface/Wireframe/EditReciepientWireframeInput.swift

@ -1,13 +0,0 @@
//
// EditReciepientWireframeInput.swift
// GMERemittance
//
// Created by gme_2 on 28/08/2018.
//Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
protocol EditReciepientWireframeInput: WireframeInput {
func dismiss()
}

21
GME Remit/Modules/RecipientModules/Recipients/User Interface/View/Recipients.storyboard

@ -65,21 +65,27 @@
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="o4b-PJ-27E">
<rect key="frame" x="20" y="184.5" width="335" height="423.5"/>
<rect key="frame" x="20" y="184.5" width="335" height="433.5"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" dataMode="prototypes" style="plain" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="vEB-d2-zNF">
<rect key="frame" x="10" y="0.0" width="315" height="423.5"/>
<rect key="frame" x="10" y="0.0" width="315" height="433.5"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="separatorColor" white="0.85577197490000001" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<inset key="separatorInset" minX="15" minY="0.0" maxX="15" maxY="0.0"/>
<searchBar key="tableHeaderView" contentMode="redraw" searchBarStyle="minimal" placeholder="Search name" id="6U0-GV-UwI">
<rect key="frame" x="0.0" y="0.0" width="315" height="56"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<color key="tintColor" red="0.92941176469999998" green="0.1137254902" blue="0.1960784314" alpha="1" colorSpace="calibratedRGB"/>
<textInputTraits key="textInputTraits" textContentType="name"/>
</searchBar>
<view key="tableFooterView" contentMode="scaleToFill" id="IIt-Yb-InY">
<rect key="frame" x="0.0" y="198" width="315" height="44"/>
<rect key="frame" x="0.0" y="445.5" width="315" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="RecipientCell" rowHeight="170" id="hGj-Pf-Qj3" customClass="RecipientCell" customModule="GME_Remit" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" width="315" height="170"/>
<rect key="frame" x="0.0" y="84" width="315" height="170"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="hGj-Pf-Qj3" id="sz3-Ck-jnS">
<rect key="frame" x="0.0" y="0.0" width="315" height="169.5"/>
@ -189,7 +195,7 @@
<constraints>
<constraint firstItem="vEB-d2-zNF" firstAttribute="leading" secondItem="o4b-PJ-27E" secondAttribute="leading" constant="10" id="1Al-XV-mgu"/>
<constraint firstAttribute="trailing" secondItem="vEB-d2-zNF" secondAttribute="trailing" constant="10" id="UMp-OY-EDy"/>
<constraint firstItem="vEB-d2-zNF" firstAttribute="top" secondItem="o4b-PJ-27E" secondAttribute="top" id="izT-Kz-b58"/>
<constraint firstItem="vEB-d2-zNF" firstAttribute="top" secondItem="o4b-PJ-27E" secondAttribute="top" id="fp9-NB-xuO"/>
<constraint firstAttribute="bottom" secondItem="vEB-d2-zNF" secondAttribute="bottom" id="pMZ-9z-mDn"/>
</constraints>
</view>
@ -200,7 +206,7 @@
<constraint firstItem="P7h-Wp-hN8" firstAttribute="top" secondItem="0Gk-PF-kqw" secondAttribute="top" constant="30" id="BQE-26-6jz"/>
<constraint firstItem="BNw-Op-I8T" firstAttribute="leading" secondItem="0Gk-PF-kqw" secondAttribute="leading" constant="20" id="C6B-eV-AFT"/>
<constraint firstItem="o4b-PJ-27E" firstAttribute="leading" secondItem="0QN-P7-eWm" secondAttribute="leading" constant="20" id="Ct3-U2-lwK"/>
<constraint firstItem="0Gk-PF-kqw" firstAttribute="bottom" secondItem="o4b-PJ-27E" secondAttribute="bottom" constant="10" id="Ekl-a8-jWB"/>
<constraint firstItem="0Gk-PF-kqw" firstAttribute="bottom" secondItem="o4b-PJ-27E" secondAttribute="bottom" id="Ekl-a8-jWB"/>
<constraint firstItem="0Gk-PF-kqw" firstAttribute="trailing" secondItem="P7h-Wp-hN8" secondAttribute="trailing" constant="20" id="LTg-Zo-QuN"/>
<constraint firstItem="o4b-PJ-27E" firstAttribute="top" secondItem="BNw-Op-I8T" secondAttribute="bottom" constant="10" id="RkQ-Qf-xvB"/>
<constraint firstItem="BNw-Op-I8T" firstAttribute="top" secondItem="P7h-Wp-hN8" secondAttribute="bottom" constant="30" id="Ve6-bl-qQE"/>
@ -215,6 +221,7 @@
<outlet property="addRecipientTapGestureRecognizer" destination="LhF-Qk-byx" id="S5D-qr-6br"/>
<outlet property="labelSwipeInfo" destination="BNw-Op-I8T" id="8ly-s7-9xH"/>
<outlet property="newRecipeintLabel" destination="Wj9-qf-u2U" id="YQc-G8-tZa"/>
<outlet property="searchBar" destination="6U0-GV-UwI" id="vl5-Is-MML"/>
<outlet property="tableView" destination="vEB-d2-zNF" id="qhO-6Y-duq"/>
<outlet property="viewAddRecipient" destination="P7h-Wp-hN8" id="W9O-kc-kXA"/>
</connections>
@ -222,7 +229,7 @@
<placeholder placeholderIdentifier="IBFirstResponder" id="vG9-wp-waO" userLabel="First Responder" sceneMemberID="firstResponder"/>
<tapGestureRecognizer id="LhF-Qk-byx"/>
</objects>
<point key="canvasLocation" x="738" y="224"/>
<point key="canvasLocation" x="736.79999999999995" y="223.53823088455775"/>
</scene>
</scenes>
<resources>

9
GME Remit/Modules/RecipientModules/Recipients/User Interface/View/RecipientsViewController.swift

@ -37,6 +37,8 @@ class RecipientsViewController: UIViewController {
@IBOutlet private weak var newRecipeintLabel: UILabel!
@IBOutlet private var addRecipientTapGestureRecognizer: UITapGestureRecognizer!
@IBOutlet private weak var searchBar: UISearchBar!
// MARK: VC's Life cycle
override func viewDidLoad() {
super.viewDidLoad()
@ -106,7 +108,8 @@ extension RecipientsViewController {
selectTrigger: tableView.rx.itemSelected.asDriver(),
editTrigger: editTrigger.asDriverOnErrorJustComplete(),
deleteTrigger: deleteTrigger.asDriverOnErrorJustComplete(),
needEditTrigger: needEditTrigger.asDriverOnErrorJustComplete()
needEditTrigger: needEditTrigger.asDriverOnErrorJustComplete(),
filterText: searchBar.rx.text.asDriverOnErrorJustComplete()
)
addRecipientTapGestureRecognizer.rx.event.mapToVoid().asDriverOnErrorJustComplete()
@ -185,8 +188,8 @@ extension RecipientsViewController: UITableViewDelegate {
self.editTrigger.onNext(indexPath)
}
edit.backgroundColor = UIColor.init(hex: "#F39826")
delete.backgroundColor = UIColor.init(hex: "DE333C")
edit.backgroundColor = .themeBlue
delete.backgroundColor = .themeRed
return [delete, edit]
}
}

14
GME Remit/Modules/RecipientModules/Recipients/User Interface/View/ViewModel/RecipientsViewModel.swift

@ -19,6 +19,7 @@ class RecipientsViewModel: ViewModelType {
let editTrigger: Driver<IndexPath>
let deleteTrigger: Driver<IndexPath>
let needEditTrigger: Driver<Void>
let filterText: Driver<String?>
}
struct Output {
@ -31,6 +32,8 @@ class RecipientsViewModel: ViewModelType {
private let disposeBag = DisposeBag()
private let recipientsLinker = BehaviorSubject<[Recipient]>(value: [])
private let filteredRecipientLinker = BehaviorSubject<[Recipient]>(value: [])
private let accountsLinker = BehaviorSubject<[Account]>(value: [])
private let editLinker = PublishSubject<Recipient>()
@ -49,8 +52,15 @@ class RecipientsViewModel: ViewModelType {
.drive(onNext: { self.presenter?.fetchRecipients() })
.disposed(by: disposeBag)
let recipients = recipientsLinker.asDriverOnErrorJustComplete()
let recipients = Observable.combineLatest(
recipientsLinker, input.filterText.asObservable()
) { recipients, searchText -> [Recipient] in
guard let searchText = searchText, searchText != "" else {
return recipients
}
return recipients.filter {( $0.fullName?.lowercased().contains(searchText.lowercased()) ?? false )}
}.asDriverOnErrorJustComplete()
// Select
input.selectTrigger
.withLatestFrom(recipients) { (indexPath, recipients) -> Recipient in

Loading…
Cancel
Save