├── .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 |
--------------------------------------------------------------------------------