├── .github └── pull_request_template.md ├── .gitignore ├── LICENSE ├── README.md ├── api ├── contact_list_endpoint.json ├── home_endpoint.json ├── transfer_successful_endpoint.json └── user_profile_endpoint.json ├── screenshots ├── screenshot-1.png ├── screenshot-2.png ├── screenshot-3.png ├── screenshot-4.png ├── screenshot-5.png ├── screenshot-6.png ├── screenshot-7.png └── screenshot-8.png └── solutions ├── devsprint-bruno-faganello-1 ├── FinanceApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── FinanceApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── Components │ │ ├── ActivityCellView.swift │ │ ├── ActivityListView.swift │ │ ├── ContactCellView.swift │ │ ├── HomeHeaderView.swift │ │ ├── TabBarController.swift │ │ └── UserProfileHeaderView.swift │ ├── Entities │ │ ├── Activity.swift │ │ └── HomeData.swift │ ├── Extensions │ │ ├── Collection+Extension.swift │ │ ├── Double+Extension.swift │ │ └── UIViewController+Extension.swift │ ├── Modules │ │ ├── ActivityDetails │ │ │ ├── ActivityDetailsInteractor.swift │ │ │ ├── ActivityDetailsPresenter.swift │ │ │ ├── ActivityDetailsProtocols.swift │ │ │ ├── ActivityDetailsRouter.swift │ │ │ ├── ActivityDetailsView.swift │ │ │ └── ActivityDetailsViewController.swift │ │ ├── Confirmation │ │ │ ├── ConfirmationView.swift │ │ │ └── ConfirmationViewController.swift │ │ ├── ContactList │ │ │ ├── ContactListInteractor.swift │ │ │ ├── ContactListPresenter.swift │ │ │ ├── ContactListProtocols.swift │ │ │ ├── ContactListRouter.swift │ │ │ ├── ContactListView.swift │ │ │ └── ContactListViewController.swift │ │ ├── Home │ │ │ ├── HomeInteractor.swift │ │ │ ├── HomePresenter.swift │ │ │ ├── HomeProtocols.swift │ │ │ ├── HomeRouter.swift │ │ │ ├── HomeView.swift │ │ │ └── HomeViewController.swift │ │ ├── SampleModule │ │ │ ├── SampleInteractor.swift │ │ │ ├── SamplePresenter.swift │ │ │ ├── SampleProtocols.swift │ │ │ ├── SampleRouter.swift │ │ │ ├── SampleView.swift │ │ │ └── SampleViewController.swift │ │ ├── Transfers │ │ │ ├── TransferInteractor.swift │ │ │ ├── TransferPresenter.swift │ │ │ ├── TransferProtocols.swift │ │ │ ├── TransferRouter.swift │ │ │ ├── TransfersView.swift │ │ │ └── TransfersViewController.swift │ │ └── UserProfile │ │ │ ├── UserProfileView.swift │ │ │ └── UserProfileViewController.swift │ ├── Repository │ │ ├── ActivityDetailRepository.swift │ │ └── HomeRepository.swift │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── devpass-logo-blue copy 2-1.png │ │ │ │ ├── devpass-logo-blue copy 2.png │ │ │ │ ├── devpass-logo-blue copy 3.png │ │ │ │ ├── devpass-logo-blue copy 4.png │ │ │ │ ├── devpass-logo-blue copy 5.png │ │ │ │ └── devpass-logo-blue copy.png │ │ │ ├── Contents.json │ │ │ ├── airplane.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── airplane.circle.fill.svg │ │ │ ├── arrow.up.arrow.down.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── arrow.up.arrow.down.svg │ │ │ ├── avatar-placeholder.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── avatar-placeholder.png │ │ │ ├── bag.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── bag.circle.fill.svg │ │ │ ├── car.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── car.circle.fill.svg │ │ │ ├── checkmark.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── checkmark.circle.fill.svg │ │ │ ├── fork.knife.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── fork.knife.circle.fill.svg │ │ │ ├── heart.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── heart.circle.fill.svg │ │ │ └── house.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── house.fill.svg │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ └── Service │ │ ├── Finance │ │ ├── FinanceEndpoint.swift │ │ └── FinanceService.swift │ │ ├── Home │ │ ├── HomeEndpoint.swift │ │ └── HomeService.swift │ │ └── Manager │ │ ├── Constants.swift │ │ ├── Endpoint.swift │ │ ├── HTTPClient.swift │ │ ├── RequestError.swift │ │ └── RequestMethod.swift ├── FinanceAppTests │ └── FinanceAppTests.swift └── FinanceAppUITests │ ├── FinanceAppUITests.swift │ └── FinanceAppUITestsLaunchTests.swift ├── devsprint-caio-santos-1 ├── FinanceApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── FinanceApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── Commons │ │ ├── JsonLoader.swift │ │ └── Transporter.swift │ ├── Components │ │ ├── ActivityCellView.swift │ │ ├── ActivityListView.swift │ │ ├── AlertView.swift │ │ ├── ButtonView.swift │ │ ├── ChooseContactView.swift │ │ ├── ContactCellView.swift │ │ ├── HomeHeaderView.swift │ │ ├── TabBarController.swift │ │ └── UserProfileHeaderView.swift │ ├── Modules │ │ ├── ActivityDetails │ │ │ ├── ActivityDetailsInteractor.swift │ │ │ ├── ActivityDetailsPresenter.swift │ │ │ ├── ActivityDetailsProtocols.swift │ │ │ ├── ActivityDetailsRouter.swift │ │ │ ├── ActivityDetailsView.swift │ │ │ ├── ActivityDetailsViewController.swift │ │ │ └── ActivityDetailsWorker.swift │ │ ├── Confirmation │ │ │ ├── ConfirmationConfigurator.swift │ │ │ ├── ConfirmationDefinitions.swift │ │ │ ├── ConfirmationInteractor.swift │ │ │ ├── ConfirmationPresenter.swift │ │ │ ├── ConfirmationProtocols.swift │ │ │ ├── ConfirmationRouter.swift │ │ │ ├── ConfirmationView.swift │ │ │ └── ConfirmationViewController.swift │ │ ├── ContactList │ │ │ ├── ContactListInteractor.swift │ │ │ ├── ContactListPresenter.swift │ │ │ ├── ContactListRouter.swift │ │ │ ├── ContactListView.swift │ │ │ ├── ContactListViewController.swift │ │ │ └── ContactWorker.swift │ │ ├── Home │ │ │ ├── HomeInteractor.swift │ │ │ ├── HomePresenter.swift │ │ │ ├── HomeProtocols.swift │ │ │ ├── HomeRouter.swift │ │ │ ├── HomeView.swift │ │ │ └── HomeViewController.swift │ │ ├── SampleModule │ │ │ ├── SampleInteractor.swift │ │ │ ├── SamplePresenter.swift │ │ │ ├── SampleProtocols.swift │ │ │ ├── SampleRouter.swift │ │ │ ├── SampleView.swift │ │ │ └── SampleViewController.swift │ │ ├── SampleV2Module │ │ │ ├── SampleEntity.swift │ │ │ ├── SampleV2Configurator.swift │ │ │ ├── SampleV2Definitions.swift │ │ │ ├── SampleV2Interactor.swift │ │ │ ├── SampleV2Presenter.swift │ │ │ ├── SampleV2Protocols.swift │ │ │ ├── SampleV2Router.swift │ │ │ ├── SampleV2ViewController.swift │ │ │ └── sample.json │ │ ├── Transfers │ │ │ ├── TransfersConfigurator.swift │ │ │ ├── TransfersInteractor.swift │ │ │ ├── TransfersPresenter.swift │ │ │ ├── TransfersProtocols.swift │ │ │ ├── TransfersRouter.swift │ │ │ ├── TransfersView.swift │ │ │ └── TransfersViewController.swift │ │ └── UserProfile │ │ │ ├── UserProfileInteractor.swift │ │ │ ├── UserProfilePresenter.swift │ │ │ ├── UserProfileRouter.swift │ │ │ ├── UserProfileView.swift │ │ │ ├── UserProfileViewController.swift │ │ │ └── UserProfileWorker.swift │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── devpass-logo-blue copy 2-1.png │ │ │ │ ├── devpass-logo-blue copy 2.png │ │ │ │ ├── devpass-logo-blue copy 3.png │ │ │ │ ├── devpass-logo-blue copy 4.png │ │ │ │ ├── devpass-logo-blue copy 5.png │ │ │ │ └── devpass-logo-blue copy.png │ │ │ ├── Contents.json │ │ │ ├── airplane.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── airplane.circle.fill.svg │ │ │ ├── arrow.up.arrow.down.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── arrow.up.arrow.down.svg │ │ │ ├── avatar-placeholder.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── avatar-placeholder.png │ │ │ ├── bag.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── bag.circle.fill.svg │ │ │ ├── car.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── car.circle.fill.svg │ │ │ ├── checkmark.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── checkmark.circle.fill.svg │ │ │ ├── fork.knife.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── fork.knife.circle.fill.svg │ │ │ ├── heart.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── heart.circle.fill.svg │ │ │ └── house.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── house.fill.svg │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ ├── Info.plist │ │ └── api │ │ │ ├── activity_details_endpoint.json │ │ │ ├── contact_list_endpoint.json │ │ │ ├── home_endpoint.json │ │ │ ├── transfer_successful_endpoint.json │ │ │ └── user_profile_endpoint.json │ └── Service │ │ ├── Entities │ │ ├── ActivityDetailsEntity.swift │ │ ├── ContactEntity.swift │ │ ├── TransfersEntity.swift │ │ └── UserProfileEntity.swift │ │ └── FinanceService.swift ├── FinanceAppTests │ └── FinanceAppTests.swift └── FinanceAppUITests │ ├── FinanceAppUITests.swift │ └── FinanceAppUITestsLaunchTests.swift ├── devsprint-caio-santos-3 ├── FinanceApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── Components │ │ ├── ActivityCellView.swift │ │ ├── ActivityListView.swift │ │ ├── ContactCellView.swift │ │ ├── HomeHeaderView.swift │ │ ├── TabBarController.swift │ │ └── UserProfileHeaderView.swift │ ├── Entities │ │ ├── HomeDTO.swift │ │ └── HomeEntity.swift │ ├── Extensions │ │ ├── CollectionExtension.swift │ │ ├── StringExtension.swift │ │ └── UIViewControllerExtension.swift │ ├── Modules │ │ ├── ActivityDetails │ │ │ ├── ActivityDetailsInteractor.swift │ │ │ ├── ActivityDetailsPresenter.swift │ │ │ ├── ActivityDetailsProtocol.swift │ │ │ ├── ActivityDetailsRouter.swift │ │ │ ├── ActivityDetailsView.swift │ │ │ └── ActivityDetailsViewController.swift │ │ ├── Confirmation │ │ │ ├── ConfirmationEntity.swift │ │ │ ├── ConfirmationInteractor.swift │ │ │ ├── ConfirmationPresenter.swift │ │ │ ├── ConfirmationProtocols.swift │ │ │ ├── ConfirmationRouter.swift │ │ │ ├── ConfirmationView.swift │ │ │ └── ConfirmationViewController.swift │ │ ├── ContactList │ │ │ ├── ContactListEntity.swift │ │ │ ├── ContactListInteractor.swift │ │ │ ├── ContactListPresenter.swift │ │ │ ├── ContactListProtocols.swift │ │ │ ├── ContactListRouter.swift │ │ │ └── ContactListViewController.swift │ │ ├── Home │ │ │ ├── HomeInteractor.swift │ │ │ ├── HomePresenter.swift │ │ │ ├── HomeProtocols.swift │ │ │ ├── HomeRouter.swift │ │ │ ├── HomeView.swift │ │ │ └── HomeViewController.swift │ │ ├── SampleModule │ │ │ ├── SampleInteractor.swift │ │ │ ├── SamplePresenter.swift │ │ │ ├── SampleProtocols.swift │ │ │ ├── SampleRouter.swift │ │ │ ├── SampleView.swift │ │ │ └── SampleViewController.swift │ │ ├── Transfers │ │ │ ├── TransfersEntity.swift │ │ │ ├── TransfersInteractor.swift │ │ │ ├── TransfersPresenter.swift │ │ │ ├── TransfersRouter.swift │ │ │ ├── TransfersView.swift │ │ │ └── TransfersViewController.swift │ │ └── UserProfile │ │ │ ├── AccountCell.swift │ │ │ ├── Entity │ │ │ ├── AccountEntity.swift │ │ │ └── UserEntity.swift │ │ │ ├── UserProfileFactory.swift │ │ │ ├── UserProfileHeaderViewData.swift │ │ │ ├── UserProfileInteractor.swift │ │ │ ├── UserProfilePresenter.swift │ │ │ ├── UserProfilePresenterProtocol.swift │ │ │ ├── UserProfileView.swift │ │ │ └── UserProfileViewController.swift │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── devpass-logo-blue copy 2-1.png │ │ │ │ ├── devpass-logo-blue copy 2.png │ │ │ │ ├── devpass-logo-blue copy 3.png │ │ │ │ ├── devpass-logo-blue copy 4.png │ │ │ │ ├── devpass-logo-blue copy 5.png │ │ │ │ └── devpass-logo-blue copy.png │ │ │ ├── Contents.json │ │ │ ├── airplane.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── airplane.circle.fill.svg │ │ │ ├── arrow.up.arrow.down.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── arrow.up.arrow.down.svg │ │ │ ├── avatar-placeholder.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── avatar-placeholder.png │ │ │ ├── bag.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── bag.circle.fill.svg │ │ │ ├── car.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── car.circle.fill.svg │ │ │ ├── checkmark.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── checkmark.circle.fill.svg │ │ │ ├── fork.knife.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── fork.knife.circle.fill.svg │ │ │ ├── heart.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── heart.circle.fill.svg │ │ │ └── house.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── house.fill.svg │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ └── Service │ │ ├── FinanceEndpoint.swift │ │ ├── FinanceService.swift │ │ └── FinanceServiceError.swift ├── FinanceAppTests │ ├── FinanceAppTests.swift │ └── Info.plist ├── FinanceAppUITests │ ├── FinanceAppUITests.swift │ ├── FinanceAppUITestsLaunchTests.swift │ └── Info.plist ├── Podfile ├── Podfile.lock └── project.yml ├── devsprint-caio-santos-6 ├── FinanceApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── Components │ │ ├── ActivityCellView.swift │ │ ├── ActivityListView.swift │ │ ├── ContactCellView.swift │ │ ├── HomeHeaderView.swift │ │ ├── TabBarController.swift │ │ └── UserProfileHeaderView.swift │ ├── Modules │ │ ├── ActivityDetails │ │ │ ├── ActivityDetailsConfigurator.swift │ │ │ ├── ActivityDetailsInteractor.swift │ │ │ ├── ActivityDetailsPresenter.swift │ │ │ ├── ActivityDetailsProtocols.swift │ │ │ ├── ActivityDetailsRouter.swift │ │ │ ├── ActivityDetailsView.swift │ │ │ └── ActivityDetailsViewController.swift │ │ ├── Confirmation │ │ │ ├── ConfirmationConfigurator.swift │ │ │ ├── ConfirmationInteractor.swift │ │ │ ├── ConfirmationPresenter.swift │ │ │ ├── ConfirmationProtocols.swift │ │ │ ├── ConfirmationRouter.swift │ │ │ ├── ConfirmationView.swift │ │ │ └── ConfirmationViewController.swift │ │ ├── ContactList │ │ │ ├── ContactListDefinitions.swift │ │ │ ├── ContactListInteractor.swift │ │ │ ├── ContactListPresenter.swift │ │ │ ├── ContactListProtocols.swift │ │ │ ├── ContactListRouter.swift │ │ │ └── ContactListViewController.swift │ │ ├── Home │ │ │ ├── HomeInteractor.swift │ │ │ ├── HomePresenter.swift │ │ │ ├── HomeProtocols.swift │ │ │ ├── HomeRouter.swift │ │ │ ├── HomeView.swift │ │ │ └── HomeViewController.swift │ │ ├── Login │ │ │ ├── LoginConfigurator.swift │ │ │ ├── LoginInteractor.swift │ │ │ ├── LoginPresenter.swift │ │ │ ├── LoginProtocols.swift │ │ │ ├── LoginRouter.swift │ │ │ └── LoginViewController.swift │ │ ├── SampleModule │ │ │ ├── SampleInteractor.swift │ │ │ ├── SamplePresenter.swift │ │ │ ├── SampleProtocols.swift │ │ │ ├── SampleRouter.swift │ │ │ ├── SampleView.swift │ │ │ └── SampleViewController.swift │ │ ├── Transfers │ │ │ ├── TransfersEntity.swift │ │ │ ├── TransfersInteractor.swift │ │ │ ├── TransfersPresenter.swift │ │ │ ├── TransfersProtocols.swift │ │ │ ├── TransfersRouter .swift │ │ │ ├── TransfersView.swift │ │ │ └── TransfersViewController.swift │ │ └── UserProfile │ │ │ ├── UserProfileDefinitions.swift │ │ │ ├── UserProfileInteractor.swift │ │ │ ├── UserProfilePresenter.swift │ │ │ ├── UserProfileProtocols.swift │ │ │ ├── UserProfileRouter.swift │ │ │ └── UserProfileViewController.swift │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── devpass-logo-blue copy 2-1.png │ │ │ │ ├── devpass-logo-blue copy 2.png │ │ │ │ ├── devpass-logo-blue copy 3.png │ │ │ │ ├── devpass-logo-blue copy 4.png │ │ │ │ ├── devpass-logo-blue copy 5.png │ │ │ │ └── devpass-logo-blue copy.png │ │ │ ├── Contents.json │ │ │ ├── airplane.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── airplane.circle.fill.svg │ │ │ ├── arrow.up.arrow.down.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── arrow.up.arrow.down.svg │ │ │ ├── avatar-placeholder.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── avatar-placeholder.png │ │ │ ├── bag.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── bag.circle.fill.svg │ │ │ ├── car.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── car.circle.fill.svg │ │ │ ├── checkmark.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── checkmark.circle.fill.svg │ │ │ ├── fork.knife.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── fork.knife.circle.fill.svg │ │ │ ├── heart.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── heart.circle.fill.svg │ │ │ └── house.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── house.fill.svg │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ └── Service │ │ └── FinanceService.swift ├── FinanceAppTests │ ├── FinanceAppTests.swift │ ├── FinanceServiceTests.swift │ ├── Info.plist │ └── Modules │ │ ├── Confirmation │ │ └── ConfirmationInteractorTests.swift │ │ └── Transfers │ │ └── TransfersInteractorTests.swift ├── FinanceAppUITests │ ├── FinanceAppUITests.swift │ ├── FinanceAppUITestsLaunchTests.swift │ └── Info.plist └── project.yml ├── devsprint-julio-fernandes-1 ├── FinanceApp.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── FinanceApp.xcscheme ├── FinanceApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── Components │ │ ├── ActivityCellView.swift │ │ ├── ActivityListView.swift │ │ ├── ButtonView.swift │ │ ├── ChooseContactView.swift │ │ ├── ContactCellView.swift │ │ ├── HomeHeaderView.swift │ │ ├── TabBarController.swift │ │ └── UserProfileHeaderView.swift │ ├── Modules │ │ ├── ActivityDetails │ │ │ ├── ActivityDetailsInteractor.swift │ │ │ ├── ActivityDetailsPresenter.swift │ │ │ ├── ActivityDetailsProtocols.swift │ │ │ ├── ActivityDetailsRouter.swift │ │ │ ├── ActivityDetailsView.swift │ │ │ ├── ActivityDetailsViewController.swift │ │ │ └── Entities │ │ │ │ └── ActivityEntity.swift │ │ ├── Confirmation │ │ │ ├── ConfirmationEntity.swift │ │ │ ├── ConfirmationPresenter.swift │ │ │ ├── ConfirmationProtocols.swift │ │ │ ├── ConfirmationRouter.swift │ │ │ ├── ConfirmationView.swift │ │ │ └── ConfirmationViewController.swift │ │ ├── ContactList │ │ │ ├── ContactEntity.swift │ │ │ ├── ContactListInteractor.swift │ │ │ ├── ContactListPresenter.swift │ │ │ ├── ContactListProtocols.swift │ │ │ ├── ContactListRouter.swift │ │ │ ├── ContactListView.swift │ │ │ └── ContactListViewController.swift │ │ ├── Home │ │ │ ├── Entities │ │ │ │ └── HomeEntity.swift │ │ │ ├── HomeInteractor.swift │ │ │ ├── HomePresenter.swift │ │ │ ├── HomeProtocols.swift │ │ │ ├── HomeRouter.swift │ │ │ ├── HomeView.swift │ │ │ └── HomeViewController.swift │ │ ├── Transfers │ │ │ ├── TransferPresenter.swift │ │ │ ├── TransfersEntity.swift │ │ │ ├── TransfersInteractor.swift │ │ │ ├── TransfersProtocols.swift │ │ │ ├── TransfersRouter.swift │ │ │ ├── TransfersView.swift │ │ │ └── TransfersViewController.swift │ │ └── UserProfile │ │ │ ├── Entities │ │ │ ├── AccountEntity.swift │ │ │ └── UserEntity.swift │ │ │ ├── UserProfileInteractor.swift │ │ │ ├── UserProfilePresenter.swift │ │ │ ├── UserProfileProtocols.swift │ │ │ ├── UserProfileRouter.swift │ │ │ ├── UserProfileView.swift │ │ │ └── UserProfileViewController.swift │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── devpass-logo-blue copy 2-1.png │ │ │ │ ├── devpass-logo-blue copy 2.png │ │ │ │ ├── devpass-logo-blue copy 3.png │ │ │ │ ├── devpass-logo-blue copy 4.png │ │ │ │ ├── devpass-logo-blue copy 5.png │ │ │ │ └── devpass-logo-blue copy.png │ │ │ ├── Contents.json │ │ │ ├── airplane.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── airplane.circle.fill.svg │ │ │ ├── arrow.up.arrow.down.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── arrow.up.arrow.down.svg │ │ │ ├── avatar-placeholder.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── avatar-placeholder.png │ │ │ ├── bag.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── bag.circle.fill.svg │ │ │ ├── car.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── car.circle.fill.svg │ │ │ ├── checkmark.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── checkmark.circle.fill.svg │ │ │ ├── fork.knife.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── fork.knife.circle.fill.svg │ │ │ ├── heart.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── heart.circle.fill.svg │ │ │ ├── house.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── house.fill.svg │ │ │ └── x.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── x.circle.fill.svg │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ └── Service │ │ ├── FinanceEndpoint.swift │ │ ├── FinanceService.swift │ │ └── FinanceServiceError.swift ├── FinanceAppTests │ └── Modules │ │ ├── ActivityDetails │ │ ├── ActivityDetailsInteractorTests.swift │ │ ├── ActivityDetailsPresenterTests.swift │ │ ├── ActivityDetailsRouterTests.swift │ │ └── ActivityDetailsViewControllerTests.swift │ │ ├── Confirmation │ │ ├── ConfirmationPresenterTests.swift │ │ ├── ConfirmationRouterTests.swift │ │ └── ConfirmationViewControllerTests.swift │ │ ├── ContactList │ │ ├── ContactListInteractorTests.swift │ │ ├── ContactListPresenterTests.swift │ │ ├── ContactListRouterTests.swift │ │ └── ContactListViewControllerTests.swift │ │ ├── Home │ │ ├── HomeInteractorTests.swift │ │ ├── HomePresenterTests.swift │ │ ├── HomeRouterTests.swift │ │ ├── HomeViewControllerTests.swift │ │ └── HomeViewTests.swift │ │ ├── Transfers │ │ ├── TransfersInteractorTests.swift │ │ ├── TransfersPresenterTests.swift │ │ ├── TransfersRouterTests.swift │ │ └── TransfersViewControllerTests.swift │ │ └── UserProfile │ │ ├── UserProfileInteractorTests.swift │ │ ├── UserProfilePresenterTests.swift │ │ ├── UserProfileRouterTests.swift │ │ └── UserProfileViewControllerTests.swift ├── FinanceAppUITests │ ├── FinanceAppUITests.swift │ └── FinanceAppUITestsLaunchTests.swift └── Templates │ ├── README.md │ ├── VIPER.xctemplate │ ├── TemplateIcon.png │ ├── TemplateIcon@2x.png │ ├── TemplateInfo.plist │ ├── ___FILEBASENAME___Configurator.swift │ ├── ___FILEBASENAME___Interactor.swift │ ├── ___FILEBASENAME___Presenter.swift │ ├── ___FILEBASENAME___Protocols.swift │ ├── ___FILEBASENAME___Router.swift │ └── ___FILEBASENAME___ViewController.swift │ └── install_templates ├── devsprint-julio-fernandes-3 ├── Plugins │ └── Tuist │ │ ├── Package.swift │ │ ├── Plugin.swift │ │ ├── ProjectDescriptionHelpers │ │ └── LocalHelper.swift │ │ └── Sources │ │ └── tuist-my-cli │ │ └── main.swift ├── Project.swift ├── Targets │ └── FinanceApp │ │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── devpass-logo-blue copy 2-1.png │ │ │ │ ├── devpass-logo-blue copy 2.png │ │ │ │ ├── devpass-logo-blue copy 3.png │ │ │ │ ├── devpass-logo-blue copy 4.png │ │ │ │ ├── devpass-logo-blue copy 5.png │ │ │ │ └── devpass-logo-blue copy.png │ │ │ ├── Contents.json │ │ │ ├── airplane.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── airplane.circle.fill.svg │ │ │ ├── arrow.up.arrow.down.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── arrow.up.arrow.down.svg │ │ │ ├── avatar-placeholder.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── avatar-placeholder.png │ │ │ ├── bag.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── bag.circle.fill.svg │ │ │ ├── car.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── car.circle.fill.svg │ │ │ ├── checkmark.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── checkmark.circle.fill.svg │ │ │ ├── fork.knife.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── fork.knife.circle.fill.svg │ │ │ ├── heart.circle.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── heart.circle.fill.svg │ │ │ └── house.fill.symbolset │ │ │ │ ├── Contents.json │ │ │ │ └── house.fill.svg │ │ └── LaunchScreen.storyboard │ │ ├── Sources │ │ ├── AppDelegate │ │ │ └── AppDelegate.swift │ │ ├── Components │ │ │ ├── ActivityCellView.swift │ │ │ ├── ActivityListView.swift │ │ │ ├── ContactCellView.swift │ │ │ ├── HomeHeaderView.swift │ │ │ ├── TabBarController.swift │ │ │ └── UserProfileHeaderView.swift │ │ ├── Entities │ │ │ ├── ContactEntity │ │ │ │ └── ContactEntity.swift │ │ │ └── TransfersEntity │ │ │ │ └── TransfersEntity.swift │ │ ├── Modules │ │ │ ├── ActivityDetails │ │ │ │ ├── ActivityDetailsConfigurator.swift │ │ │ │ ├── ActivityDetailsInteractor.swift │ │ │ │ ├── ActivityDetailsPresenter.swift │ │ │ │ ├── ActivityDetailsProtocols.swift │ │ │ │ ├── ActivityDetailsRouter.swift │ │ │ │ ├── ActivityDetailsView.swift │ │ │ │ └── ActivityDetailsViewController.swift │ │ │ ├── Confirmation │ │ │ │ ├── ConfirmationView.swift │ │ │ │ └── ConfirmationViewController.swift │ │ │ ├── ContactList │ │ │ │ ├── ContactListConfigurator.swift │ │ │ │ ├── ContactListInteractor.swift │ │ │ │ ├── ContactListPresenter.swift │ │ │ │ ├── ContactListProtocols.swift │ │ │ │ ├── ContactListRouter.swift │ │ │ │ ├── ContactListView.swift │ │ │ │ └── ContactListViewController.swift │ │ │ ├── Home │ │ │ │ ├── HomeConfigurator.swift │ │ │ │ ├── HomeInteractor.swift │ │ │ │ ├── HomePresenter.swift │ │ │ │ ├── HomeProtocols.swift │ │ │ │ ├── HomeRouter.swift │ │ │ │ ├── HomeView.swift │ │ │ │ └── HomeViewController.swift │ │ │ ├── SampleModule │ │ │ │ ├── SampleInteractor.swift │ │ │ │ ├── SamplePresenter.swift │ │ │ │ ├── SampleProtocols.swift │ │ │ │ ├── SampleRouter.swift │ │ │ │ ├── SampleView.swift │ │ │ │ └── SampleViewController.swift │ │ │ ├── Transfers │ │ │ │ ├── TransfersConfigurator.swift │ │ │ │ ├── TransfersInteractor.swift │ │ │ │ ├── TransfersPresenter.swift │ │ │ │ ├── TransfersProtocols.swift │ │ │ │ ├── TransfersRouter.swift │ │ │ │ ├── TransfersView.swift │ │ │ │ └── TransfersViewController.swift │ │ │ └── UserProfile │ │ │ │ ├── UserProfileConfigurator.swift │ │ │ │ ├── UserProfileInteractor.swift │ │ │ │ ├── UserProfilePresenter.swift │ │ │ │ ├── UserProfileProtocols.swift │ │ │ │ ├── UserProfileRouter.swift │ │ │ │ ├── UserProfileView.swift │ │ │ │ └── UserProfileViewController.swift │ │ └── Service │ │ │ ├── ActivityDetailsTempService.swift │ │ │ └── FinanceService.swift │ │ └── Tests │ │ ├── FinanceAppTests.swift │ │ └── Modules │ │ └── ActivityDetails │ │ ├── ActivityDetailsConfiguratorTests.swift │ │ ├── ActivityDetailsInteractorTests.swift │ │ ├── ActivityDetailsPresenterTests.swift │ │ ├── ActivityDetailsRouterTests.swift │ │ ├── ActivityDetailsViewControllerTests.swift │ │ ├── ActivityDetailsViewTests.swift │ │ └── MainQueueActivityDetailsServiceDecoratorTests.swift └── Tuist │ ├── Config.swift │ └── ProjectDescriptionHelpers │ └── Project+Templates.swift └── devsprint-pedro-alvarez-1 ├── FinanceApp.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── FinanceApp ├── AppDelegate │ ├── AppDelegate.swift │ └── SceneDelegate.swift ├── Components │ ├── ActivityCellView.swift │ ├── ActivityListView.swift │ ├── HomeHeaderView.swift │ ├── TabBarController.swift │ └── UserProfileHeaderView.swift ├── Modules │ ├── ActivityDetails │ │ ├── Business │ │ │ ├── ActivityDetailsEntity.swift │ │ │ └── ActivityDetailsInteractor.swift │ │ ├── Presentation │ │ │ ├── ActivityDetailsPresenter.swift │ │ │ └── ActivityDetailsViewModel.swift │ │ ├── Router │ │ │ └── ActivityDetailsRouter.swift │ │ └── Views │ │ │ ├── ActivityDetailsFactory.swift │ │ │ ├── ActivityDetailsView.swift │ │ │ └── ActivityDetailsViewController.swift │ ├── Confirmation │ │ ├── ConfirmationView.swift │ │ └── ConfirmationViewController.swift │ ├── ContactList 2 │ │ ├── Business │ │ │ └── ContactListInteractor.swift │ │ └── ContactListFactory.swift │ ├── ContactList │ │ ├── Business │ │ │ └── ContactListInteractor.swift │ │ ├── ContactListFactory.swift │ │ ├── Presentation │ │ │ ├── ContactListPresenter.swift │ │ │ ├── ContactListRouter.swift │ │ │ └── ContactListViewModel.swift │ │ └── View │ │ │ ├── ContactCellView.swift │ │ │ ├── ContactListView.swift │ │ │ └── ContactListViewController.swift │ ├── Home │ │ ├── HomeView.swift │ │ └── HomeViewController.swift │ ├── SampleModule │ │ ├── SampleInteractor.swift │ │ ├── SamplePresenter.swift │ │ ├── SampleProtocols.swift │ │ ├── SampleRouter.swift │ │ ├── SampleView.swift │ │ └── SampleViewController.swift │ ├── Transfers │ │ ├── TransfersView.swift │ │ └── TransfersViewController.swift │ └── UserProfile │ │ ├── UserProfileView.swift │ │ └── UserProfileViewController.swift ├── Resources │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── devpass-logo-blue copy 2-1.png │ │ │ ├── devpass-logo-blue copy 2.png │ │ │ ├── devpass-logo-blue copy 3.png │ │ │ ├── devpass-logo-blue copy 4.png │ │ │ ├── devpass-logo-blue copy 5.png │ │ │ └── devpass-logo-blue copy.png │ │ ├── Contents.json │ │ ├── airplane.circle.fill.symbolset │ │ │ ├── Contents.json │ │ │ └── airplane.circle.fill.svg │ │ ├── arrow.up.arrow.down.symbolset │ │ │ ├── Contents.json │ │ │ └── arrow.up.arrow.down.svg │ │ ├── avatar-placeholder.imageset │ │ │ ├── Contents.json │ │ │ └── avatar-placeholder.png │ │ ├── bag.circle.fill.symbolset │ │ │ ├── Contents.json │ │ │ └── bag.circle.fill.svg │ │ ├── car.circle.fill.symbolset │ │ │ ├── Contents.json │ │ │ └── car.circle.fill.svg │ │ ├── checkmark.circle.fill.symbolset │ │ │ ├── Contents.json │ │ │ └── checkmark.circle.fill.svg │ │ ├── fork.knife.circle.fill.symbolset │ │ │ ├── Contents.json │ │ │ └── fork.knife.circle.fill.svg │ │ ├── heart.circle.fill.symbolset │ │ │ ├── Contents.json │ │ │ └── heart.circle.fill.svg │ │ └── house.fill.symbolset │ │ │ ├── Contents.json │ │ │ └── house.fill.svg │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ └── Info.plist └── Service │ ├── Entities │ ├── Contact.swift │ ├── HomeData.swift │ ├── TransferResult.swift │ └── UserProfile.swift │ └── FinanceService.swift ├── FinanceAppTests ├── FinanceAppTests.swift └── Modules │ └── ActivityDetails │ └── ActivityDetailsPresenterTest.swift └── FinanceAppUITests ├── FinanceAppUITests.swift └── FinanceAppUITestsLaunchTests.swift /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ------------ APAGAR ------------ 2 | Emojis para os titulos dos MR's 3 | * ✨ - Introduce new features 4 | * 🚧 - Work in progress 5 | More on: https://gitmoji.dev 6 | ------------ APAGAR ------------ 7 | 8 | ### Descrição simples da nova feature 9 | 10 | 11 | ### Checklist: 12 | Coloque um ```x``` nas caixas que se aplicam. 13 | - [] Não adiciona código duplicado 14 | - [] Não contém código comentado 15 | - [] Não contém código WIP 16 | 17 | ### Evidências da feature: 18 | | iPhone SE | iPhone 12 Max | 19 | | ------ | ------ | 20 | | print | print | 21 | -------------------------------------------------------------------------------- /api/contact_list_endpoint.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Ronald Robertson", 4 | "phone": "+55 (11) 99999-9999" 5 | }, 6 | { 7 | "name": "Johnny Watson", 8 | "phone": "+55 (11) 99999-9999" 9 | }, 10 | { 11 | "name": "Annette Cooper", 12 | "phone": "+55 (11) 99999-9999" 13 | }, 14 | { 15 | "name": "Arthur Bell", 16 | "phone": "+55 (11) 99999-9999" 17 | }, 18 | { 19 | "name": "Jane Warren", 20 | "phone": "+55 (11) 99999-9999" 21 | }, 22 | { 23 | "name": "Morris Henry", 24 | "phone": "+55 (11) 99999-9999" 25 | }, 26 | { 27 | "name": "Irma Flores", 28 | "phone": "+55 (11) 99999-9999" 29 | } 30 | ] -------------------------------------------------------------------------------- /api/home_endpoint.json: -------------------------------------------------------------------------------- 1 | { 2 | "balance": 15459.27, 3 | "savings": 1000.0, 4 | "spending": 500.0, 5 | "activity": [ 6 | { 7 | "name": "Mall", 8 | "price": 100.0, 9 | "time": "8:57 AM" 10 | }, 11 | { 12 | "name": "Food Court", 13 | "price": 100.0, 14 | "time": "8:57 AM" 15 | }, 16 | { 17 | "name": "Oceanic Airlines", 18 | "price": 100.0, 19 | "time": "8:57 AM" 20 | }, 21 | { 22 | "name": "Gym Membership", 23 | "price": 100.0, 24 | "time": "8:57 AM" 25 | }, 26 | { 27 | "name": "Private Transport", 28 | "price": 100.0, 29 | "time": "8:57 AM" 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /api/transfer_successful_endpoint.json: -------------------------------------------------------------------------------- 1 | { 2 | "success": true 3 | } -------------------------------------------------------------------------------- /api/user_profile_endpoint.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Irma Flores", 3 | "phone": "+55 (11) 99999-9999", 4 | "email": "irma@devpass.com.br", 5 | "address": "Rua Bela Cintra, 495", 6 | "account": { 7 | "agency": "0001", 8 | "account": "123456-7" 9 | } 10 | } -------------------------------------------------------------------------------- /screenshots/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/screenshots/screenshot-1.png -------------------------------------------------------------------------------- /screenshots/screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/screenshots/screenshot-2.png -------------------------------------------------------------------------------- /screenshots/screenshot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/screenshots/screenshot-3.png -------------------------------------------------------------------------------- /screenshots/screenshot-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/screenshots/screenshot-4.png -------------------------------------------------------------------------------- /screenshots/screenshot-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/screenshots/screenshot-5.png -------------------------------------------------------------------------------- /screenshots/screenshot-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/screenshots/screenshot-6.png -------------------------------------------------------------------------------- /screenshots/screenshot-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/screenshots/screenshot-7.png -------------------------------------------------------------------------------- /screenshots/screenshot-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/screenshots/screenshot-8.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/AppDelegate/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | @main 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | 14 | 15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 16 | 17 | return true 18 | } 19 | 20 | // MARK: UISceneSession Lifecycle 21 | 22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 23 | 24 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/AppDelegate/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 11 | 12 | var window: UIWindow? 13 | 14 | 15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 16 | 17 | guard let windowScene = (scene as? UIWindowScene) else { return } 18 | 19 | self.window = UIWindow(frame: UIScreen.main.bounds) 20 | self.window?.rootViewController = UINavigationController(rootViewController: TabBarController()) 21 | self.window?.windowScene = windowScene 22 | self.window?.makeKeyAndVisible() 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Entities/Activity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Activity.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 17/03/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Activity: Codable { 11 | 12 | enum CategoryType: String, Codable { 13 | case shopping = "Shopping" 14 | } 15 | 16 | let name: String 17 | let category: CategoryType? 18 | let price: Double 19 | let time: String 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Entities/HomeData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeInformation.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 20/03/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct HomeData: Codable { 11 | let balance: Double 12 | let savings: Double 13 | let spending: Double 14 | let activity: [Activity] 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Extensions/Collection+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Collection+Extension.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 21/03/22. 6 | // 7 | 8 | extension Collection where Indices.Iterator.Element == Index { 9 | public subscript(safe index: Index) -> Iterator.Element? { 10 | return (startIndex <= index && index < endIndex) ? self[index] : nil 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Extensions/Double+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceApp+Double.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 17/03/22. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Double { 11 | func toBRLCurrency(identifier: String = "pt_BR") -> String? { 12 | let formatter = NumberFormatter() 13 | formatter.locale = Locale(identifier: identifier) 14 | formatter.numberStyle = .currency 15 | return formatter.string(for: self) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Extensions/UIViewController+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extension.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 18/03/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | extension UIViewController { 12 | func showAlertError(message: String) { 13 | let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert) 14 | let okAction = UIAlertAction(title: "OK", style: .default, handler: nil) 15 | alert.addAction(okAction) 16 | self.present(alert, animated: true, completion: nil) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/ActivityDetails/ActivityDetailsProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 14/03/22. 6 | // 7 | 8 | import UIKit 9 | 10 | // MARK: - ActivityDetailsPresenterProtocol 11 | 12 | protocol ActivityDetailsPresenterProtocol { 13 | var view: ActivityDetailsPresenterDelegate? { get set } 14 | var interactor: ActivityDetailsInteractorProtocol? { get set } 15 | var router: ActivityDetailsRouterProtocol? { get set } 16 | 17 | func viewDidLoad() 18 | } 19 | 20 | // MARK: - ActivityDetailsRouterProtocol 21 | 22 | protocol ActivityDetailsRouterProtocol { 23 | static func createModule() -> UIViewController 24 | } 25 | 26 | // MARK: - ActivityDetailsInteractorProtocol 27 | 28 | protocol ActivityDetailsInteractorProtocol { 29 | var presenter: ActivityDetailsInteractorDelegate? { get set } 30 | 31 | func fetchData() 32 | } 33 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/Confirmation/ConfirmationViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class ConfirmationViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = ConfirmationView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/ContactList/ContactListInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 21/03/22. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - ContactListInteractorDelegate 11 | 12 | protocol ContactListInteractorDelegate: AnyObject { 13 | 14 | } 15 | 16 | // MARK: - ContactListInteractor 17 | 18 | final class ContactListInteractor: ContactListInteractorProtocol { 19 | 20 | // MARK: Public Properties 21 | 22 | weak var presenter: ContactListInteractorDelegate? 23 | 24 | // MARK: Public Functions 25 | 26 | func fetchData() { 27 | // TODO 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/ContactList/ContactListPresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListPresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 21/03/22. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - ContactListPresenterDelegate 11 | 12 | protocol ContactListPresenterDelegate: AnyObject { 13 | 14 | } 15 | 16 | // MARK: - ContactListPresenter 17 | 18 | final class ContactListPresenter: ContactListPresenterProtocol { 19 | 20 | // MARK: Public Properties 21 | 22 | weak var view: ContactListPresenterDelegate? 23 | var interactor: ContactListInteractorProtocol? 24 | var router: ContactListRouterProtocol? 25 | 26 | // MARK: Public Methods 27 | 28 | func viewDidLoad() { 29 | 30 | } 31 | } 32 | 33 | // MARK: - ContactListInteractorDelegate 34 | extension ContactListPresenter: ContactListInteractorDelegate { 35 | 36 | } 37 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/ContactList/ContactListProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 21/03/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | // MARK: - ContactListPresenterProtocol 12 | 13 | protocol ContactListPresenterProtocol { 14 | var view: ContactListPresenterDelegate? { get set } 15 | var interactor: ContactListInteractorProtocol? { get set } 16 | var router: ContactListRouterProtocol? { get set } 17 | 18 | func viewDidLoad() 19 | } 20 | 21 | // MARK: - ContactListRouterProtocol 22 | 23 | protocol ContactListRouterProtocol { 24 | static func createModule() -> UIViewController 25 | } 26 | 27 | // MARK: - ContactListInteractorProtocol 28 | 29 | protocol ContactListInteractorProtocol { 30 | var presenter: ContactListInteractorDelegate? { get set } 31 | 32 | func fetchData() 33 | } 34 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/ContactList/ContactListViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | // MARK: - ContactListViewController 11 | 12 | final class ContactListViewController: UIViewController { 13 | 14 | // MARK: Public Properties 15 | 16 | var presenter: ContactListPresenterProtocol? 17 | 18 | override func loadView() { 19 | self.view = ContactListView() 20 | } 21 | } 22 | 23 | // MARK: - ContactListPresenterDelegate 24 | 25 | extension ContactListViewController: ContactListPresenterDelegate { 26 | 27 | } 28 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/Home/HomeProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 20/03/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | // MARK: - HomePresenterProtocol 12 | 13 | protocol HomePresenterProtocol { 14 | var view: HomePresenterDelegate? { get set } 15 | var interactor: HomeIteractorProtocol? { get set } 16 | var router: HomeRouterProtocol? { get set } 17 | 18 | func viewDidLoad() 19 | } 20 | 21 | // MARK: - HomeRouterProtocol 22 | 23 | protocol HomeRouterProtocol { 24 | static func createModule() -> UIViewController 25 | } 26 | 27 | // MARK: - HomeIteractorProtocol 28 | 29 | protocol HomeIteractorProtocol { 30 | var presenter: HomeInteractorDelegate? { get set } 31 | 32 | func fetchData() 33 | } 34 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/Home/HomeRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 20/03/22. 6 | // 7 | 8 | import UIKit 9 | 10 | // MARK: - HomeRouter 11 | 12 | final class HomeRouter: HomeRouterProtocol { 13 | 14 | // MARK: Public Methods 15 | 16 | static func createModule() -> UIViewController { 17 | let viewController = HomeViewController() 18 | 19 | let presenter: HomePresenterProtocol & HomeInteractorDelegate = HomePresenter() 20 | 21 | viewController.presenter = presenter 22 | viewController.presenter?.router = HomeRouter() 23 | viewController.presenter?.view = viewController 24 | viewController.presenter?.interactor = HomeInteractor() 25 | viewController.presenter?.interactor?.presenter = presenter 26 | 27 | return viewController 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/SampleModule/SampleInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SampleInteractorDelegate: AnyObject { 11 | 12 | func didFetchData() 13 | } 14 | 15 | class SampleInteractor: SampleInteractorProtocol { 16 | 17 | weak var presenter: SampleInteractorDelegate? 18 | 19 | func fetchData() { 20 | 21 | presenter?.didFetchData() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/SampleModule/SamplePresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SamplePresenterDelegate: AnyObject { 11 | 12 | func showData() 13 | } 14 | 15 | class SamplePresenter: SamplePresenterProtocol { 16 | 17 | weak var view: SamplePresenterDelegate? 18 | var interactor: SampleInteractorProtocol? 19 | var router: SampleRouterProtocol? 20 | 21 | func viewDidLoad() { 22 | 23 | interactor?.fetchData() 24 | } 25 | } 26 | 27 | extension SamplePresenter: SampleInteractorDelegate { 28 | 29 | func didFetchData() { 30 | 31 | view?.showData() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/SampleModule/SampleProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol SamplePresenterProtocol { 12 | 13 | var view: SamplePresenterDelegate? { get set } 14 | var interactor: SampleInteractorProtocol? { get set } 15 | var router: SampleRouterProtocol? { get set } 16 | 17 | func viewDidLoad() 18 | } 19 | 20 | protocol SampleRouterProtocol { 21 | 22 | static func createModule() -> UINavigationController 23 | func navigateToNewModule() 24 | } 25 | 26 | protocol SampleInteractorProtocol { 27 | 28 | var presenter: SampleInteractorDelegate? { get set } 29 | func fetchData() 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/SampleModule/SampleViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SampleViewController: UIViewController { 11 | 12 | var presenter: SamplePresenterProtocol? 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | presenter?.viewDidLoad() 18 | } 19 | 20 | override func loadView() { 21 | self.view = SampleView() 22 | } 23 | } 24 | 25 | extension SampleViewController: SamplePresenterDelegate { 26 | 27 | func showData() { 28 | 29 | print("Here is your data, View!") 30 | } 31 | } 32 | 33 | 34 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/Transfers/TransferInteractor.swift: -------------------------------------------------------------------------------- 1 | protocol TransferInteractorDelegate: AnyObject { 2 | } 3 | 4 | class TransferInteractor: TransferInteractorProtocol { 5 | 6 | weak var presenter: TransferInteractorDelegate? 7 | } 8 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/Transfers/TransferPresenter.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | protocol TransferPresenterDelegate: AnyObject { 5 | 6 | func showData() 7 | } 8 | 9 | class TransferPresenter: TransferPresenterProtocol { 10 | 11 | weak var view: TransferPresenterDelegate? 12 | var interactor: TransferInteractorProtocol? 13 | var router: TransferRouterProtocol? 14 | 15 | 16 | func didPressChooseContactButton(controller: UIViewController) { 17 | router?.navigateToChooseContacts(controller: controller) 18 | } 19 | 20 | func didPressTransferButton(controller: UIViewController) { 21 | router?.navigateToTransfer(controller: controller) 22 | } 23 | 24 | } 25 | 26 | extension TransferPresenter: TransferInteractorDelegate { 27 | 28 | func didFetchData() { 29 | 30 | view?.showData() 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/Transfers/TransferProtocols.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import UIKit 3 | 4 | protocol TransferPresenterProtocol { 5 | 6 | var view: TransferPresenterDelegate? { get set } 7 | var interactor: TransferInteractorProtocol? { get set } 8 | var router: TransferRouterProtocol? { get set } 9 | 10 | func didPressChooseContactButton(controller: UIViewController) 11 | func didPressTransferButton(controller: UIViewController) 12 | } 13 | 14 | protocol TransferRouterProtocol { 15 | static func createModule() -> UINavigationController 16 | func navigateToTransfer(controller: UIViewController) 17 | func navigateToChooseContacts(controller: UIViewController) 18 | } 19 | 20 | protocol TransferInteractorProtocol { 21 | 22 | var presenter: TransferInteractorDelegate? { get set } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Modules/UserProfile/UserProfileViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class UserProfileViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = UserProfileView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/airplane.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "airplane.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/arrow.up.arrow.down.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "arrow.up.arrow.down.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "avatar-placeholder.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/bag.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "bag.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/car.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "car.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/checkmark.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "checkmark.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/fork.knife.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "fork.knife.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/heart.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "heart.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Assets.xcassets/house.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "house.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIApplicationSceneManifest 6 | 7 | UIApplicationSupportsMultipleScenes 8 | 9 | UISceneConfigurations 10 | 11 | UIWindowSceneSessionRoleApplication 12 | 13 | 14 | UISceneConfigurationName 15 | Default Configuration 16 | UISceneDelegateClassName 17 | $(PRODUCT_MODULE_NAME).SceneDelegate 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Service/Finance/FinanceEndpoint.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceEndpoint.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 17/03/22. 6 | // 7 | 8 | enum FinanceEndpoint { 9 | case activityDetail 10 | } 11 | 12 | extension FinanceEndpoint: Endpoint { 13 | var path: String { 14 | switch self { 15 | case .activityDetail: 16 | return "/devpass-tech/challenge-finance-app/main/api/activity_details_endpoint.json" 17 | } 18 | } 19 | 20 | var method: RequestMethod { 21 | switch self { 22 | case .activityDetail: 23 | return .get 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Service/Finance/FinanceService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceService.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | protocol FinanceServiceProtocol { 9 | func fetchActivityDetail() async -> Result 10 | } 11 | 12 | struct FinanceService: HTTPClient, FinanceServiceProtocol { 13 | 14 | func fetchActivityDetail() async -> Result { 15 | return await sendRequest(endpoint: FinanceEndpoint.activityDetail, responseModel: Activity.self) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Service/Home/HomeEndpoint.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeEndpoint.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 20/03/22. 6 | // 7 | 8 | enum HomeEndpoint { 9 | case homeInformation 10 | } 11 | 12 | extension HomeEndpoint: Endpoint { 13 | var path: String { 14 | switch self { 15 | case .homeInformation: 16 | return "/devpass-tech/challenge-finance-app/main/api/home_endpoint.json" 17 | } 18 | } 19 | 20 | var method: RequestMethod { 21 | switch self { 22 | case .homeInformation: 23 | return .get 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Service/Home/HomeService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeService.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 20/03/22. 6 | // 7 | 8 | // MARK: - HomeServiceProtocol 9 | 10 | protocol HomeServiceProtocol { 11 | func fetchHomeInformation() async -> Result 12 | } 13 | 14 | // MARK: - HomeService 15 | 16 | struct HomeService: HTTPClient, HomeServiceProtocol { 17 | 18 | // MARK: Public Methods 19 | 20 | func fetchHomeInformation() async -> Result { 21 | return await sendRequest(endpoint: HomeEndpoint.homeInformation, responseModel: HomeData.self) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Service/Manager/Constants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 18/03/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Constants { 11 | static let baseURL = "raw.githubusercontent.com" 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Service/Manager/Endpoint.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Endpoint.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 17/03/22. 6 | // 7 | 8 | protocol Endpoint { 9 | var baseURL: String { get } 10 | var path: String { get } 11 | var method: RequestMethod { get } 12 | var header: [String: String]? { get } 13 | var body: [String: String]? { get } 14 | } 15 | 16 | extension Endpoint { 17 | var baseURL: String { 18 | return Constants.baseURL 19 | } 20 | 21 | var header: [String: String]? { 22 | return nil 23 | } 24 | 25 | var body: [String: String]? { 26 | return nil 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Service/Manager/RequestError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequestError.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 17/03/22. 6 | // 7 | 8 | enum RequestError: Error { 9 | case decode 10 | case invalidURL 11 | case noResponse 12 | case unauthorized 13 | case unexpectedStatusCode 14 | case unknown 15 | 16 | var customMessage: String { 17 | switch self { 18 | case .decode: 19 | return "Decode error" 20 | case .unauthorized: 21 | return "Session expired" 22 | default: 23 | return "Unknown error" 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-faganello-1/FinanceApp/Service/Manager/RequestMethod.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RequestMethod.swift 3 | // FinanceApp 4 | // 5 | // Created by Victor Catão on 17/03/22. 6 | // 7 | 8 | enum RequestMethod: String { 9 | case delete = "DELETE" 10 | case get = "GET" 11 | case patch = "PATCH" 12 | case post = "POST" 13 | case put = "PUT" 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/AppDelegate/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | @main 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | 14 | 15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 16 | 17 | return true 18 | } 19 | 20 | // MARK: UISceneSession Lifecycle 21 | 22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 23 | 24 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/AppDelegate/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 11 | 12 | var window: UIWindow? 13 | 14 | 15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 16 | 17 | guard let windowScene = (scene as? UIWindowScene) else { return } 18 | 19 | self.window = UIWindow(frame: UIScreen.main.bounds) 20 | self.window?.rootViewController = UINavigationController(rootViewController: TabBarController()) 21 | self.window?.windowScene = windowScene 22 | self.window?.makeKeyAndVisible() 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Commons/JsonLoader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // JsonLoader.swift 3 | // FinanceApp 4 | // 5 | // Created by Caio Santos on 06/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol JsonLoaderProtocol: AnyObject { 11 | func readLocalFile(forName name: String) -> Data? 12 | } 13 | 14 | public class JsonLoader: JsonLoaderProtocol { 15 | public func readLocalFile(forName name: String) -> Data? { 16 | do { 17 | if let bundlePath = Bundle.main.path(forResource: name, ofType: "json"), 18 | let jsonData = try String(contentsOfFile: bundlePath).data(using: .utf8) { 19 | return jsonData 20 | } 21 | } catch { 22 | print(error) 23 | return nil 24 | } 25 | 26 | return nil 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Commons/Transporter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Transporter.swift 3 | // FinanceApp 4 | // 5 | // Created by Caio Santos on 06/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public class Transporter { 11 | public var data: T? 12 | 13 | public init(data: T?) { 14 | self.data = data 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Components/AlertView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlertView.swift 3 | // FinanceApp 4 | // 5 | // Created by rebert.m.teixeira on 02/02/22. 6 | // 7 | 8 | import UIKit 9 | 10 | final class AlertView { 11 | static func showAlert(title: String, message: String) -> UIAlertController { 12 | let alertView: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .alert) 13 | let action: UIAlertAction = UIAlertAction(title: "OK", style: .default, handler: nil) 14 | 15 | alertView.addAction(action) 16 | return alertView 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Components/ButtonView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ButtonView.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Components/ChooseContactView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChooseContactView.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/ActivityDetails/ActivityDetailsRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Douglas Cardoso Ferreira on 31/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | final class ActivityDetailsRouter: ActivityDetailsRouterProtocol { 11 | static func createModule() -> UIViewController { 12 | let viewController = ActivityDetailsViewController() 13 | let presenter: ActivityDetailsPresenterProtocol & ActivityDetailsInteractorDelegate = ActivityDetailsPresenter() 14 | 15 | viewController.presenter = presenter 16 | viewController.presenter?.view = viewController 17 | viewController.presenter?.router = ActivityDetailsRouter() 18 | viewController.presenter?.interactor = ActivityDetailsInteractor() 19 | viewController.presenter?.interactor?.presenter = presenter 20 | 21 | return viewController 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/Confirmation/ConfirmationDefinitions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationDefinitions.swift 3 | // FinanceApp 4 | // 5 | // Created by Hyago Henrique on 09/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | public struct ConfirmationTransporter { 11 | let success: Bool 12 | 13 | init(success: Bool) { 14 | self.success = success 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/Confirmation/ConfirmationInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Hyago Henrique on 01/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | 11 | final class ConfirmationInteractor { 12 | 13 | // MARK: - VIPER Properties 14 | weak var output: ConfirmationInteractorOutputProtocol? 15 | 16 | // MARK: - Private Properties 17 | 18 | var jsonLoader: JsonLoaderProtocol 19 | 20 | // MARK: - Inits 21 | 22 | init(jsonLoader: JsonLoaderProtocol) { 23 | self.jsonLoader = jsonLoader 24 | } 25 | 26 | // MARK: - Internal Methods 27 | 28 | 29 | // MARK: - Private Methods 30 | } 31 | 32 | extension ConfirmationInteractor: ConfirmationInteractorInputProtocol { 33 | 34 | } 35 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/Confirmation/ConfirmationRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Hyago Henrique on 01/02/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | final class ConfirmationRouter { 12 | 13 | // MARK: - VIPER Properties 14 | 15 | weak var viewController: UIViewController? 16 | } 17 | 18 | extension ConfirmationRouter: ConfirmationRouterProtocol { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/Home/HomeInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by rebert.m.teixeira on 01/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol HomeInteractorDelegate: AnyObject { 11 | func didRetriveHomeInfo(message: String) 12 | func onError(message: String) 13 | } 14 | 15 | final class HomeInteractor: HomeInteractorProtocol { 16 | weak var presenter: HomeInteractorDelegate? 17 | 18 | let isSuccess = Bool.random() 19 | 20 | func didFetchData() { 21 | if isSuccess { 22 | presenter?.didRetriveHomeInfo(message: "Deu bom! 😃") 23 | } else { 24 | presenter?.onError(message: "Deu ruim! 😢") 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/SampleModule/SampleInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SampleInteractorDelegate: AnyObject { 11 | 12 | func didFetchData() 13 | } 14 | 15 | final class SampleInteractor: SampleInteractorProtocol { 16 | 17 | weak var presenter: SampleInteractorDelegate? 18 | 19 | func fetchData() { 20 | 21 | presenter?.didFetchData() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/SampleModule/SamplePresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SamplePresenterDelegate: AnyObject { 11 | 12 | func showData() 13 | } 14 | 15 | final class SamplePresenter: SamplePresenterProtocol { 16 | 17 | weak var view: SamplePresenterDelegate? 18 | var interactor: SampleInteractorProtocol? 19 | var router: SampleRouterProtocol? 20 | 21 | func viewDidLoad() { 22 | 23 | interactor?.fetchData() 24 | } 25 | } 26 | 27 | extension SamplePresenter: SampleInteractorDelegate { 28 | 29 | func didFetchData() { 30 | 31 | view?.showData() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/SampleModule/SampleProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol SamplePresenterProtocol { 12 | 13 | var view: SamplePresenterDelegate? { get set } 14 | var interactor: SampleInteractorProtocol? { get set } 15 | var router: SampleRouterProtocol? { get set } 16 | 17 | func viewDidLoad() 18 | } 19 | 20 | protocol SampleRouterProtocol { 21 | 22 | static func createModule() -> UINavigationController 23 | func navigateToNewModule() 24 | } 25 | 26 | protocol SampleInteractorProtocol { 27 | 28 | var presenter: SampleInteractorDelegate? { get set } 29 | func fetchData() 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/SampleModule/SampleViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | final class SampleViewController: UIViewController { 11 | 12 | var presenter: SamplePresenterProtocol? 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | presenter?.viewDidLoad() 18 | } 19 | 20 | override func loadView() { 21 | self.view = SampleView() 22 | } 23 | } 24 | 25 | extension SampleViewController: SamplePresenterDelegate { 26 | 27 | func showData() { 28 | 29 | print("Here is your data, View!") 30 | } 31 | } 32 | 33 | 34 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/SampleV2Module/SampleEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Caio Santos on 06/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct SampleEntity: Codable { 11 | let title: String 12 | let description: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/SampleV2Module/SampleV2Configurator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleConfigurator.swift 3 | // FinanceApp 4 | // 5 | // Created by Caio Santos on 06/02/22. 6 | // 7 | 8 | import UIKit 9 | 10 | public final class SampleV2Configurator { 11 | public func createModule(transporter: Transporter) -> UIViewController { 12 | let router = SampleV2Router() 13 | let interactor = SampleV2Interactor(jsonLoader: JsonLoader()) 14 | let presenter = SampleV2Presenter(router: router, interactor: interactor, transporter: transporter) 15 | let viewController = SampleV2ViewController(presenter: presenter) 16 | presenter.viewController = viewController 17 | router.viewController = viewController 18 | interactor.output = presenter 19 | 20 | return viewController 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/SampleV2Module/SampleV2Definitions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleV2Definitions.swift 3 | // FinanceApp 4 | // 5 | // Created by Caio Santos on 06/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - Enums 11 | 12 | enum SampleV2SectionType { 13 | case section1 14 | case section2 15 | case sectionN 16 | } 17 | 18 | enum SampleV2CellType { 19 | case cell1 20 | case cell2 21 | case cellN 22 | } 23 | 24 | // MARK: - Data Source 25 | 26 | public struct SampleV2Transporter { 27 | let value1: String? 28 | let value2: String? 29 | 30 | init(value1: String?, value2: String?) { 31 | self.value1 = value1 32 | self.value2 = value2 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/SampleV2Module/SampleV2Router.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleV2Router.swift 3 | // FinanceApp 4 | // 5 | // Created by Caio Santos on 06/02/22. 6 | // 7 | 8 | import UIKit 9 | 10 | final class SampleV2Router { 11 | 12 | // MARK: - VIPER Properties 13 | 14 | weak var viewController: UIViewController? 15 | } 16 | 17 | // MARK: - Router Protocol 18 | extension SampleV2Router: SampleV2RouterProtocol { 19 | func navigateToViewXPTO() { 20 | let viewControllerToNavigateTo = SampleViewController() 21 | self.viewController?.navigationController?.present(viewControllerToNavigateTo, animated: true) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/SampleV2Module/sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Sample Title", 3 | "description": "Sample Description" 4 | } 5 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/Transfers/TransfersConfigurator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersConfigurator.swift 3 | // FinanceApp 4 | // 5 | // Created by Hyago Henrique on 08/02/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | public final class TransfersConfigurator { 12 | public func createModule() -> UIViewController { 13 | let router = TransfersRouter() 14 | let interactor = TransfersInteractor(jsonLoader: JsonLoader()) 15 | let presenter = TransfersPresenter(router: router, interactor: interactor) 16 | let viewController = TransfersViewController(presenter: presenter) 17 | 18 | presenter.viewController = viewController 19 | router.viewController = viewController 20 | interactor.output = presenter 21 | 22 | return viewController 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Modules/Transfers/TransfersRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Hyago Henrique on 31/01/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | final class TransfersRouter { 12 | 13 | // MARK: - VIPER Properties 14 | 15 | weak var viewController: UIViewController? 16 | } 17 | 18 | extension TransfersRouter: TransfersRouterProtocol { 19 | func navigateToContactList() { 20 | viewController?.navigationController?.present(ContactListRouter.createModule(), animated: true) 21 | } 22 | 23 | func navigateToConfirmation(isTransferSuccess: Bool) { 24 | let transporter = ConfirmationTransporter(success: isTransferSuccess) 25 | viewController?.navigationController?.present(ConfirmationConfigurator().createModule(transporter: Transporter(data: transporter)), animated: true) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/airplane.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "airplane.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/arrow.up.arrow.down.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "arrow.up.arrow.down.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "avatar-placeholder.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/bag.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "bag.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/car.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "car.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/checkmark.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "checkmark.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/fork.knife.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "fork.knife.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/heart.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "heart.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Assets.xcassets/house.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "house.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIApplicationSceneManifest 6 | 7 | UIApplicationSupportsMultipleScenes 8 | 9 | UISceneConfigurations 10 | 11 | UIWindowSceneSessionRoleApplication 12 | 13 | 14 | UISceneConfigurationName 15 | Default Configuration 16 | UISceneDelegateClassName 17 | $(PRODUCT_MODULE_NAME).SceneDelegate 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/api/activity_details_endpoint.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Mall", 3 | "category": "Shopping", 4 | "price": 100.0, 5 | "time": "8:57 AM" 6 | } -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/api/contact_list_endpoint.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Ronald Robertson", 4 | "phone": "+55 (11) 99999-9999" 5 | }, 6 | { 7 | "name": "Johnny Watson", 8 | "phone": "+55 (11) 99999-9999" 9 | }, 10 | { 11 | "name": "Annette Cooper", 12 | "phone": "+55 (11) 99999-9999" 13 | }, 14 | { 15 | "name": "Arthur Bell", 16 | "phone": "+55 (11) 99999-9999" 17 | }, 18 | { 19 | "name": "Jane Warren", 20 | "phone": "+55 (11) 99999-9999" 21 | }, 22 | { 23 | "name": "Morris Henry", 24 | "phone": "+55 (11) 99999-9999" 25 | }, 26 | { 27 | "name": "Irma Flores", 28 | "phone": "+55 (11) 99999-9999" 29 | } 30 | ] -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/api/home_endpoint.json: -------------------------------------------------------------------------------- 1 | { 2 | "balance": 15459.27, 3 | "savings": 1000.0, 4 | "spending": 500.0, 5 | "activity": [ 6 | { 7 | "name": "Mall", 8 | "price": 100.0, 9 | "time": "8:57 AM" 10 | }, 11 | { 12 | "name": "Food Court", 13 | "price": 100.0, 14 | "time": "8:57 AM" 15 | }, 16 | { 17 | "name": "Oceanic Airlines", 18 | "price": 100.0, 19 | "time": "8:57 AM" 20 | }, 21 | { 22 | "name": "Gym Membership", 23 | "price": 100.0, 24 | "time": "8:57 AM" 25 | }, 26 | { 27 | "name": "Private Transport", 28 | "price": 100.0, 29 | "time": "8:57 AM" 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/api/transfer_successful_endpoint.json: -------------------------------------------------------------------------------- 1 | { 2 | "success": true 3 | } -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Resources/api/user_profile_endpoint.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Irma Flores", 3 | "phone": "+55 (11) 99999-9999", 4 | "email": "irma@devpass.com.br", 5 | "address": "Rua Bela Cintra, 495", 6 | "account": { 7 | "agency": "0001", 8 | "account": "123456-7", 9 | "bank": "Devpass Private Bank" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Service/Entities/ActivityDetailsEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by rebert.m.teixeira on 06/02/22. 6 | // 7 | 8 | struct ActivityDetailsEntity: Codable { 9 | let name, category: String? 10 | let price: Double? 11 | let time: String? 12 | 13 | init(name: String, category: String, price: Double, time: String) { 14 | self.name = name 15 | self.category = category 16 | self.price = price 17 | self.time = time 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Service/Entities/ContactEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Thiago Henrique Alves Ferreira on 05/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - ContactEntity 11 | struct ContactEntity: Codable { 12 | let name: String 13 | let phone: String 14 | } 15 | 16 | typealias ContactListEntity = [ContactEntity] 17 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-1/FinanceApp/Service/Entities/TransfersEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Hyago Henrique on 09/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - TransfersEntity 11 | struct TransfersEntity: Codable { 12 | let success: Bool 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/AppDelegate/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | @main 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | 14 | 15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 16 | 17 | return true 18 | } 19 | 20 | // MARK: UISceneSession Lifecycle 21 | 22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 23 | 24 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/AppDelegate/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 11 | 12 | var window: UIWindow? 13 | 14 | 15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 16 | 17 | guard let windowScene = (scene as? UIWindowScene) else { return } 18 | 19 | self.window = UIWindow(frame: UIScreen.main.bounds) 20 | self.window?.rootViewController = UINavigationController(rootViewController: TabBarController()) 21 | self.window?.windowScene = windowScene 22 | self.window?.makeKeyAndVisible() 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Entities/HomeDTO.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeDTO.swift 3 | // FinanceApp 4 | // 5 | // Created by pedro tres on 04/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct HomeDTO { 11 | let balance: String 12 | let savings, spending: String 13 | let activity: [ActivityDTO] 14 | } 15 | 16 | struct ActivityDTO { 17 | let name: String 18 | let info: String 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Entities/HomeEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by pedro tres on 02/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Home: Codable { 11 | let balance: Double 12 | let savings, spending: Double 13 | let activity: [Activity] 14 | } 15 | 16 | struct Activity: Codable { 17 | let name: String 18 | let price: Double 19 | let time: String 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Extensions/CollectionExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionExtension.swift 3 | // FinanceApp 4 | // 5 | // Created by pedro tres on 02/05/22. 6 | // 7 | 8 | extension Collection where Indices.Iterator.Element == Index { 9 | public subscript(safe index: Index) -> Iterator.Element? { 10 | return (startIndex <= index && index < endIndex) ? self[index] : nil 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Extensions/StringExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DoubleExtension.swift 3 | // FinanceApp 4 | // 5 | // Created by pedro tres on 02/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Double { 11 | func toBRLCurrency(identifier: String = "pt_BR") -> String? { 12 | let formatter = NumberFormatter() 13 | formatter.locale = Locale(identifier: identifier) 14 | formatter.numberStyle = .currency 15 | return formatter.string(for: self) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Extensions/UIViewControllerExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extension.swift 3 | // FinanceApp 4 | // 5 | // Created by pedro tres on 02/05/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | extension UIViewController { 12 | func showAlertError(message: String) { 13 | let alert = UIAlertController(title: "Error", message: message, preferredStyle: .alert) 14 | let okAction = UIAlertAction(title: "OK", style: .default, handler: nil) 15 | alert.addAction(okAction) 16 | self.present(alert, animated: true, completion: nil) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/ActivityDetails/ActivityDetailsInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Bruno Vieira Souza on 26/04/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol ActivityDetailsInteractorDelegate: AnyObject { 11 | 12 | func didFetchData() 13 | 14 | } 15 | 16 | class ActivityDetailsInteractor: ActivityDetailsInteractorProtocol { 17 | 18 | weak var presenter: ActivityDetailsInteractorDelegate? 19 | 20 | func fetchData() { 21 | 22 | presenter?.didFetchData() 23 | 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/ActivityDetails/ActivityDetailsProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsProtocol.swift 3 | // FinanceApp 4 | // 5 | // Created by Bruno Vieira Souza on 26/04/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol ActivityDetailsPresenterProtocol { 12 | 13 | var view: ActivityDetailsPresenterDelegate? { get set } 14 | 15 | func viewDidLoad() 16 | } 17 | 18 | protocol ActivityDetailsRouterProtocol { 19 | var viewController: UIViewController? { get set } 20 | 21 | static func createModule() -> UIViewController 22 | 23 | } 24 | 25 | protocol ActivityDetailsInteractorProtocol { 26 | 27 | var presenter: ActivityDetailsInteractorDelegate? { get set } 28 | func fetchData() 29 | } 30 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/ActivityDetails/ActivityDetailsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class ActivityDetailsViewController: UIViewController { 11 | 12 | var presenter: ActivityDetailsPresenterProtocol? 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | presenter?.viewDidLoad() 18 | } 19 | 20 | override func loadView() { 21 | self.view = ActivityDetailsView() 22 | } 23 | } 24 | 25 | extension ActivityDetailsViewController: ActivityDetailsPresenterDelegate { 26 | 27 | func showData() { 28 | 29 | print("Here is your data, View!") 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/Confirmation/ConfirmationEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Bruno Vieira Souza on 28/04/22. 6 | // 7 | 8 | import Foundation 9 | 10 | class ConfirmationEntity { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/Confirmation/ConfirmationInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Bruno Vieira Souza on 28/04/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol ConfirmationInteractorDelegate: AnyObject { 11 | 12 | func didFetchData() 13 | 14 | } 15 | 16 | class ConfirmationInteractor: ConfirmationInteractorProtocol { 17 | 18 | weak var presenter: ConfirmationInteractorDelegate? 19 | 20 | func fetchData() { 21 | presenter?.didFetchData() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/Confirmation/ConfirmationProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Bruno Vieira Souza on 28/04/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol ConfirmationPresenterProtocol: AnyObject { 12 | 13 | var view: ConfirmationPresenterDelegate? { get set } 14 | 15 | func viewDidLoad() 16 | 17 | } 18 | 19 | protocol ConfirmationInteractorProtocol: AnyObject { 20 | 21 | var presenter: ConfirmationInteractorDelegate? { get set} 22 | func fetchData() 23 | } 24 | 25 | protocol ConfirmationRouterProtocol: AnyObject { 26 | 27 | static func createModule() -> UIViewController 28 | func navigateNewModule() 29 | 30 | } 31 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/Confirmation/ConfirmationViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class ConfirmationViewController: UIViewController { 11 | 12 | var presenter: ConfirmationPresenterProtocol? 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | presenter?.viewDidLoad() 17 | } 18 | 19 | override func loadView() { 20 | self.view = ConfirmationView() 21 | } 22 | } 23 | 24 | extension ConfirmationViewController: ConfirmationPresenterDelegate { 25 | 26 | func showData() { 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/ContactList/ContactListEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContacListEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Francischett Occhiuto on 01/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ContactListEntity: Decodable { 11 | let name: String 12 | let phone: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/SampleModule/SampleInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SampleInteractorDelegate: AnyObject { 11 | 12 | func didFetchData() 13 | } 14 | 15 | class SampleInteractor: SampleInteractorProtocol { 16 | 17 | weak var presenter: SampleInteractorDelegate? 18 | 19 | func fetchData() { 20 | 21 | presenter?.didFetchData() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/SampleModule/SamplePresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SamplePresenterDelegate: AnyObject { 11 | 12 | func showData() 13 | } 14 | 15 | class SamplePresenter: SamplePresenterProtocol { 16 | 17 | weak var view: SamplePresenterDelegate? 18 | var interactor: SampleInteractorProtocol? 19 | var router: SampleRouterProtocol? 20 | 21 | func viewDidLoad() { 22 | 23 | interactor?.fetchData() 24 | } 25 | } 26 | 27 | extension SamplePresenter: SampleInteractorDelegate { 28 | 29 | func didFetchData() { 30 | 31 | view?.showData() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/SampleModule/SampleProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol SamplePresenterProtocol { 12 | 13 | var view: SamplePresenterDelegate? { get set } 14 | var interactor: SampleInteractorProtocol? { get set } 15 | var router: SampleRouterProtocol? { get set } 16 | 17 | func viewDidLoad() 18 | } 19 | 20 | protocol SampleRouterProtocol { 21 | 22 | static func createModule() -> UINavigationController 23 | func navigateToNewModule() 24 | } 25 | 26 | protocol SampleInteractorProtocol { 27 | 28 | var presenter: SampleInteractorDelegate? { get set } 29 | func fetchData() 30 | } 31 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/SampleModule/SampleViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SampleViewController: UIViewController { 11 | 12 | var presenter: SamplePresenterProtocol? 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | presenter?.viewDidLoad() 18 | } 19 | 20 | override func loadView() { 21 | self.view = SampleView() 22 | } 23 | } 24 | 25 | extension SampleViewController: SamplePresenterDelegate { 26 | 27 | func showData() { 28 | 29 | print("Here is your data, View!") 30 | } 31 | } 32 | 33 | 34 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/Transfers/TransfersEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Elena Diniz on 4/26/22. 6 | // 7 | 8 | import Foundation 9 | 10 | class TransfersEntity { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/Transfers/TransfersInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Elena Diniz on 4/26/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol TransfersInteractoring { 11 | func fetchData() 12 | } 13 | 14 | class TransfersInteractor: TransfersInteractoring { 15 | 16 | func fetchData() { 17 | print("Caiu no Fetch Data") 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/UserProfile/AccountCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AccountCell.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 03/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct AccountCell { 11 | let title: String 12 | let description: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/UserProfile/Entity/AccountEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AccountEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 02/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct AccountEntity: Decodable { 11 | let agency: String 12 | let account: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/UserProfile/Entity/UserEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 02/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct UserEntity: Decodable { 11 | let name: String 12 | let phone: String 13 | let email: String 14 | let address: String 15 | let account: AccountEntity? 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/UserProfile/UserProfileFactory.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileFactory.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 27/04/22. 6 | // 7 | 8 | import UIKit 9 | 10 | struct UserProfileFactory: ModuleFactory { 11 | 12 | func createModule() -> UIViewController { 13 | var presenter: UserProfilePresentable = UserProfilePresenter() 14 | let interactor = UserProfileInteractor(service: FinanceService()) 15 | let viewController = UserProfileViewController(presenter: presenter) 16 | 17 | presenter.view = viewController 18 | presenter.interactor = interactor 19 | interactor.presenter = presenter 20 | return viewController 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Modules/UserProfile/UserProfileHeaderViewData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileHeaderViewData.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 03/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct UserProfileHeaderViewData: UserProfileHeaderViewProtocol { 11 | let name: String 12 | let agency: String 13 | let account: String 14 | let bank: String 15 | 16 | init(user: UserEntity) { 17 | name = user.name 18 | agency = "Agency \(user.account?.agency ?? "0000")" 19 | account = "Account \(user.account?.account ?? "000000-0")" 20 | bank = "Devpass Bank" 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/airplane.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "airplane.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/arrow.up.arrow.down.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "arrow.up.arrow.down.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "avatar-placeholder.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/bag.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "bag.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/car.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "car.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/checkmark.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "checkmark.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/fork.knife.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "fork.knife.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/heart.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "heart.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Resources/Assets.xcassets/house.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "house.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Service/FinanceEndpoint.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceEndpoint.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 29/04/22. 6 | // 7 | 8 | import Foundation 9 | 10 | enum FinanceEndpoint: String { 11 | case userProfile = "user_profile_endpoint" 12 | case contactList = "contact_list_endpoint" 13 | case home = "home_endpoint" 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceApp/Service/FinanceServiceError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceServiceError.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 29/04/22. 6 | // 7 | 8 | import Foundation 9 | 10 | enum FinanceServiceError: Error { 11 | case invalidURL 12 | case errorGeneric(description: String) 13 | case invalidResponse 14 | case invalidData 15 | case errorDecoder 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceAppTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/FinanceAppUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'FinanceApp' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for FinanceApp 9 | 10 | target 'FinanceAppTests' do 11 | inherit! :search_paths 12 | # Pods for testing 13 | end 14 | 15 | target 'FinanceAppUITests' do 16 | # Pods for testing 17 | end 18 | 19 | end 20 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-3/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODFILE CHECKSUM: 84dbf7a753dbd901cc2315c62a3791f039424f7b 2 | 3 | COCOAPODS: 1.11.2 4 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/AppDelegate/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | @main 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | 14 | 15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 16 | 17 | return true 18 | } 19 | 20 | // MARK: UISceneSession Lifecycle 21 | 22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 23 | 24 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/ActivityDetails/ActivityDetailsConfigurator.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public protocol ActivityDetailsConfiguratorProtocol: AnyObject { 4 | func createModule() -> UIViewController 5 | } 6 | 7 | public final class ActivityDetailsConfigurator: ActivityDetailsConfiguratorProtocol { 8 | public init() {} 9 | 10 | public func createModule() -> UIViewController { 11 | let router = ActivityDetailsRouter() 12 | let interactor = ActivityDetailsInteractor(network: FinanceService()) 13 | let presenter = ActivityDetailsPresenter(router: router, interactor: interactor) 14 | 15 | interactor.output = presenter 16 | let viewController = ActivityDetailsViewController(presenter: presenter) 17 | presenter.viewController = viewController 18 | router.viewController = viewController 19 | 20 | return viewController 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/ActivityDetails/ActivityDetailsProtocols.swift: -------------------------------------------------------------------------------- 1 | // MARK: - ViewController 2 | protocol ActivityDetailsPresenterOutputProtocol: AnyObject { 3 | func showReportAlert() 4 | } 5 | 6 | // MARK: - Presenter 7 | protocol ActivityDetailsPresenterInputProtocol: AnyObject { 8 | func didTapReport() 9 | } 10 | 11 | // MARK: - Interactor 12 | protocol ActivityDetailsInteractorInputProtocol: AnyObject { 13 | func makeReport() 14 | } 15 | 16 | protocol ActivityDetailsInteractorOutputProtocol: AnyObject { 17 | func sendReport() 18 | } 19 | 20 | // MARK: - Router 21 | protocol ActivityDetailsRouterProtocol: AnyObject { 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/ActivityDetails/ActivityDetailsRouter.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | final class ActivityDetailsRouter { 4 | 5 | // MARK: - VIPER Properties 6 | 7 | weak var viewController: UIViewController? 8 | } 9 | 10 | // MARK: - Router Protocol 11 | extension ActivityDetailsRouter: ActivityDetailsRouterProtocol { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Confirmation/ConfirmationConfigurator.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public final class ConfirmationConfigurator { 4 | 5 | public func createModule() -> UIViewController { 6 | let router = ConfirmationRouter() 7 | let interactor = ConfirmationInteractor() 8 | let presenter = ConfirmationPresenter(router: router, interactor: interactor) 9 | interactor.output = presenter 10 | let viewController = ConfirmationViewController(presenter: presenter) 11 | presenter.viewController = viewController 12 | router.viewController = viewController 13 | 14 | return viewController 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Confirmation/ConfirmationInteractor.swift: -------------------------------------------------------------------------------- 1 | 2 | final class ConfirmationInteractor { 3 | 4 | // MARK: - VIPER Properties 5 | 6 | weak var output: ConfirmationInteractorOutputProtocol? 7 | 8 | // MARK: - Private Properties 9 | 10 | // MARK: - Inits 11 | 12 | // MARK: - Internal Methods 13 | 14 | // MARK: - Private Methods 15 | } 16 | 17 | // MARK: - Input Protocol 18 | extension ConfirmationInteractor: ConfirmationInteractorInputProtocol { 19 | func tappedNice() { 20 | for _ in 1...3 { 21 | output?.niceButtonResponse() 22 | } 23 | 24 | // output?.sample3() 25 | // output?.sample1() 26 | // output?.sample2() 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Confirmation/ConfirmationRouter.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | final class ConfirmationRouter { 4 | 5 | // MARK: - VIPER Properties 6 | 7 | weak var viewController: UIViewController? 8 | } 9 | 10 | // MARK: - Router Protocol 11 | extension ConfirmationRouter: ConfirmationRouterProtocol { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/ContactList/ContactListDefinitions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // FinanceApp 4 | // 5 | // Created by Andre Almeida on 07/07/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Contact: Codable { 11 | let name: String 12 | let phone: String 13 | let image: String 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/ContactList/ContactListInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Andre Almeida on 07/07/22. 6 | // 7 | 8 | import Foundation 9 | 10 | class ContactListInteractor: ContactListInteractorProtocol { 11 | 12 | var presenter: ContactListInteractorDelegate? 13 | 14 | func fetchData() { 15 | DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + 0.5 ) { [weak self] in 16 | let successChance = Int.random(in: 1...4) 17 | switch successChance { 18 | case 1: 19 | self?.presenter?.didFetchData(contacts: (0..<10).map { 20 | .init(name: "Nome \($0)", phone: "1234-45678", image: "avatar-placeholder") 21 | }) 22 | default: 23 | self?.presenter?.didFetchWithError() 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/ContactList/ContactListRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListConfigurator.swift 3 | // FinanceApp 4 | // 5 | // Created by Andre Almeida on 06/07/22. 6 | // 7 | 8 | import Foundation 9 | 10 | class ContactListRouter: ContactListRouterProtocol { 11 | static func createModule() -> ContactListViewController { 12 | let view = ContactListViewController() 13 | let presenter = ContactListPresenter() 14 | let interactor = ContactListInteractor() 15 | 16 | presenter.view = view 17 | presenter.interactor = interactor 18 | 19 | interactor.presenter = presenter 20 | 21 | view.presenter = presenter 22 | return view 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Home/HomeInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Yannes Meneguelli on 04/07/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol HomeInteractorDelegate: AnyObject {} 11 | 12 | class HomeInteractor: HomeInteractorProtocol { 13 | weak var presenter: HomeInteractorDelegate? 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Home/HomePresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomePresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Yannes Meneguelli on 04/07/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol HomePresenterDelegate: AnyObject { 12 | } 13 | 14 | final class HomePresenter: HomePresenterProtocol { 15 | 16 | weak var view: HomePresenterDelegate? 17 | var interactor: HomeInteractorProtocol? 18 | var router: HomeRouterProtocol? 19 | 20 | func viewDidLoad() {} 21 | 22 | func navigationToNewScreen(navigation: UINavigationController) { 23 | router?.navigationToNewScreen(navigation: navigation) 24 | } 25 | 26 | func showActivityDetailsView(navigation: UINavigationController) { 27 | router?.showActivityDetailsView(navigation: navigation) 28 | } 29 | } 30 | 31 | extension HomePresenter: HomeInteractorDelegate {} 32 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Home/HomeProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Yannes Meneguelli on 04/07/22. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol HomeInteractorProtocol { 11 | var presenter: HomeInteractorDelegate? { get set } 12 | } 13 | 14 | protocol HomeRouterProtocol { 15 | static func createModule() -> UIViewController 16 | func navigationToNewScreen(navigation: UINavigationController) 17 | func showActivityDetailsView(navigation: UINavigationController) 18 | } 19 | 20 | protocol HomePresenterProtocol { 21 | var view: HomePresenterDelegate? { get set } 22 | var interactor: HomeInteractorProtocol? { get set } 23 | var router: HomeRouterProtocol? { get set } 24 | 25 | func viewDidLoad() 26 | func navigationToNewScreen(navigation: UINavigationController) 27 | func showActivityDetailsView(navigation: UINavigationController) 28 | } 29 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Login/LoginConfigurator.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public protocol LoginConfiguratorProtocol: AnyObject { 4 | func createModule() -> UIViewController 5 | } 6 | 7 | public final class LoginConfigurator: LoginConfiguratorProtocol { 8 | public init() {} 9 | 10 | public func createModule() -> UIViewController { 11 | let router = LoginRouter() 12 | let interactor = LoginInteractor(service: FinanceService()) 13 | let presenter = LoginPresenter(router: router, interactor: interactor) 14 | interactor.output = presenter 15 | let viewController = LoginViewController(presenter: presenter) 16 | presenter.viewController = viewController 17 | router.viewController = viewController 18 | 19 | return viewController 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Login/LoginInteractor.swift: -------------------------------------------------------------------------------- 1 | 2 | final class LoginInteractor { 3 | 4 | // MARK: - VIPER Properties 5 | 6 | weak var output: LoginInteractorOutputProtocol? 7 | 8 | // MARK: - Private Properties 9 | 10 | private let service: FinanceServiceProtocol 11 | 12 | // MARK: - Inits 13 | 14 | init(service: FinanceServiceProtocol) { 15 | self.service = service 16 | } 17 | 18 | // MARK: - Internal Methods 19 | 20 | // MARK: - Private Methods 21 | } 22 | 23 | // MARK: - Input Protocol 24 | extension LoginInteractor: LoginInteractorInputProtocol { 25 | func authenticate(email: String, password: String) { 26 | output?.authenticationFailed() 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Login/LoginRouter.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | final class LoginRouter { 4 | 5 | // MARK: - VIPER Properties 6 | 7 | weak var viewController: UIViewController? 8 | } 9 | 10 | // MARK: - Router Protocol 11 | extension LoginRouter: LoginRouterProtocol { 12 | func showCreateAccountView() { 13 | 14 | } 15 | 16 | func showHomeView() { 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/SampleModule/SampleInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SampleInteractorDelegate: AnyObject { 11 | 12 | func didFetchData() 13 | } 14 | 15 | class SampleInteractor: SampleInteractorProtocol { 16 | 17 | weak var presenter: SampleInteractorDelegate? 18 | 19 | func fetchData() { 20 | 21 | presenter?.didFetchData() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/SampleModule/SamplePresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SamplePresenterDelegate: AnyObject { 11 | 12 | func showData() 13 | } 14 | 15 | class SamplePresenter: SamplePresenterProtocol { 16 | 17 | weak var view: SamplePresenterDelegate? 18 | var interactor: SampleInteractorProtocol? 19 | var router: SampleRouterProtocol? 20 | 21 | func viewDidLoad() { 22 | 23 | interactor?.fetchData() 24 | } 25 | } 26 | 27 | extension SamplePresenter: SampleInteractorDelegate { 28 | 29 | func didFetchData() { 30 | 31 | view?.showData() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/SampleModule/SampleProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol SamplePresenterProtocol { 12 | 13 | var view: SamplePresenterDelegate? { get set } 14 | var interactor: SampleInteractorProtocol? { get set } 15 | var router: SampleRouterProtocol? { get set } 16 | 17 | func viewDidLoad() 18 | } 19 | 20 | protocol SampleRouterProtocol { 21 | 22 | static func createModule() -> UINavigationController 23 | func navigateToNewModule() 24 | } 25 | 26 | protocol SampleInteractorProtocol { 27 | 28 | var presenter: SampleInteractorDelegate? { get set } 29 | func fetchData() 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/SampleModule/SampleViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SampleViewController: UIViewController { 11 | 12 | var presenter: SamplePresenterProtocol? 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | presenter?.viewDidLoad() 18 | } 19 | 20 | override func loadView() { 21 | self.view = SampleView() 22 | } 23 | } 24 | 25 | extension SampleViewController: SamplePresenterDelegate { 26 | 27 | func showData() { 28 | 29 | print("Here is your data, View!") 30 | } 31 | } 32 | 33 | 34 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/Transfers/TransfersEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Vinicius dos Reis Morgado Brancalliao on 09/07/22. 6 | // 7 | 8 | struct Transfer: Codable, Equatable { 9 | let success: Bool 10 | } 11 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Modules/UserProfile/UserProfileRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Caio Santos on 06/07/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | class UserProfileRouter: UserProfileRouterProtocol { 12 | 13 | static func createModule() -> UIViewController { 14 | let viewController = UserProfileViewController() 15 | let presenter = UserProfilePresenter() 16 | let interactor = UserProfileInteractor(service: FinanceService()) 17 | 18 | presenter.view = viewController 19 | presenter.router = UserProfileRouter() 20 | presenter.interactor = interactor 21 | 22 | interactor.presenter = presenter 23 | viewController.presenter = presenter 24 | 25 | return viewController 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/airplane.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "airplane.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/arrow.up.arrow.down.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "arrow.up.arrow.down.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "avatar-placeholder.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/bag.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "bag.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/car.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "car.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/checkmark.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "checkmark.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/fork.knife.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "fork.knife.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/heart.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "heart.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceApp/Resources/Assets.xcassets/house.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "house.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceAppTests/FinanceServiceTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceServiceTests.swift 3 | // FinanceAppTests 4 | // 5 | // Created by Vinicius dos Reis Morgado Brancalliao on 14/07/22. 6 | // 7 | 8 | import XCTest 9 | @testable import FinanceApp 10 | 11 | class FinanceServiceTests: XCTestCase { 12 | 13 | var sut: FinanceService! 14 | 15 | override func setUpWithError() throws { 16 | } 17 | 18 | override func tearDownWithError() throws { 19 | sut = nil 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceAppTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /solutions/devsprint-caio-santos-6/FinanceAppUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/AppDelegate/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | @main 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | 14 | 15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 16 | 17 | return true 18 | } 19 | 20 | // MARK: UISceneSession Lifecycle 21 | 22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 23 | 24 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/AppDelegate/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 11 | 12 | var window: UIWindow? 13 | 14 | 15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 16 | 17 | guard let windowScene = (scene as? UIWindowScene) else { return } 18 | 19 | self.window = UIWindow(frame: UIScreen.main.bounds) 20 | self.window?.rootViewController = UINavigationController(rootViewController: TabBarController()) 21 | self.window?.windowScene = windowScene 22 | self.window?.makeKeyAndVisible() 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Components/ButtonView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ButtonView.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Components/ChooseContactView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChooseContactView.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/ActivityDetails/ActivityDetailsInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Sara Batista dos Santos Felix (P) on 01/02/22. 6 | // 7 | import UIKit 8 | 9 | protocol ActivityDetailsInteractorDelegate: AnyObject { 10 | 11 | func didFetchData() 12 | } 13 | 14 | final class ActivityDetailsInteractor: ActivityDetailsInteractorProtocol { 15 | 16 | weak var presenter: ActivityDetailsInteractorDelegate? 17 | 18 | func fetchData() { 19 | presenter?.didFetchData() 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/ActivityDetails/ActivityDetailsProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Sara Batista dos Santos Felix (P) on 01/02/22. 6 | // 7 | import UIKit 8 | 9 | protocol ActivityDetailsPresenterProtocol { 10 | 11 | var view: ActivityDetailsPresenterDelegate? { get set } 12 | var interactor: ActivityDetailsInteractorProtocol {get set} 13 | var router: ActivityDetailsRouterProtocol { get set } 14 | 15 | func viewDidLoad() 16 | } 17 | 18 | protocol ActivityDetailsRouterProtocol { 19 | 20 | static func createModule() -> UIViewController 21 | } 22 | 23 | protocol ActivityDetailsInteractorProtocol { 24 | 25 | var presenter: ActivityDetailsInteractorDelegate? { get set } 26 | 27 | func fetchData() 28 | } 29 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/ActivityDetails/Entities/ActivityEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 08/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ActivityEntity: Decodable { 11 | let name: String 12 | let price: Double 13 | let time: String 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/Confirmation/ConfirmationEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Lucas Eduardo Schlogl on 03/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ConfirmationEntity { 11 | let success: Bool 12 | let imageName: String 13 | let message: String 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/Confirmation/ConfirmationPresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationPresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Lucas Eduardo Schlogl on 01/02/22. 6 | // 7 | 8 | import Foundation 9 | protocol ConfirmationPresenterDelegate: AnyObject { 10 | func showData(confirmation: ConfirmationEntity) 11 | } 12 | 13 | final class ConfirmationPresenter: ConfirmationPresenterProtocol { 14 | 15 | weak var view: ConfirmationPresenterDelegate? 16 | var router: ConfirmationRouterProtocol 17 | var confirmation: ConfirmationEntity 18 | 19 | init(router: ConfirmationRouterProtocol, confirmation: ConfirmationEntity) { 20 | self.router = router 21 | self.confirmation = confirmation 22 | } 23 | 24 | func viewDidLoad() { 25 | view?.showData(confirmation: confirmation) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/Confirmation/ConfirmationProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Lucas Eduardo Schlogl on 01/02/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol ConfirmationPresenterProtocol { 12 | var view: ConfirmationPresenterDelegate? { get set } 13 | var router: ConfirmationRouterProtocol { get set } 14 | var confirmation: ConfirmationEntity { get set } 15 | 16 | func viewDidLoad() 17 | } 18 | 19 | protocol ConfirmationRouterProtocol { 20 | static func createModule(confirmation: ConfirmationEntity) -> UIViewController 21 | } 22 | 23 | protocol ConfirmationInteractorProtocol { 24 | func fetchData() 25 | } 26 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/Confirmation/ConfirmationRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Lucas Eduardo Schlogl on 01/02/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | typealias ConfirmationInterable = ConfirmationPresenterProtocol 12 | 13 | final class ConfirmationRouter: ConfirmationRouterProtocol { 14 | 15 | static func createModule(confirmation: ConfirmationEntity) -> UIViewController { 16 | let router: ConfirmationRouterProtocol = ConfirmationRouter() 17 | 18 | let presenter: ConfirmationInterable = ConfirmationPresenter( 19 | router: router, 20 | confirmation: confirmation 21 | ) 22 | 23 | let viewController = ConfirmationViewController(presenter: presenter) 24 | viewController.presenter.view = viewController 25 | 26 | return viewController 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/ContactList/ContactEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Lucas Eduardo Schlogl on 08/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ContactEntity: Decodable { 11 | let name: String 12 | let phone: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/ContactList/ContactListProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 02/02/22. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol ContactListPresenterProtocol { 11 | var view: ContactListPresenterDelegate? { get set } 12 | var interactor: ContactListInteractorProtocol { get set } 13 | var router: ContactListRouterProtocol { get set } 14 | 15 | func viewDidLoad() 16 | } 17 | 18 | protocol ContactListRouterProtocol { 19 | static func createModule() -> UIViewController 20 | } 21 | 22 | protocol ContactListInteractorProtocol { 23 | var presenter: ContactListInteractorDelegate? { get set } 24 | func fetchData() 25 | } 26 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/Home/Entities/HomeEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 08/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct HomeEntity: Decodable { 11 | let balance: Double 12 | let savings: Double 13 | let spending: Double 14 | let listActivity: [ActivityEntity] 15 | 16 | private enum CodingKeys: String, CodingKey { 17 | case balance, savings, spending 18 | case listActivity = "activity" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/Home/HomeInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Mateus Nazario on 09/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: Protocols 11 | protocol HomeInteractorDelegate: AnyObject { 12 | func didFetchData() 13 | } 14 | 15 | // MARK: Class 16 | final class HomeInteractor: HomeInteractorProtocol { 17 | weak var presenter: HomeInteractorDelegate? 18 | 19 | func didFetchData() { 20 | presenter?.didFetchData() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/Home/HomeProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Mateus Nazario on 09/02/22. 6 | // 7 | 8 | import UIKit 9 | 10 | 11 | protocol HomePresenterProtocol { 12 | var view: HomePresenterDelegate? { get set } 13 | var interactor: HomeInteractorProtocol { get set } 14 | var router: HomeRouterProtocol { get set } 15 | 16 | func viewDidLoad() 17 | func navigateToActivity() 18 | func navigateToUserProfile() 19 | } 20 | 21 | protocol HomeRouterProtocol { 22 | static func createModule() -> UIViewController 23 | func navigateToActivity() 24 | func navigateToUserProfile() 25 | } 26 | 27 | protocol HomeInteractorProtocol { 28 | var presenter: HomeInteractorDelegate? { get set } 29 | func didFetchData() 30 | } 31 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/Transfers/TransfersEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Lucas Eduardo Schlogl on 10/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct TransfersEntity: Codable { 11 | let success: Bool 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/Transfers/TransfersProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 03/02/22. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol TransfersPresenterProtocol { 11 | var view: TransfersPresenterDelegate? { get set } 12 | 13 | func didTapTransfer(value: String) 14 | func navigateToContactList() 15 | func navigateToConfirmation(confirmation: ConfirmationEntity) 16 | } 17 | 18 | protocol TransfersInteractorProtocol { 19 | var presenter: TransfersInteractorDelegate? { get set } 20 | func transfer(value: String) 21 | } 22 | 23 | protocol TransfersRouterProtocol { 24 | static func createModule() -> UIViewController 25 | func navigateToContactList() 26 | func navigateToConfirmation(confirmation: ConfirmationEntity) 27 | } 28 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/UserProfile/Entities/AccountEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AccountEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 06/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct AccountEntity: Decodable { 11 | let agency: String 12 | let account: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/UserProfile/Entities/UserEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 06/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct UserEntity: Decodable { 11 | let name: String 12 | let phone: String 13 | let email: String 14 | let address: String 15 | let account: AccountEntity? 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Modules/UserProfile/UserProfileProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Alexandre Cardoso on 01/02/22. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol UserProfilePresenterProtocol { 11 | var view: UserProfilePresenterDelegate? { get set } 12 | var interactor: UserProfileInteractorProtocol { get set } 13 | var router: UserProfileRouterProtocol { get set } 14 | 15 | func viewDidLoad() 16 | } 17 | 18 | protocol UserProfileRouterProtocol { 19 | static func createModule() -> UIViewController 20 | } 21 | 22 | protocol UserProfileInteractorProtocol { 23 | var presenter: UserProfileInteractorDelegate? { get set } 24 | func fetchData() 25 | } 26 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/airplane.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "airplane.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/arrow.up.arrow.down.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "arrow.up.arrow.down.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "avatar-placeholder.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/bag.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "bag.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/car.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "car.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/checkmark.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "checkmark.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/fork.knife.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "fork.knife.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/heart.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "heart.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/house.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "house.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Assets.xcassets/x.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "x.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIApplicationSceneManifest 6 | 7 | UIApplicationSupportsMultipleScenes 8 | 9 | UISceneConfigurations 10 | 11 | UIWindowSceneSessionRoleApplication 12 | 13 | 14 | UISceneConfigurationName 15 | Default Configuration 16 | UISceneDelegateClassName 17 | $(PRODUCT_MODULE_NAME).SceneDelegate 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Service/FinanceEndpoint.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceEndpoint.swift 3 | // FinanceApp 4 | // 5 | // Created by Lucas Eduardo Schlogl on 09/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | enum FinanceEndpoint: String { 11 | case home = "home_endpoint" 12 | case contactList = "contact_list_endpoint" 13 | case userProfile = "user_profile_endpoint" 14 | case transfer = "transfer_successful_endpoint" 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceApp/Service/FinanceServiceError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceServiceError.swift 3 | // FinanceApp 4 | // 5 | // Created by Lucas Eduardo Schlogl on 09/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | enum FinanceServiceError: Error { 11 | case decode, invalidData, invalidURL 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceAppTests/Modules/ActivityDetails/ActivityDetailsRouterTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsRouterTests.swift 3 | // FinanceApp 4 | // 5 | // Created by Julio Fernandes on 07/02/22. 6 | // 7 | 8 | import XCTest 9 | @testable import FinanceApp 10 | 11 | final class ActivityDetailsRouterTests: XCTestCase { 12 | func test_createModule() { 13 | let sut = ActivityDetailsRouter.createModule() 14 | XCTAssertTrue(sut is ActivityDetailsViewController) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceAppTests/Modules/Confirmation/ConfirmationRouterTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationRouterTests.swift 3 | // FinanceApp 4 | // 5 | // Created by Julio Fernandes on 01/02/22. 6 | // 7 | 8 | import XCTest 9 | @testable import FinanceApp 10 | 11 | final class ConfirmationRouterTests: XCTestCase { 12 | 13 | func test_createModule() { 14 | let confirmation = ConfirmationEntity(success: true, imageName: "image", message: "message") 15 | let sut = ConfirmationRouter.createModule(confirmation: confirmation) 16 | XCTAssertNotNil(sut as? ConfirmationViewController) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceAppTests/Modules/ContactList/ContactListRouterTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListRouterTests.swift 3 | // FinanceApp 4 | // 5 | // Created by Julio Fernandes on 03/02/22. 6 | // 7 | 8 | import XCTest 9 | @testable import FinanceApp 10 | 11 | final class ContactListRouterTests: XCTestCase { 12 | func test_createModule() { 13 | let sut = ContactListRouter.createModule() 14 | XCTAssertTrue(sut is ContactListViewController) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceAppTests/Modules/Home/HomeInteractorTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeInteractorTests.swift 3 | // FinanceApp 4 | // 5 | // Created by Julio Fernandes on 09/02/22. 6 | // 7 | 8 | import XCTest 9 | @testable import FinanceApp 10 | 11 | final class HomeInteractorTests: XCTestCase { 12 | private let presenterSpy = HomeInteractorDelegateSpy() 13 | private let sut = HomeInteractor() 14 | 15 | override func setUp() { 16 | sut.presenter = presenterSpy 17 | } 18 | 19 | func test_didFetchData() { 20 | sut.didFetchData() 21 | XCTAssertTrue(presenterSpy.didFetchDataCalled) 22 | } 23 | } 24 | 25 | final class HomeInteractorDelegateSpy: HomeInteractorDelegate { 26 | 27 | private(set) var didFetchDataCalled = false 28 | func didFetchData() { 29 | didFetchDataCalled = true 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceAppTests/Modules/Home/HomeRouterTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeRouterTests.swift 3 | // FinanceApp 4 | // 5 | // Created by Julio Fernandes on 09/02/22. 6 | // 7 | 8 | import XCTest 9 | @testable import FinanceApp 10 | 11 | final class HomeRouterTests: XCTestCase { 12 | 13 | func test_createModule() { 14 | let sut = HomeRouter.createModule() 15 | XCTAssertTrue(sut is HomeViewController) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceAppTests/Modules/Home/HomeViewTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeViewTests.swift 3 | // FinanceAppTests 4 | // 5 | // Created by Julio Fernandes on 09/02/22. 6 | // 7 | 8 | import XCTest 9 | @testable import FinanceApp 10 | 11 | final class HomeViewTests: XCTestCase { 12 | 13 | private let homeViewDelegateSpy = HomeViewDelegateSpy() 14 | private let sut = HomeView() 15 | 16 | override func setUp() { 17 | super.setUp() 18 | sut.delegate = homeViewDelegateSpy 19 | } 20 | 21 | func test_didSelectedActivity() { 22 | sut.didSelectedActivity() 23 | XCTAssertTrue(homeViewDelegateSpy.didSelectActivityCalled) 24 | } 25 | } 26 | 27 | final class HomeViewDelegateSpy: HomeViewDelegate { 28 | 29 | private(set) var didSelectActivityCalled = false 30 | func didSelectActivity() { 31 | didSelectActivityCalled = true 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/FinanceAppTests/Modules/UserProfile/UserProfileRouterTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileRouterTests.swift 3 | // FinanceApp 4 | // 5 | // Created by Julio Fernandes on 01/02/22. 6 | // 7 | 8 | import XCTest 9 | @testable import FinanceApp 10 | 11 | final class UserProfileRouterTests: XCTestCase { 12 | 13 | func test_createModule() { 14 | let navigation = UserProfileRouter.createModule() 15 | XCTAssertEqual(navigation.viewControllers.count, 1) 16 | XCTAssertTrue(navigation.viewControllers.first is UserProfileViewController) 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/Templates/README.md: -------------------------------------------------------------------------------- 1 | # Xcode Templates 2 | 3 | Instalação 4 | ===================== 5 | 6 | 1. Feche o Xcode se ele estiver aberto 7 | 2. Abra a pasta do repositório no terminal 8 | 3. Abra a pasta templates com o comando: `cd Templates` 9 | 4. Execute o script de instalação com o comando: `./install_templates` 10 | 5. Abra o xcode e veja se ao criar um arquivo os templates do VIPER apareceram no final 11 | 12 | 13 | Templates 14 | ===================== 15 | 16 | - **VIPER:** Template responsável por criar todos arquivos do VIPER no local selecionado. Nele você define apenas o nome da scene e todos arquivos são criados. -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/Templates/VIPER.xctemplate/TemplateIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-1/Templates/VIPER.xctemplate/TemplateIcon.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/Templates/VIPER.xctemplate/TemplateIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-1/Templates/VIPER.xctemplate/TemplateIcon@2x.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/Templates/VIPER.xctemplate/___FILEBASENAME___Configurator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ___FILENAME___ 3 | // ___PROJECTNAME___ 4 | // 5 | // Created by ___FULLUSERNAME___ on ___DATE___. 6 | // 7 | 8 | import UIKit 9 | 10 | public final class ___VARIABLE_moduleName___Configurator { 11 | 12 | public func createModule() -> UIViewController { 13 | let router = ___VARIABLE_moduleName___Router() 14 | let interactor = ___VARIABLE_moduleName___Interactor() 15 | let presenter = ___VARIABLE_moduleName___Presenter(router: router, interactor: interactor) 16 | interactor.output = presenter 17 | let viewController = ___VARIABLE_moduleName___ViewController(presenter: presenter) 18 | presenter.viewController = viewController 19 | router.viewController = viewController 20 | 21 | return viewController 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/Templates/VIPER.xctemplate/___FILEBASENAME___Interactor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ___FILENAME___ 3 | // ___PROJECTNAME___ 4 | // 5 | // Created by ___FULLUSERNAME___ on ___DATE___. 6 | // 7 | 8 | final class ___VARIABLE_moduleName___Interactor { 9 | 10 | // MARK: - VIPER Properties 11 | 12 | weak var output: ___VARIABLE_moduleName___InteractorOutputProtocol? 13 | 14 | // MARK: - Private Properties 15 | 16 | // MARK: - Inits 17 | 18 | // MARK: - Internal Methods 19 | 20 | // MARK: - Private Methods 21 | } 22 | 23 | // MARK: - Input Protocol 24 | extension ___VARIABLE_moduleName___Interactor: ___VARIABLE_moduleName___InteractorInputProtocol { 25 | 26 | } 27 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/Templates/VIPER.xctemplate/___FILEBASENAME___Protocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ___FILENAME___ 3 | // ___PROJECTNAME___ 4 | // 5 | // Created by ___FULLUSERNAME___ on ___DATE___. 6 | // 7 | 8 | // MARK: - ViewController 9 | protocol ___VARIABLE_moduleName___PresenterOutputProtocol: AnyObject { 10 | 11 | } 12 | 13 | // MARK: - Presenter 14 | protocol ___VARIABLE_moduleName___PresenterInputProtocol: AnyObject { 15 | func viewDidAppear() 16 | } 17 | 18 | // MARK: - Interactor 19 | protocol ___VARIABLE_moduleName___InteractorInputProtocol: AnyObject { 20 | 21 | } 22 | 23 | protocol ___VARIABLE_moduleName___InteractorOutputProtocol: AnyObject { 24 | 25 | } 26 | 27 | // MARK: - Router 28 | protocol ___VARIABLE_moduleName___RouterProtocol: AnyObject { 29 | 30 | } 31 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/Templates/VIPER.xctemplate/___FILEBASENAME___Router.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ___FILENAME___ 3 | // ___PROJECTNAME___ 4 | // 5 | // Created by ___FULLUSERNAME___ on ___DATE___. 6 | // 7 | 8 | import UIKit 9 | 10 | final class ___VARIABLE_moduleName___Router { 11 | 12 | // MARK: - VIPER Properties 13 | 14 | weak var viewController: UIViewController? 15 | } 16 | 17 | // MARK: - Router Protocol 18 | extension ___VARIABLE_moduleName___Router: ___VARIABLE_moduleName___RouterProtocol { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-1/Templates/install_templates: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | THEME_DIR=~/Library/Developer/Xcode/Templates 3 | 4 | if [ -d ~/Library/Developer/Xcode ] 5 | then 6 | echo "Xcode detected ✅" 7 | echo "Creating theme folder" 8 | mkdir -p $THEME_DIR 9 | echo "Copying templates ..." 10 | cp -r *.xctemplate $THEME_DIR 11 | echo "Themes installed ✅" 12 | echo "Restart Xcode now" 13 | else 14 | echo "Xcode doesn't seem to be installed on your computer 🚨" 15 | fi 16 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Plugins/Tuist/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.4 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "MyPlugin", 7 | products: [ 8 | .executable(name: "tuist-my-cli", targets: ["tuist-my-cli"]), 9 | ], 10 | targets: [ 11 | .executableTarget( 12 | name: "tuist-my-cli" 13 | ), 14 | ] 15 | ) 16 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Plugins/Tuist/Plugin.swift: -------------------------------------------------------------------------------- 1 | import ProjectDescription 2 | 3 | let plugin = Plugin(name: "MyPlugin") -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Plugins/Tuist/ProjectDescriptionHelpers/LocalHelper.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public struct LocalHelper { 4 | let name: String 5 | 6 | public init(name: String) { 7 | self.name = name 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Plugins/Tuist/Sources/tuist-my-cli/main.swift: -------------------------------------------------------------------------------- 1 | print("Hello, from your Tuist Task") -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Project.swift: -------------------------------------------------------------------------------- 1 | import ProjectDescription 2 | import ProjectDescriptionHelpers 3 | import MyPlugin 4 | 5 | // MARK: - Project 6 | 7 | // Local plugin loaded 8 | let localHelper = LocalHelper(name: "MyPlugin") 9 | 10 | // Creates our project using a helper function defined in ProjectDescriptionHelpers 11 | let project = Project.app(name: "FinanceApp", 12 | platform: .iOS, 13 | additionalTargets: [] 14 | ) 15 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/airplane.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "airplane.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/arrow.up.arrow.down.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "arrow.up.arrow.down.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "avatar-placeholder.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/bag.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "bag.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/car.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "car.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/checkmark.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "checkmark.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/fork.knife.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "fork.knife.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/heart.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "heart.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Resources/Assets.xcassets/house.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "house.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/AppDelegate/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | @UIApplicationMain 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 16 | self.window = UIWindow(frame: UIScreen.main.bounds) 17 | self.window?.rootViewController = UINavigationController(rootViewController: TabBarController()) 18 | self.window?.makeKeyAndVisible() 19 | return true 20 | } 21 | 22 | } 23 | 24 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Entities/ContactEntity/ContactEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Pedro Henrique Martins Barbosa on 31/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct ContactEntity: Codable { 12 | let name: String 13 | let phone: String 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Entities/TransfersEntity/TransfersEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Pedro Henrique Martins Barbosa on 29/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct TransfersEntity: Codable { 12 | let success: Bool 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/ActivityDetails/ActivityDetailsRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Mobills on 25/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | final class ActivityDetailsRouter: ActivityDetailsRouterProtocol { 13 | 14 | var view: UIViewController? 15 | 16 | func presentReportIssue() { 17 | let successAlert = UIAlertController( 18 | title: "Success!", 19 | message: "Issue Reported", 20 | preferredStyle: .alert 21 | ) 22 | successAlert.addAction(UIAlertAction(title: "OK", style: .default)) 23 | view?.present(successAlert, animated: true) 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/Confirmation/ConfirmationViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class ConfirmationViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = ConfirmationView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/ContactList/ContactListConfigurator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListConfigurator.swift 3 | // FinanceApp 4 | // 5 | // Created by Pedro Henrique Martins Barbosa on 30/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class ContactListConfigurator: ContactListConfiguratorProtocol { 12 | static func createModule() -> UIViewController { 13 | let view = ContactListViewController() 14 | let presenter = ContactListPresenter() 15 | let interactor = ContactListInteractor() 16 | 17 | view.presenter = presenter 18 | presenter.view = view 19 | presenter.interactor = interactor 20 | 21 | return view 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/ContactList/ContactListInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Pedro Henrique Martins Barbosa on 30/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class ContactListInteractor: ContactListInteractorProtocol { 12 | weak var presenter: ContactListInteractorDelegate? 13 | 14 | func fetchData() { 15 | presenter?.didFetchData() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/ContactList/ContactListPresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListPresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Pedro Henrique Martins Barbosa on 30/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class ContactListPresenter: ContactListPresenterProtocol { 12 | weak var view: ContactListPresenterDelegate? 13 | var interactor: ContactListInteractorProtocol? 14 | var router: ContactListRouterProtocol? 15 | 16 | func viewDidLoad() { 17 | interactor?.fetchData() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/ContactList/ContactListRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Pedro Henrique Martins Barbosa on 31/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class ContactListRouter: ContactListRouterProtocol { 12 | // TODO: Implement router ContactListModule 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/ContactList/ContactListViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class ContactListViewController: UIViewController { 11 | var presenter: ContactListPresenterProtocol? 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | presenter?.viewDidLoad() 16 | } 17 | 18 | override func loadView() { 19 | self.view = ContactListView() 20 | } 21 | } 22 | 23 | extension ContactListViewController: ContactListPresenterDelegate { 24 | func showData() { 25 | print("Show data") 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/Home/HomeConfigurator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeConfigurator.swift 3 | // FinanceApp 4 | // 5 | // Created by Julio Fernandes on 25/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class HomeConfigurator: HomeConfiguratorProtocol { 12 | 13 | static func createModule() -> UIViewController { 14 | let view = HomeViewController() 15 | let presenter = HomePresenter() 16 | let interactor = HomeInteractor() 17 | let router = HomeRouter() 18 | router.view = view 19 | view.presenter = presenter 20 | presenter.view = view 21 | presenter.router = router 22 | 23 | presenter.interactor = interactor 24 | interactor.presenter = presenter 25 | 26 | return view 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/Home/HomeInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Julio Fernandes on 25/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class HomeInteractor: HomeInteractorProtocol { 12 | 13 | weak var presenter: HomeInteractorDelegate? 14 | 15 | func fetchData() { 16 | presenter?.didFetchData() 17 | } 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/Home/HomeRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Julio Fernandes on 25/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class HomeRouter: HomeRouterProtocol { 12 | 13 | var view: UIViewController? 14 | 15 | func navigateToProfileModule() { 16 | let viewController = UserProfileConfigurator.createModule() 17 | let navigationController = UINavigationController(rootViewController: viewController) 18 | view?.present(navigationController, animated: true) 19 | } 20 | 21 | func navigateToActivityDetailsModule() { 22 | let activityDetailsViewController = ActivityDetailsConfigurator.createModule() 23 | view?.navigationController?.pushViewController(activityDetailsViewController, animated: true) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/SampleModule/SampleInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SampleInteractorDelegate: AnyObject { 11 | 12 | func didFetchData() 13 | } 14 | 15 | class SampleInteractor: SampleInteractorProtocol { 16 | 17 | weak var presenter: SampleInteractorDelegate? 18 | 19 | func fetchData() { 20 | 21 | presenter?.didFetchData() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/SampleModule/SamplePresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SamplePresenterDelegate: AnyObject { 11 | 12 | func showData() 13 | } 14 | 15 | class SamplePresenter: SamplePresenterProtocol { 16 | 17 | weak var view: SamplePresenterDelegate? 18 | var interactor: SampleInteractorProtocol? 19 | var router: SampleRouterProtocol? 20 | 21 | func viewDidLoad() { 22 | 23 | interactor?.fetchData() 24 | } 25 | } 26 | 27 | extension SamplePresenter: SampleInteractorDelegate { 28 | 29 | func didFetchData() { 30 | 31 | view?.showData() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/SampleModule/SampleProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol SamplePresenterProtocol { 12 | 13 | var view: SamplePresenterDelegate? { get set } 14 | var interactor: SampleInteractorProtocol? { get set } 15 | var router: SampleRouterProtocol? { get set } 16 | 17 | func viewDidLoad() 18 | } 19 | 20 | protocol SampleRouterProtocol { 21 | 22 | static func createModule() -> UINavigationController 23 | func navigateToNewModule() 24 | } 25 | 26 | protocol SampleInteractorProtocol { 27 | 28 | var presenter: SampleInteractorDelegate? { get set } 29 | func fetchData() 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/SampleModule/SampleViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SampleViewController: UIViewController { 11 | 12 | var presenter: SamplePresenterProtocol? 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | presenter?.viewDidLoad() 18 | } 19 | 20 | override func loadView() { 21 | self.view = SampleView() 22 | } 23 | } 24 | 25 | extension SampleViewController: SamplePresenterDelegate { 26 | 27 | func showData() { 28 | 29 | print("Here is your data, View!") 30 | } 31 | } 32 | 33 | 34 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/Transfers/TransfersConfigurator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersConfigurator.swift 3 | // FinanceApp 4 | // 5 | // Created by Pedro Henrique Martins Barbosa on 27/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class TransfersConfigurator: TransfersConfiguratorProtocol { 12 | static func createModule() -> UIViewController { 13 | let view = TransfersViewController() 14 | let presenter = TransfersPresenter() 15 | let interactor = TransfersInteractor() 16 | let router = TransfersRouter() 17 | 18 | view.presenter = presenter 19 | presenter.view = view 20 | presenter.router = router 21 | presenter.interactor = interactor 22 | interactor.presenter = presenter 23 | router.view = view 24 | 25 | return view 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/Transfers/TransfersInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Pedro Henrique Martins Barbosa on 27/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class TransfersInteractor: TransfersInteractorProtocol { 12 | weak var presenter: TransfersInteractorDelegate? 13 | 14 | func transfer(value: String) { 15 | presenter?.didFetchData(transfer: TransfersEntity(success: true)) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/Transfers/TransfersRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransfersRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Pedro Henrique Martins Barbosa on 27/05/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | final class TransfersRouter: TransfersRouterProtocol { 12 | var view: UIViewController? 13 | 14 | func navigateToContactListModule() { 15 | let navigationController = UINavigationController(rootViewController: ContactListViewController()) 16 | view?.present(navigationController, animated: true) 17 | } 18 | 19 | func navigateToConfirmationModule() { 20 | let navigationController = UINavigationController(rootViewController: ConfirmationViewController()) 21 | view?.present(navigationController, animated: true) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/UserProfile/UserProfileConfigurator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileConfigurator.swift 3 | // FinanceApp 4 | // 5 | // Created by Mobills on 02/06/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | final class UserProfileConfigurator { 13 | 14 | static func createModule() -> UIViewController { 15 | 16 | let interactor = UserProfileInteractor() 17 | let presenter = UserProfilePresenter() 18 | let viewController = UserProfileViewController() 19 | 20 | interactor.presenter = presenter 21 | presenter.interactor = interactor 22 | presenter.view = viewController 23 | viewController.presenter = presenter 24 | 25 | return viewController 26 | 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/UserProfile/UserProfilePresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfilePresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Mobills on 02/06/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | final class UserProfilePresenter: UserProfilePresenterProtocol { 12 | 13 | weak var view: UserProfileViewDelegate? 14 | var interactor: UserProfileInteractorProtocol? 15 | var router: UserProfileRouterProtocol? 16 | 17 | func viewDidLoad() { 18 | interactor?.fetchData() 19 | } 20 | } 21 | 22 | extension UserProfilePresenter: UserProfileInteractorDelegate { 23 | func didLoadData(_ userData: UserData) { 24 | view?.update(userData: userData) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/UserProfile/UserProfileRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Mobills on 02/06/22. 6 | // Copyright © 2022 tuist.io. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Modules/UserProfile/UserProfileViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | final class UserProfileViewController: UIViewController, UserProfileViewControllerProtocol { 11 | 12 | var presenter: UserProfilePresenterProtocol? 13 | private lazy var profileView = UserProfileView() 14 | 15 | override func loadView() { 16 | super.loadView() 17 | self.view = profileView 18 | } 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | presenter?.viewDidLoad() 23 | } 24 | } 25 | 26 | extension UserProfileViewController: UserProfileViewDelegate { 27 | func update(userData: UserData) { 28 | profileView.update(userData: userData) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Targets/FinanceApp/Sources/Service/FinanceService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FinanceService.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol FinanceServiceProtocol: AnyObject { 11 | 12 | func fetchHomeData() 13 | } 14 | 15 | class FinanceService: FinanceServiceProtocol { 16 | 17 | func fetchHomeData() { 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-julio-fernandes-3/Tuist/Config.swift: -------------------------------------------------------------------------------- 1 | import ProjectDescription 2 | 3 | let config = Config( 4 | plugins: [ 5 | .local(path: .relativeToManifest("../../Plugins/Tuist")), 6 | ] 7 | ) 8 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/AppDelegate/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | @main 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | 14 | 15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 16 | 17 | return true 18 | } 19 | 20 | // MARK: UISceneSession Lifecycle 21 | 22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 23 | 24 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/AppDelegate/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 11 | 12 | var window: UIWindow? 13 | 14 | 15 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 16 | 17 | guard let windowScene = (scene as? UIWindowScene) else { return } 18 | 19 | self.window = UIWindow(frame: UIScreen.main.bounds) 20 | self.window?.rootViewController = UINavigationController(rootViewController: TabBarController()) 21 | self.window?.windowScene = windowScene 22 | self.window?.makeKeyAndVisible() 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/ActivityDetails/Business/ActivityDetailsEntity.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsEntity.swift 3 | // FinanceApp 4 | // 5 | // Created by Junior Fernandes on 16/11/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ActivityDetailsEntity: Decodable { 11 | let name: String 12 | let price: Float 13 | let category: String 14 | let time: String 15 | 16 | //Stub to unit test 17 | static var stub: ActivityDetailsEntity { 18 | ActivityDetailsEntity( 19 | name: "Mall", 20 | price: 100.0, 21 | category: "Shopping", 22 | time: "8:57 AM" 23 | ) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/ActivityDetails/Router/ActivityDetailsRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Junior Fernandes on 16/11/22. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol ActivityDetailsRouterInput { 11 | func createModule() -> ActivityDetailsViewController 12 | } 13 | 14 | final class ActivityDetailsRouter: ActivityDetailsRouterInput { 15 | weak var viewController: UIViewController? 16 | 17 | func createModule() -> ActivityDetailsViewController { 18 | return ActivityDetailsFactory.build() 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/ActivityDetails/Views/ActivityDetailsFactory.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ActivityDetailsFactory.swift 3 | // FinanceApp 4 | // 5 | // Created by Junior Fernandes on 16/11/22. 6 | // 7 | 8 | import Foundation 9 | 10 | enum ActivityDetailsFactory { 11 | static func build() -> ActivityDetailsViewController { 12 | let service = FinanceService() 13 | let interactor = ActivityDetailsInteractor(service: service) 14 | let router = ActivityDetailsRouter() 15 | let presenter = ActivityDetailsPresenter( 16 | interactor: interactor, 17 | router: router) 18 | let controller = ActivityDetailsViewController(presenter: presenter) 19 | presenter.view = controller 20 | interactor.presenter = presenter 21 | 22 | return controller 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/Confirmation/ConfirmationViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfirmationViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class ConfirmationViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = ConfirmationView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/ContactList 2/Business/ContactListInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Lemos on 19/11/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol ContactListInteractorInput { 11 | func fetchContacts() 12 | } 13 | 14 | protocol ContactListInteractorOutput: AnyObject { 15 | func didFetchContacts(_ contacts: [Contact]) 16 | } 17 | 18 | final class ContactListInteractor { 19 | 20 | private var contacts = [Contact]() 21 | weak var presenter: ContactListInteractorOutput? 22 | 23 | } 24 | 25 | extension ContactListInteractor: ContactListInteractorInput { 26 | func fetchContacts() { 27 | contacts = Contact.stub 28 | presenter?.didFetchContacts(contacts) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/ContactList 2/ContactListFactory.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListFactory.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Lemos on 19/11/22. 6 | // 7 | 8 | enum ContactListFactory { 9 | static func build() -> ContactListViewController { 10 | let interactor = ContactListInteractor() 11 | let router = ContactListRouter() 12 | let presenter = ContactListPresenter(interactor: interactor, router: router) 13 | let viewController = ContactListViewController(presenter: presenter) 14 | interactor.presenter = presenter 15 | presenter.view = viewController 16 | router.viewController = viewController 17 | return viewController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/ContactList/ContactListFactory.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListFactory.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Lemos on 19/11/22. 6 | // 7 | 8 | enum ContactListFactory { 9 | static func build() -> ContactListViewController { 10 | let interactor = ContactListInteractor(service: FinanceService()) 11 | let router = ContactListRouter() 12 | let presenter = ContactListPresenter(interactor: interactor, router: router) 13 | let viewController = ContactListViewController(presenter: presenter) 14 | interactor.presenter = presenter 15 | presenter.view = viewController 16 | router.viewController = viewController 17 | return viewController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/ContactList/Presentation/ContactListRouter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListRouter.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Lemos on 19/11/22. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol ContactListRouterProtocol { 11 | func createModule() 12 | } 13 | 14 | final class ContactListRouter: ContactListRouterProtocol { 15 | 16 | weak var viewController: UIViewController? 17 | 18 | func createModule() { 19 | 20 | } 21 | 22 | func navigate() { 23 | 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/ContactList/Presentation/ContactListViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContactListViewModel.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Lemos on 19/11/22. 6 | // 7 | 8 | import UIKit 9 | 10 | struct ContactListViewModel { 11 | let name: String 12 | let phone: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/SampleModule/SampleInteractor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleInteractor.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SampleInteractorDelegate: AnyObject { 11 | 12 | func didFetchData() 13 | } 14 | 15 | class SampleInteractor: SampleInteractorProtocol { 16 | 17 | weak var presenter: SampleInteractorDelegate? 18 | 19 | func fetchData() { 20 | 21 | presenter?.didFetchData() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/SampleModule/SamplePresenter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SamplePresenter.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SamplePresenterDelegate: AnyObject { 11 | 12 | func showData() 13 | } 14 | 15 | class SamplePresenter: SamplePresenterProtocol { 16 | 17 | weak var view: SamplePresenterDelegate? 18 | var interactor: SampleInteractorProtocol? 19 | var router: SampleRouterProtocol? 20 | 21 | func viewDidLoad() { 22 | 23 | interactor?.fetchData() 24 | } 25 | } 26 | 27 | extension SamplePresenter: SampleInteractorDelegate { 28 | 29 | func didFetchData() { 30 | 31 | view?.showData() 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/SampleModule/SampleProtocols.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleProtocols.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | protocol SamplePresenterProtocol { 12 | 13 | var view: SamplePresenterDelegate? { get set } 14 | var interactor: SampleInteractorProtocol? { get set } 15 | var router: SampleRouterProtocol? { get set } 16 | 17 | func viewDidLoad() 18 | } 19 | 20 | protocol SampleRouterProtocol { 21 | 22 | static func createModule() -> UINavigationController 23 | func navigateToNewModule() 24 | } 25 | 26 | protocol SampleInteractorProtocol { 27 | 28 | var presenter: SampleInteractorDelegate? { get set } 29 | func fetchData() 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/SampleModule/SampleViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SampleViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SampleViewController: UIViewController { 11 | 12 | var presenter: SamplePresenterProtocol? 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | presenter?.viewDidLoad() 18 | } 19 | 20 | override func loadView() { 21 | self.view = SampleView() 22 | } 23 | } 24 | 25 | extension SampleViewController: SamplePresenterDelegate { 26 | 27 | func showData() { 28 | 29 | print("Here is your data, View!") 30 | } 31 | } 32 | 33 | 34 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Modules/UserProfile/UserProfileViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfileViewController.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 30/12/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class UserProfileViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = UserProfileView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/airplane.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "airplane.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/arrow.up.arrow.down.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "arrow.up.arrow.down.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "avatar-placeholder.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-viper-finance/48fa03067a23a24b3063d04d2311fd8d3164f812/solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/avatar-placeholder.imageset/avatar-placeholder.png -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/bag.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "bag.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/car.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "car.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/checkmark.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "checkmark.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/fork.knife.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "fork.knife.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/heart.circle.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "heart.circle.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Assets.xcassets/house.fill.symbolset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | }, 6 | "symbols" : [ 7 | { 8 | "filename" : "house.fill.svg", 9 | "idiom" : "universal" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIApplicationSceneManifest 6 | 7 | UIApplicationSupportsMultipleScenes 8 | 9 | UISceneConfigurations 10 | 11 | UIWindowSceneSessionRoleApplication 12 | 13 | 14 | UISceneConfigurationName 15 | Default Configuration 16 | UISceneDelegateClassName 17 | $(PRODUCT_MODULE_NAME).SceneDelegate 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Service/Entities/Contact.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Contact.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 24/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Contact: Decodable { 11 | 12 | let name: String 13 | let phone: String 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Service/Entities/HomeData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HomeData.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 24/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct HomeData: Decodable { 11 | 12 | let balance: Float 13 | let savings: Float 14 | let spending: Float 15 | let activity: [Activity] 16 | } 17 | 18 | struct Activity: Decodable { 19 | let name: String 20 | let price: Float 21 | let time: String 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Service/Entities/TransferResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TransferResult.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 24/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct TransferResult: Decodable { 11 | 12 | let success: Bool 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-pedro-alvarez-1/FinanceApp/Service/Entities/UserProfile.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserProfile.swift 3 | // FinanceApp 4 | // 5 | // Created by Rodrigo Borges on 24/02/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct UserProfile: Decodable { 11 | 12 | let name: String 13 | let phone: String 14 | let email: String 15 | let address: String 16 | let account: Account 17 | } 18 | 19 | struct Account: Decodable { 20 | 21 | let agency: String 22 | let account: String 23 | } 24 | --------------------------------------------------------------------------------