├── .github └── pull_request_template.md ├── .gitignore ├── LICENSE ├── README.md ├── bin └── install_tooling.sh ├── screenshots ├── screenshot-1.png ├── screenshot-2.png ├── screenshot-3.png └── screenshot-4.png └── solutions ├── devpsrint-michael-douglas-1 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ └── Repository.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ ├── Buttons │ │ │ │ └── ButtonView │ │ │ │ │ ├── ButtonView.swift │ │ │ │ │ └── ButtonViewConfiguration.swift │ │ │ ├── LoadingView │ │ │ │ ├── LoadingView.swift │ │ │ │ └── LoadingViewConfiguration.swift │ │ │ └── Views │ │ │ │ └── EmptyView │ │ │ │ ├── EmptyView.swift │ │ │ │ └── EmptyViewConfiguration.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── Cells │ │ │ │ └── RepositoryCellView.swift │ │ │ ├── ListView.swift │ │ │ └── ListViewController.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ └── Service │ │ └── Service.swift ├── GitHubAppTests │ ├── GitHubAppTests.swift │ └── SnapshotTests │ │ ├── LoadingViewTest.swift │ │ └── __Snapshots__ │ │ └── LoadingViewTest │ │ └── test_loadingView_whenSnapshot_shouldSucceed.1.png ├── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── Podfile └── Podfile.lock ├── devsprint-4 ├── OnboardingChallenge.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── OnboardingChallenge.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── OnboardingChallenge │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── dev.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── dev.jpeg │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ ├── EmptyView │ │ │ │ ├── EmptyView.swift │ │ │ │ └── EmptyViewConfiguration.swift │ │ │ ├── LicenseView │ │ │ │ ├── LicenseView.swift │ │ │ │ └── LicenseViewConfiguration.swift │ │ │ ├── Loading │ │ │ │ ├── LoadingView.swift │ │ │ │ └── LoadingViewConfiguration.swift │ │ │ └── RepositoryInfoView │ │ │ │ ├── RepositoryInfoView.swift │ │ │ │ └── RepositoryInfoViewConfiguration.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ ├── ListViewConfiguration.swift │ │ │ └── ListViewController.swift │ │ └── Repository │ │ │ ├── RepositoryCellView.swift │ │ │ └── RepositoryCellViewConfiguration.swift │ └── Service │ │ ├── Service.swift │ │ └── UserInfoModel.swift ├── OnboardingChallengeTests │ ├── OnboardingChallengeTests.swift │ ├── SnapshotTests │ │ ├── EmptyViewSnapshotTests.swift │ │ ├── LicenseViewSnapshotTests.swift │ │ ├── LoadingViewSnapshotTests.swift │ │ ├── RepositoryInfoViewTests.swift │ │ └── __Snapshots__ │ │ │ ├── EmptyViewSnapshotTests │ │ │ └── testEmptyView.1.png │ │ │ ├── LicenseViewSnapshotTests │ │ │ ├── testEmptyView.1.png │ │ │ └── testLicenseView.1.png │ │ │ ├── LoadingViewSnapshotTests │ │ │ └── testLoadingView.1.png │ │ │ └── RepositoryInfoViewTests │ │ │ └── testRepositoryInfoView.1.png │ └── UnitTests │ │ └── StringUnitTests.swift ├── Podfile └── Podfile.lock ├── devsprint-5 ├── OnboardingChallenge.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── OnboardingChallenge.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── OnboardingChallenge │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ ├── UIView+BorderBottom.swift │ │ ├── UIView+Constraints.swift │ │ └── UIViewController+Extensions.swift │ ├── Model │ │ └── Repository.swift │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── user-profile.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── user-profile.jpeg │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ ├── EmptyView.swift │ │ │ ├── LicenseView.swift │ │ │ ├── LoadingView.swift │ │ │ ├── OwnerView.swift │ │ │ ├── RepositoryCellView.swift │ │ │ └── RepositoryInfoView.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ ├── ListViewConfiguration.swift │ │ │ └── ListViewController.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ ├── Service │ │ └── Service.swift │ └── Utils │ │ ├── RepositoryCellViewModel.swift │ │ └── ViewCode.swift ├── OnboardingChallengeTests │ └── OnboardingChallengeTests.swift ├── Podfile └── Podfile.lock ├── devsprint-6 ├── OnboardingChallenge.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── OnboardingChallenge.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── OnboardingChallenge │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UINavigationController+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ └── RepositoriesModel.swift │ ├── Resources │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── finn.imageset │ │ │ │ ├── Contents.json │ │ │ │ └── finn.png │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ ├── ButtonView.swift │ │ │ ├── EmptyView.swift │ │ │ ├── LoadingView.swift │ │ │ ├── OwnerView.swift │ │ │ └── RepositoryInfoView │ │ │ │ ├── RepositoryInfoView.swift │ │ │ │ └── RepositoryInfoViewConfiguration.swift │ │ ├── Detail │ │ │ ├── DetailViewController.swift │ │ │ └── DetailsView.swift │ │ ├── List │ │ │ ├── Cell │ │ │ │ └── RepositoryCellView.swift │ │ │ ├── ListView.swift │ │ │ ├── ListViewConfiguration.swift │ │ │ └── ListViewController.swift │ │ ├── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ │ └── Views │ │ │ └── ViewCode.swift │ └── Service │ │ └── Service.swift ├── OnboardingChallengeTests │ └── OnboardingChallengeTests.swift ├── Podfile └── Podfile.lock ├── devsprint-attekita-1 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── GitHubApp.xcscheme ├── GitHubApp.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UIImageView+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ └── GitHubApp.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 │ │ │ ├── SettingsTitleBGColor.colorset │ │ │ │ └── Contents.json │ │ │ └── SettingsTitleColor.colorset │ │ │ │ └── Contents.json │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ ├── ButtonView.swift │ │ │ ├── LoadingView.swift │ │ │ ├── OwnerView.swift │ │ │ ├── RepositoryCellView.swift │ │ │ ├── RepositoryInfoView.swift │ │ │ └── ViewCodable.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ ├── DetailViewController.swift │ │ │ ├── LicenseView.swift │ │ │ └── Storyboard.storyboard │ │ ├── Empty │ │ │ └── EmptyView.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ ├── ListViewConfiguration.swift │ │ │ └── ListViewController.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ └── Service │ │ └── Service.swift ├── GitHubAppTests │ └── GitHubAppTests.swift ├── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── Podfile └── Podfile.lock ├── devsprint-bruno-ramos-5 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── GitHubApp.xcscheme ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ └── Repository.swift │ ├── Network │ │ └── NetworkManager.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ ├── ButtonView.swift │ │ │ └── LoadingView.swift │ │ ├── Detail │ │ │ ├── Components │ │ │ │ ├── LicenseView.swift │ │ │ │ └── OwnerView.swift │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ └── ListViewController.swift │ │ ├── Protocols │ │ │ └── ViewCode.swift │ │ ├── Sample │ │ │ ├── SampleConfigurator.swift │ │ │ ├── SampleService.swift │ │ │ ├── SampleView.swift │ │ │ └── SampleViewController.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ └── Service │ │ └── Service.swift ├── GitHubAppTests │ ├── Network │ │ └── NetworkManagerTests.swift │ ├── Screens │ │ └── Sample │ │ │ └── SampleServiceTests.swift │ └── Service │ │ └── SampleApiDataSourceTests.swift └── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── devsprint-cecilia-saraiva-1 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ ├── Owner.swift │ │ └── Repository.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Component │ │ │ └── ButtonView.swift │ │ ├── Components │ │ │ └── EmptyView.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ ├── ListViewController.swift │ │ │ ├── LoadingView.swift │ │ │ ├── LoadingViewConfiguration.swift │ │ │ └── RepositoryCell │ │ │ │ ├── RepositoryCellModel.swift │ │ │ │ └── RepositoryCellView.swift │ │ ├── Resources │ │ │ ├── EmptyViewStrings.strings │ │ │ └── EmptyViewStrings.swift │ │ ├── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ │ └── ViewConfiguration │ │ │ ├── EmptyViewConfiguration.swift │ │ │ └── ViewCodeProtocol.swift │ └── Service │ │ ├── APIError.swift │ │ └── Service.swift ├── GitHubAppTests │ └── GitHubAppTests.swift └── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── devsprint-firas-safa-1 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Network │ │ ├── Manager │ │ │ ├── HTTPMethod.swift │ │ │ ├── NetworkManager.swift │ │ │ └── Typealiases.swift │ │ ├── Models │ │ │ └── Repository.swift │ │ └── Requests │ │ │ ├── GetUserRepos.swift │ │ │ └── HTTPRequest.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ └── ButtonView │ │ │ │ └── ButtonView.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ ├── DetailViewController.swift │ │ │ └── RepositoryInfoView.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ ├── ListViewController.swift │ │ │ └── ListViewModel.swift │ │ ├── RepositoryCell │ │ │ └── RepositoryCellView.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ ├── SettingsViewCell.swift │ │ │ ├── SettingsViewController.swift │ │ │ └── SettingsViewModel.swift │ ├── Service │ │ └── Service.swift │ └── Utils │ │ └── Utils.swift ├── GitHubAppTests │ └── GitHubAppTests.swift └── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── devsprint-marcus-seixas-1 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ ├── GitHubApp.swift │ │ └── Repository.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── Empty │ │ │ ├── EmptyView.swift │ │ │ └── ViewCodable.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ └── ListViewController.swift │ │ ├── Loader │ │ │ └── LoadingView.swift │ │ ├── RepositoryCellView │ │ │ └── RepositoryCellView.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ └── Service │ │ └── Service.swift ├── GitHubAppTests │ └── GitHubAppTests.swift └── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── devsprint-matheus-reis-4 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ ├── Repository.swift │ │ └── RepositoryViewCell.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ └── EmptyView │ │ │ │ └── EmptyView.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ └── ListViewController.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ └── Service │ │ └── Service.swift ├── GitHubAppTests │ └── GitHubAppTests.swift └── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── devsprint-matheus-reis-8 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ └── Repository.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ ├── LoadingView.swift │ │ │ └── RepositoryCellView.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ └── ListViewController.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ └── Service │ │ └── Service.swift ├── GitHubAppTests │ ├── GitHubAppTests.swift │ ├── LoadingViewTests.swift │ ├── RepositoryCellViewTests.swift │ └── __Snapshots__ │ │ ├── GitHubAppTests │ │ └── testExample.1.png │ │ ├── LoadingViewTests │ │ └── testSnapshotLoadingView.1.png │ │ └── SnapshotTestRepositoryCellView │ │ └── testRepositoryCellView.1.png ├── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── Podfile └── Podfile.lock ├── devsprint-rafael-silva-1 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ └── Repository.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Cell │ │ │ └── RepositoryCellView.swift │ │ ├── Components │ │ │ ├── ButtonView.swift │ │ │ ├── EmptyView.swift │ │ │ └── LoadingView.swift │ │ ├── Detail │ │ │ ├── Components │ │ │ │ ├── OwnerView.swift │ │ │ │ └── RepositoryInfoView.swift │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ └── ListViewController.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ └── Service │ │ └── Service.swift ├── GitHubAppTests │ └── GitHubAppTests.swift └── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── devsprint-rafael-silva-2 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ └── Repository.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ ├── EmptyView.swift │ │ │ └── LoadingView.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ ├── ListViewController.swift │ │ │ └── RepositoryCellView.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ └── Service │ │ └── Service.swift ├── GitHubAppTests │ └── GitHubAppTests.swift └── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── devsprint-renato-sarro-3 ├── GitHubApp.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── GitHubApp.xcscheme ├── GitHubApp.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── Application │ │ └── Screens │ │ │ ├── Components │ │ │ ├── EmptyView │ │ │ │ └── EmptyView.swift │ │ │ ├── RepositoryCell │ │ │ │ └── RepositoryCellViewConfiguration.swift │ │ │ └── Viewcode │ │ │ │ └── Viewcode.swift │ │ │ ├── Detail │ │ │ ├── DetailStoryboard.storyboard │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ │ ├── List │ │ │ ├── Cell │ │ │ │ └── ListViewCell.swift │ │ │ ├── ListView.swift │ │ │ └── ListViewController.swift │ │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ ├── SettingsViewController.swift │ │ │ └── StringsHelper.swift │ ├── Data │ │ ├── Models │ │ │ └── Repository.swift │ │ └── Repository │ │ │ ├── RepositoriesRepository.swift │ │ │ └── RepositoryRequest.swift │ ├── Domain │ │ ├── Network │ │ │ ├── Repositories.swift │ │ │ ├── Request.swift │ │ │ └── Service.swift │ │ ├── Repository │ │ │ └── RepositoriesRepositoryProtocol.swift │ │ └── UseCase │ │ │ └── RepositoryUseCase.swift │ ├── Infra │ │ ├── AppDelegate │ │ │ ├── AppDelegate.swift │ │ │ └── SceneDelegate.swift │ │ ├── DebugYourViews │ │ │ └── DebugViewController.swift │ │ └── Extensions │ │ │ ├── String+Extensions.swift │ │ │ ├── UIColor+Extensions.swift │ │ │ ├── UITableViewCell+Extensions.swift │ │ │ └── UIViewController+Extensions.swift │ └── Resources │ │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ ├── 100.png │ │ │ ├── 1024.png │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 128.png │ │ │ ├── 144.png │ │ │ ├── 152.png │ │ │ ├── 16.png │ │ │ ├── 167.png │ │ │ ├── 172.png │ │ │ ├── 180.png │ │ │ ├── 196.png │ │ │ ├── 20.png │ │ │ ├── 216.png │ │ │ ├── 256.png │ │ │ ├── 29.png │ │ │ ├── 32.png │ │ │ ├── 40.png │ │ │ ├── 48.png │ │ │ ├── 50.png │ │ │ ├── 512.png │ │ │ ├── 55.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 64.png │ │ │ ├── 72.png │ │ │ ├── 76.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ ├── 88.png │ │ │ └── Contents.json │ │ └── Contents.json │ │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ │ └── Info.plist ├── GitHubAppTests │ ├── GitHubAppTests.swift │ ├── Screens │ │ └── List │ │ │ ├── ListViewControllerSnapshotTest.swift │ │ │ ├── ListViewControllerUnitTest.swift │ │ │ └── __Snapshots__ │ │ │ ├── ListViewControllerSnapshotTest │ │ │ └── test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png │ │ │ └── ListViewControllerTest │ │ │ └── test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png │ └── Service │ │ └── ServiceTest.swift ├── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── Podfile └── Podfile.lock ├── devsprint-riccardo-1 ├── .swiftformat ├── .swiftlint.yml ├── OnboardingChallenge.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── OnboardingChallenge │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ └── Resources │ │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ │ └── Info.plist ├── OnboardingChallengeKit │ ├── .gitignore │ ├── Package.swift │ ├── README.md │ ├── Sources │ │ └── OnboardingChallengeKit │ │ │ ├── Components │ │ │ ├── ButtonView.swift │ │ │ └── LicenseView.swift │ │ │ ├── Extensions │ │ │ ├── String+Extensions.swift │ │ │ ├── UIColor+Extensions.swift │ │ │ ├── UITableViewCell+Extensions.swift │ │ │ └── UIViewController+Extensions.swift │ │ │ ├── Helpers │ │ │ └── SwiftUIPreView.swift │ │ │ ├── Screens │ │ │ ├── Detail │ │ │ │ └── DetailViewController.swift │ │ │ ├── EmptyView │ │ │ │ └── EmptyView.swift │ │ │ ├── List │ │ │ │ ├── Cell │ │ │ │ │ ├── RepositoryCellView.swift │ │ │ │ │ └── RepositoryCellViewConfiguration.swift │ │ │ │ ├── ListView.swift │ │ │ │ ├── ListViewConfiguration.swift │ │ │ │ └── ListViewController.swift │ │ │ ├── LoadingView │ │ │ │ └── LoadingView.swift │ │ │ └── Settings │ │ │ │ ├── Models │ │ │ │ └── SettingsTitle.swift │ │ │ │ ├── SettingsInteractor.swift │ │ │ │ ├── SettingsViewModel.swift │ │ │ │ └── Views │ │ │ │ ├── Cell │ │ │ │ └── SettingsCell.swift │ │ │ │ ├── SettingsView.swift │ │ │ │ └── SettingsViewController.swift │ │ │ └── Service │ │ │ ├── BundleService.swift │ │ │ └── Service.swift │ └── Tests │ │ └── OnboardingChallengeKitTests │ │ └── OnboardingChallengeKitTests.swift └── OnboardingChallengeTests │ └── OnboardingChallengeTests.swift ├── devsprint-rodrigo-borges-1 ├── GitHubApp.xcodeproj │ ├── .project.pbxproj.swp │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── GitHubApp.xcscheme ├── GitHubApp.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GitHubApp │ ├── AppDelegate │ │ ├── AppDelegate.swift │ │ └── SceneDelegate.swift │ ├── DebugYourViews │ │ └── DebugViewController.swift │ ├── Extensions │ │ ├── String+Extensions.swift │ │ ├── UIColor+Extensions.swift │ │ ├── UITableViewCell+Extensions.swift │ │ └── UIViewController+Extensions.swift │ ├── Models │ │ └── Repository.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 │ │ ├── Base.lproj │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Screens │ │ ├── Components │ │ │ ├── EmptyView │ │ │ │ ├── EmptyView.swift │ │ │ │ └── EmptyViewConfiguration.swift │ │ │ ├── LoadingView │ │ │ │ ├── LoadingView.swift │ │ │ │ └── LoadingViewConfiguration.swift │ │ │ ├── RepositoryCellView.swift │ │ │ ├── RepositoryInfoView │ │ │ │ ├── RepositoryInfoView.swift │ │ │ │ └── RepositoryInfoViewConfiguration.swift │ │ │ └── ViewCode │ │ │ │ └── ViewCode.swift │ │ ├── Detail │ │ │ ├── DetailView.swift │ │ │ └── DetailViewController.swift │ │ ├── List │ │ │ ├── ListView.swift │ │ │ ├── ListViewConfiguration.swift │ │ │ └── ListViewController.swift │ │ └── Settings │ │ │ ├── SettingsView.swift │ │ │ └── SettingsViewController.swift │ └── Service │ │ └── Service.swift ├── GitHubAppTests │ ├── EmptyViewSnapshotTests.swift │ ├── LoadingViewSnapshotTests.swift │ ├── RepositoryCellViewSnapshotTests.swift │ ├── RepositoryInfoUnitTests.swift │ ├── UIViewControllerUnitTests.swift │ └── __Snapshots__ │ │ ├── EmptyViewSnapshotTests │ │ └── testEmptyView.1.png │ │ ├── LoadingViewSnapshotTests │ │ └── testLoadingView.1.png │ │ └── RepositoryCellViewSnapshotTests │ │ └── testRepositoyCellViewSnapshotTests.1.png ├── GitHubAppUITests │ ├── GitHubAppUITests.swift │ └── GitHubAppUITestsLaunchTests.swift ├── Podfile └── Podfile.lock └── devsprint-rodrigo-borges-2 ├── GitHubApp.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── GitHubApp ├── AppDelegate │ ├── AppDelegate.swift │ └── SceneDelegate.swift ├── DebugYourViews │ └── DebugViewController.swift ├── Extensions │ ├── String+Extensions.swift │ ├── UIColor+Extensions.swift │ ├── UITableViewCell+Extensions.swift │ └── UIViewController+Extensions.swift ├── Models │ └── Repository.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 │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Screens │ ├── Detail │ │ ├── DetailView.swift │ │ └── DetailViewController.swift │ ├── List │ │ ├── ListView.swift │ │ └── ListViewController.swift │ └── Settings │ │ ├── SettingsView.swift │ │ └── SettingsViewController.swift └── Service │ └── Service.swift ├── GitHubAppTests └── GitHubAppTests.swift └── GitHubAppUITests ├── GitHubAppUITests.swift └── GitHubAppUITestsLaunchTests.swift /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | ### Description of the new feature or improvement 3 | 4 | 5 | ### Checklist 6 | Put an ```x``` in the boxes that apply. 7 | - [] Implements all acceptance criteria as described on the Task Board 8 | - [] Does not add duplicate code 9 | - [] Does not contain commented code 10 | - [] Does not contain WIP code 11 | 12 | ### Screenshots 13 | | Screenshot 1 | Screenshot 2 | 14 | | ------ | ------ | 15 | | print | print | 16 | -------------------------------------------------------------------------------- /bin/install_tooling.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if ! which swiftlint > /dev/null; then 3 | echo "installing swiftlint..." 4 | brew install swiftlint 5 | else 6 | echo "swift lint installed" 7 | fi 8 | 9 | if ! which swiftformat > /dev/null; then 10 | echo "installing swiftformat..." 11 | brew install swiftformat 12 | else 13 | echo "swiftformat installed" 14 | fi -------------------------------------------------------------------------------- /screenshots/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/screenshots/screenshot-1.png -------------------------------------------------------------------------------- /screenshots/screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/screenshots/screenshot-2.png -------------------------------------------------------------------------------- /screenshots/screenshot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/screenshots/screenshot-3.png -------------------------------------------------------------------------------- /screenshots/screenshot-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/screenshots/screenshot-4.png -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Fabio Martinez on 19/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository: Decodable { 11 | 12 | let name: String 13 | let id: Int 14 | let owner: Owner 15 | } 16 | 17 | struct Owner: Decodable { 18 | 19 | let avatarUrl: String 20 | let login: String? 21 | let id: Int 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/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/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Components/Buttons/ButtonView/ButtonViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ButtonViewConfiguration.swift 3 | // GitHubApp 4 | // 5 | // Created by Gustavo Rocha on 24/01/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | struct ButtonViewConfiguration { 12 | let title: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Components/LoadingView/LoadingViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingViewConfiguration.swift 3 | // GitHubApp 4 | // 5 | // Created by Fabio Martinez on 21/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct LoadingViewConfiguration { 11 | let textLabel : String 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Components/Views/EmptyView/EmptyViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EmptyViewConfiguration.swift 3 | // GitHubApp 4 | // 5 | // Created by Gustavo Rocha on 20/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct EmptyViewConfiguration { 11 | let title: String 12 | let subTitle: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | init() { 13 | super.init(frame: .zero) 14 | backgroundColor = .white 15 | } 16 | 17 | required init?(coder: NSCoder) { 18 | fatalError("init(coder:) has not been implemented") 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Settings/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubAppTests/SnapshotTests/LoadingViewTest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingViewTest.swift 3 | // GitHubAppTests 4 | // 5 | // Created by Fabio Martinez on 26/01/22. 6 | // 7 | 8 | import XCTest 9 | import SnapshotTesting 10 | @testable import GitHubApp 11 | 12 | class LoadingViewTest: XCTestCase { 13 | 14 | lazy var sut: LoadingView = .init() 15 | 16 | let snapshotSize = CGSize(width: 500, height: 200) 17 | 18 | func test_loadingView_whenSnapshot_shouldSucceed() { 19 | let configuration = LoadingViewConfiguration(textLabel: "Carregando...") 20 | 21 | sut.updateView(with: configuration) 22 | 23 | assertSnapshot(matching: sut, as: .image(size: snapshotSize)) 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/GitHubAppTests/SnapshotTests/__Snapshots__/LoadingViewTest/test_loadingView_whenSnapshot_shouldSucceed.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devpsrint-michael-douglas-1/GitHubAppTests/SnapshotTests/__Snapshots__/LoadingViewTest/test_loadingView_whenSnapshot_shouldSucceed.1.png -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'GitHubApp' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for GitHubApp 9 | 10 | target 'GitHubAppTests' do 11 | inherit! :search_paths 12 | pod 'SnapshotTesting', '~> 1.9.0' 13 | end 14 | 15 | target 'GitHubAppUITests' do 16 | # Pods for testing 17 | end 18 | 19 | 20 | 21 | end 22 | -------------------------------------------------------------------------------- /solutions/devpsrint-michael-douglas-1/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SnapshotTesting (1.9.0) 3 | 4 | DEPENDENCIES: 5 | - SnapshotTesting (~> 1.9.0) 6 | 7 | SPEC REPOS: 8 | trunk: 9 | - SnapshotTesting 10 | 11 | SPEC CHECKSUMS: 12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b 13 | 14 | PODFILE CHECKSUM: eed03f2b002b096b3f505e978b7cafe3aa66ec99 15 | 16 | COCOAPODS: 1.11.2 17 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | func removingSpaces() -> String { 13 | 14 | return self.replacingOccurrences(of: " ", with: "") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/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-4/OnboardingChallenge/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Resources/Assets.xcassets/dev.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "dev.jpeg", 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-4/OnboardingChallenge/Resources/Assets.xcassets/dev.imageset/dev.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallenge/Resources/Assets.xcassets/dev.imageset/dev.jpeg -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Screens/Components/EmptyView/EmptyViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EmptyViewConfiguration.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Murillo R. Araújo on 18/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct EmptyViewConfiguration { 11 | let titleMessage: String 12 | let emptyMessage: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Screens/Components/LicenseView/LicenseViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LicenseViewConfiguration.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 21/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct LicenseViewConfiguration { 11 | 12 | let name: String 13 | let code: String 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Screens/Components/Loading/LoadingViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingViewConfiguration.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Pedro Henrique on 18/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct LoadingViewConfiguration { 11 | let message: String 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Screens/Components/RepositoryInfoView/RepositoryInfoViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoryInfoViewConfiguration.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Fabio Martinez on 14/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | 11 | struct RepositoryInfoViewConfiguration { 12 | 13 | var name: String 14 | var description: String 15 | var stars: Int 16 | var bifurcation: Int 17 | 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailsView.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Maíra Preto on 12/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | 13 | /* 14 | // Only override draw() if you perform custom drawing. 15 | // An empty implementation adversely affects performance during animation. 16 | override func draw(_ rect: CGRect) { 17 | // Drawing code 18 | } 19 | */ 20 | 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Screens/List/ListViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListViewConfiguration.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ListViewConfiguration { 11 | 12 | let listItems: [String] 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Screens/Repository/RepositoryCellViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoryCellViewConfiguration.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Thiago Leite on 20/10/21. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | struct RepositoryCellViewConfiguration { 12 | let ownerImage: UIImage 13 | let repoName: String 14 | let ownerName: String 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallenge/Service/UserInfoModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserInfoModel.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Flavia Arsuffi on 15/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct UserInfoModel: Codable { 11 | var id: Int 12 | var name: String 13 | var description: String? 14 | var forks_count: Int 15 | var stargazers_count: Int 16 | var owner: Owner 17 | var license: License? 18 | 19 | } 20 | 21 | struct Owner: Codable { 22 | var login: String 23 | var avatar_url: String 24 | } 25 | 26 | struct License: Codable { 27 | var key: String 28 | var name: String 29 | var spdx_id: String 30 | var url: String? 31 | } 32 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/LoadingViewSnapshotTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingViewSnapshotTests.swift 3 | // OnboardingChallengeTests 4 | // 5 | // Created by Pedro Henrique on 22/10/21. 6 | // 7 | 8 | import XCTest 9 | import SnapshotTesting 10 | @testable import OnboardingChallenge 11 | 12 | class LoadingViewSnapshotTests: XCTestCase { 13 | 14 | let snapshotSize = CGSize(width: 500, height: 500) 15 | 16 | func testLoadingView() { 17 | let configuration = LoadingViewConfiguration(message: "Searching repositories...") 18 | let loadingView = LoadingView() 19 | 20 | loadingView.updateView(with: configuration) 21 | assertSnapshot(matching: loadingView, as: .image(size: snapshotSize)) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/EmptyViewSnapshotTests/testEmptyView.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/EmptyViewSnapshotTests/testEmptyView.1.png -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LicenseViewSnapshotTests/testEmptyView.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LicenseViewSnapshotTests/testEmptyView.1.png -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LicenseViewSnapshotTests/testLicenseView.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LicenseViewSnapshotTests/testLicenseView.1.png -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LoadingViewSnapshotTests/testLoadingView.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/LoadingViewSnapshotTests/testLoadingView.1.png -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/RepositoryInfoViewTests/testRepositoryInfoView.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-4/OnboardingChallengeTests/SnapshotTests/__Snapshots__/RepositoryInfoViewTests/testRepositoryInfoView.1.png -------------------------------------------------------------------------------- /solutions/devsprint-4/OnboardingChallengeTests/UnitTests/StringUnitTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringUnitTests.swift 3 | // OnboardingChallengeTests 4 | // 5 | // Created by Murillo R. Araújo on 14/10/21. 6 | // 7 | 8 | import XCTest 9 | @testable import OnboardingChallenge 10 | 11 | class StringUnitTests: XCTestCase { 12 | 13 | func testRemovingSpaces() throws { 14 | // Given 15 | let input: String = "Unit Test" 16 | let expected: String = "UnitTest" 17 | 18 | //When 19 | let result = input.removingSpaces() 20 | 21 | XCTAssertEqual(result, expected) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-4/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'OnboardingChallenge' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for OnboardingChallenge 9 | 10 | target 'OnboardingChallengeTests' do 11 | inherit! :search_paths 12 | # Pods for testing 13 | 14 | pod 'SnapshotTesting' 15 | end 16 | 17 | end 18 | -------------------------------------------------------------------------------- /solutions/devsprint-4/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SnapshotTesting (1.9.0) 3 | 4 | DEPENDENCIES: 5 | - SnapshotTesting 6 | 7 | SPEC REPOS: 8 | trunk: 9 | - SnapshotTesting 10 | 11 | SPEC CHECKSUMS: 12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b 13 | 14 | PODFILE CHECKSUM: 45562f1da4197e4c8b60398011aef27c3413d322 15 | 16 | COCOAPODS: 1.11.2 17 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(starsCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(starsCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Extensions/UIView+BorderBottom.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+BorderBottom.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Guilherme Strutzki on 19/11/21. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | extension UIView { 12 | enum ViewSide { 13 | case Left, Right, Top, Bottom 14 | } 15 | 16 | func addBottomBorder(with color: UIColor?, andWidth borderWidth: CGFloat) { 17 | let border = UIView() 18 | border.backgroundColor = color 19 | border.autoresizingMask = [.flexibleWidth, .flexibleTopMargin] 20 | border.frame = CGRect(x: 0, y: frame.size.height - borderWidth, width: frame.size.width, height: borderWidth) 21 | addSubview(border) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Model/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Diego Fernando on 09/11/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository: Decodable { 11 | let name: String 12 | let owner: Owner 13 | } 14 | 15 | struct Owner: Decodable { 16 | 17 | let login: String 18 | } 19 | 20 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/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-5/OnboardingChallenge/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Resources/Assets.xcassets/user-profile.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "user-profile.jpeg", 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-5/OnboardingChallenge/Resources/Assets.xcassets/user-profile.imageset/user-profile.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-5/OnboardingChallenge/Resources/Assets.xcassets/user-profile.imageset/user-profile.jpeg -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | 14 | self.view = DetailView() 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Screens/List/ListViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListViewConfiguration.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ListViewConfiguration { 11 | let listItems: [Repository] 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Screens/Settings/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Francischett Occhiuto on 13/11/21. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | class SettingsView: UIView { 12 | init () { 13 | super.init(frame: .zero) 14 | backgroundColor = .white 15 | } 16 | 17 | required init?(coder: NSCoder) { 18 | fatalError("init(coder:) has not been implemented") 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | override func loadView() { 12 | self.view = SettingsView() 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Utils/RepositoryCellViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoryCellViewModel.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Guilherme Strutzki on 10/11/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RepositoryCellViewModel { 11 | var name: String 12 | var ownerUsername: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-5/OnboardingChallenge/Utils/ViewCode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewCode.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Guilherme Strutzki on 10/11/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol ViewCode { 11 | func buildViewHierarchy() 12 | func addConstraints() 13 | func additionalConfiguration() 14 | func setup() 15 | } 16 | extension ViewCode { 17 | func setup() { 18 | buildViewHierarchy() 19 | addConstraints() 20 | additionalConfiguration() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-5/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'OnboardingChallenge' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for OnboardingChallenge 9 | 10 | target 'OnboardingChallengeTests' do 11 | inherit! :search_paths 12 | 13 | pod 'SnapshotTesting' 14 | end 15 | 16 | end 17 | -------------------------------------------------------------------------------- /solutions/devsprint-5/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SnapshotTesting (1.9.0) 3 | 4 | DEPENDENCIES: 5 | - SnapshotTesting 6 | 7 | SPEC REPOS: 8 | trunk: 9 | - SnapshotTesting 10 | 11 | SPEC CHECKSUMS: 12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b 13 | 14 | PODFILE CHECKSUM: 8107f0ef2fce8da6d6bce62c949c5b732294accd 15 | 16 | COCOAPODS: 1.11.2 17 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Extensions/UINavigationController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationController+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Pedro Gabriel on 09/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UINavigationController { 11 | func setupLightGrayAppearance() { 12 | let navBarAppearance = UINavigationBarAppearance() 13 | navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.black] 14 | navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.black] 15 | navBarAppearance.backgroundColor = .systemGray6 16 | navigationBar.standardAppearance = navBarAppearance 17 | navigationBar.scrollEdgeAppearance = navBarAppearance 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Models/RepositoriesModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoriesModel.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Marcos Jr on 10/11/21. 6 | 7 | 8 | import Foundation 9 | 10 | // MARK: - RepositoryModel 11 | struct RepositoriesModel: Codable { 12 | let id: Int 13 | let name: String 14 | let owner: Owner 15 | let stargazersCount: Int 16 | let language: String? 17 | let forksCount: Int 18 | } 19 | 20 | // MARK: - Owner 21 | struct Owner: Codable { 22 | let login: String 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/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-6/OnboardingChallenge/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Resources/Assets.xcassets/finn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "finn.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-6/OnboardingChallenge/Resources/Assets.xcassets/finn.imageset/finn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-6/OnboardingChallenge/Resources/Assets.xcassets/finn.imageset/finn.png -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Screens/Components/RepositoryInfoView/RepositoryInfoViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoryInfoViewConfiguration.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Mateus Coelho on 18/11/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RepositoryInfoViewConfiguration { 11 | var name: String 12 | var description: String 13 | var stars: Int 14 | var bifurcations: Int 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Screens/List/ListViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListViewConfiguration.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ListViewConfiguration { 11 | 12 | let repositories: [RepositoriesModel] 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController{ 11 | 12 | init(){ 13 | super.init(nibName: nil, bundle: nil) 14 | navigationItem.title = "Settings" 15 | } 16 | 17 | required init?(coder: NSCoder) { 18 | fatalError("init(coder:) has not been implemented") 19 | } 20 | 21 | override func loadView() { 22 | self.view = SettingsView() 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /solutions/devsprint-6/OnboardingChallenge/Screens/Views/ViewCode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewCode.swift 3 | // OnboardingChallenge 4 | // 5 | // Created by Gustavo Soares on 09/11/21. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol ViewCode { 11 | func configureSubViews() 12 | func configureSubviewsConstraints() 13 | func configureAdditionalBehaviors() 14 | } 15 | 16 | extension ViewCode { 17 | public func setupViews() { 18 | configureSubViews() 19 | configureSubviewsConstraints() 20 | configureAdditionalBehaviors() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-6/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'OnboardingChallenge' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for OnboardingChallenge 9 | 10 | target 'OnboardingChallengeTests' do 11 | inherit! :search_paths 12 | # Pods for testing 13 | 14 | pod 'SnapshotTesting' 15 | end 16 | 17 | end 18 | -------------------------------------------------------------------------------- /solutions/devsprint-6/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SnapshotTesting (1.9.0) 3 | 4 | DEPENDENCIES: 5 | - SnapshotTesting 6 | 7 | SPEC REPOS: 8 | trunk: 9 | - SnapshotTesting 10 | 11 | SPEC CHECKSUMS: 12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b 13 | 14 | PODFILE CHECKSUM: 45562f1da4197e4c8b60398011aef27c3413d322 15 | 16 | COCOAPODS: 1.11.2 17 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Extensions/UIImageView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIImageView+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Giovanna Moeller on 19/01/22. 6 | // 7 | 8 | import Foundation 9 | import UIKit 10 | 11 | extension UIImageView { 12 | 13 | func makeItRounded() { 14 | self.layer.cornerRadius = self.frame.size.height / 2 15 | self.layer.masksToBounds = true 16 | self.clipsToBounds = true 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Models/GitHubApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GitHubApp.swift 3 | // GitHubApp 4 | // 5 | // Created by Michelli Cristina de Paulo Lima on 19/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GitHubApp: Codable { 11 | var name: String 12 | var description: String? 13 | var stargazersCount: Int 14 | var watchersCount: Int 15 | var owner: Owner 16 | } 17 | 18 | struct Owner: Codable { 19 | var login: String 20 | var avatarUrl: String 21 | var type: String 22 | } 23 | 24 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/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-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/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-attekita-1/GitHubApp/Screens/Components/ViewCodable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewCodable.swift 3 | // GitHubApp 4 | // 5 | // Created by Luiza on 19/01/22. 6 | // 7 | 8 | 9 | import Foundation 10 | 11 | public protocol ViewCodable { 12 | 13 | func buildHierarchy() 14 | 15 | func setupConstraints() 16 | 17 | func applyAdditionalChanges() 18 | } 19 | 20 | public extension ViewCodable { 21 | 22 | func setupView() { 23 | buildHierarchy() 24 | setupConstraints() 25 | applyAdditionalChanges() 26 | } 27 | 28 | func buildHierarchy() {} 29 | 30 | func setupConstraints() {} 31 | 32 | func applyAdditionalChanges() {} 33 | } 34 | 35 | 36 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | 13 | override func loadView() { 14 | view = DetailView() 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Screens/List/ListViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListViewConfiguration.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | enum ListViewConfiguration { 11 | case empty 12 | case loading 13 | case list(_: [GitHubApp]) 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | final class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | let appearance = UINavigationBarAppearance() 15 | appearance.backgroundColor = UIColor(named: "SettingsTitleBGColor") 16 | appearance.titleTextAttributes = [.foregroundColor: UIColor(named: "SettingsTitleColor") ?? .black] 17 | navigationController?.navigationBar.scrollEdgeAppearance = appearance 18 | title = "Settings" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'GitHubApp' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for GitHubApp 9 | pod 'Kingfisher', '~> 7.0' 10 | 11 | target 'GitHubAppTests' do 12 | inherit! :search_paths 13 | # Pods for testing 14 | pod 'SnapshotTesting', '~> 1.9.0' 15 | end 16 | 17 | target 'GitHubAppUITests' do 18 | # Pods for testing 19 | end 20 | 21 | end 22 | -------------------------------------------------------------------------------- /solutions/devsprint-attekita-1/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Kingfisher (7.1.1) 3 | - SnapshotTesting (1.9.0) 4 | 5 | DEPENDENCIES: 6 | - Kingfisher (~> 7.0) 7 | - SnapshotTesting (~> 1.9.0) 8 | 9 | SPEC REPOS: 10 | trunk: 11 | - Kingfisher 12 | - SnapshotTesting 13 | 14 | SPEC CHECKSUMS: 15 | Kingfisher: f738f9c4a3415823b8e2985d10aa2d6a9f37bc4d 16 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b 17 | 18 | PODFILE CHECKSUM: 8f6e167bb1f6c12e9c1d634b11c8abf0c7d6c86a 19 | 20 | COCOAPODS: 1.11.2 21 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 14/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository { 11 | let name: String 12 | 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/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-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/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-ramos-5/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Screens/Protocols/ViewCode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewCode.swift 3 | // GitHubApp 4 | // 5 | // Created by Vitor Conceicao on 06/07/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol ViewCode { 11 | func setupSubviews() 12 | func setupConstraint() 13 | func setupExtraConfiguration() 14 | func setup() 15 | } 16 | 17 | extension ViewCode { 18 | func setup() { 19 | setupSubviews() 20 | setupConstraint() 21 | setupExtraConfiguration() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Screens/Sample/SampleConfigurator.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | enum SampleConfigurator { 4 | static func make() -> UIViewController { 5 | let session = URLSession.shared 6 | let network = NetworkManager(session: session) 7 | let localDataSource = SampleApiDataSource(network: network) 8 | let service = SampleService(dataSource: localDataSource) 9 | let customView = SampleView() 10 | let viewController = SampleViewController(service: service, customView: customView) 11 | return viewController 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-bruno-ramos-5/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | private let sectionTitle = "APP VERSION" 13 | private let sectionItems = ["Version 1.0"] 14 | 15 | private let settingsView = SettingsView() 16 | 17 | override func loadView() { 18 | self.view = settingsView 19 | } 20 | 21 | override func viewDidLoad() { 22 | super.viewDidLoad() 23 | 24 | settingsView.addSection(section: .init(title: sectionTitle, values: sectionItems)) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Models/Owner.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Owner.swift 3 | // GitHubApp 4 | // 5 | // Created by Amaryllis Baldrez on 27/07/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Owner: Codable { 11 | let login: String 12 | let avatarUrl: String 13 | 14 | enum CodingKeys: String, CodingKey { 15 | case login 16 | case avatarUrl = "avatar_url" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 14/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository: Codable { 11 | let name: String 12 | let owner: Owner 13 | } 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/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-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/List/LoadingViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingViewConfiguration.swift 3 | // GitHubApp 4 | // 5 | // Created by Pierre Youness on 29/07/2022. 6 | // 7 | 8 | import Foundation 9 | 10 | struct LoadingViewConfiguration { 11 | let description: String 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/List/RepositoryCell/RepositoryCellModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoryCellModel.swift 3 | // GitHubApp 4 | // 5 | // Created by Pierre Youness on 28/07/2022. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RepositoryCellModel { 11 | let name: String 12 | let owner: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Resources/EmptyViewStrings.strings: -------------------------------------------------------------------------------- 1 | 2 | "emptyViewTitle" = "No repositories found"; 3 | "emptyViewSubtitle" = "Search for users to see their public repositories here!"; 4 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Resources/EmptyViewStrings.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | enum EmptyViewString: String { 5 | 6 | case emptyViewTitle 7 | case emptyViewSubtitle 8 | 9 | var localized: String { 10 | return self.rawValue.localized(tableName: "EmptyViewStrings") 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Settings/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/ViewConfiguration/EmptyViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | struct EmptyViewConfiguration { 5 | let title: String 6 | let subtitle: String 7 | } 8 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Screens/ViewConfiguration/ViewCodeProtocol.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | protocol ViewConfiguration: AnyObject { 5 | func setupViews() 6 | func configureViews() 7 | func buildViews() 8 | func setupConstraints() 9 | } 10 | 11 | extension ViewConfiguration { 12 | func setupViews() { 13 | self.configureViews() 14 | self.buildViews() 15 | self.setupConstraints() 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-cecilia-saraiva-1/GitHubApp/Service/APIError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // APIError.swift 3 | // GitHubApp 4 | // 5 | // Created by Amaryllis Baldrez on 29/07/22. 6 | // 7 | 8 | import Foundation 9 | 10 | enum APIError: Error { 11 | case URLError 12 | case ParseError 13 | case emptyData 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Network/Manager/HTTPMethod.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HTTPMethod.swift 3 | // GitHubApp 4 | // 5 | // Created by Razee Hussein-Jamal on 09/02/2022. 6 | // 7 | 8 | import Foundation 9 | 10 | // Type representing `HTTPMethods` 11 | enum HTTPMethod: String { 12 | case get = "GET" 13 | } 14 | 15 | // Type representing `URLs` 16 | enum URLs: String { 17 | // API endpoint to github api 18 | case githubAPI = "api.github.com" 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Network/Manager/Typealiases.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Typealiases.swift 3 | // GitHubApp 4 | // 5 | // Created by Razee Hussein-Jamal on 12/02/2022. 6 | // 7 | 8 | import Foundation 9 | 10 | // A dictionary to be encoded and sent with the network request 11 | // There is no use case for `Parameters` therefore it has not been used 12 | typealias Parameters = [String: String] 13 | 14 | // A path that identifies the resource at the end of a Url 15 | typealias Path = [String] 16 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Network/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 14/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | // MARK: - Repository 11 | 12 | struct Repository: Decodable { 13 | let id: Int 14 | 15 | enum CodingKeys: String, CodingKey { 16 | case id 17 | 18 | } 19 | } 20 | 21 | // MARK: - Owner 22 | 23 | struct Owner: Decodable { 24 | let id: Int 25 | 26 | enum CodingKeys: String, CodingKey { 27 | case id 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Network/Requests/GetUserRepos.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GetUserRepos.swift 3 | // GitHubApp 4 | // 5 | // Created by Razee Hussein-Jamal on 12/02/2022. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GetUserRepos: HTTPRequest { 11 | typealias ResponseModel = Repository 12 | var host: URLs = .githubAPI 13 | var path: Path 14 | var method: HTTPMethod = .get 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/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-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/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-firas-safa-1/GitHubApp/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Screens/List/ListViewModel.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | struct ListViewModel { 4 | private var listItems: [String] 5 | 6 | var rowCount: Int { 7 | listItems.count 8 | } 9 | 10 | init(listItems: [String] = []) { 11 | self.listItems = listItems 12 | } 13 | 14 | func getItemFor(_ index: Int) -> String { 15 | listItems[index] 16 | } 17 | 18 | func getCellFor(_ index: Int) -> RepositoryCellViewConfiguration { 19 | let item = listItems[index] 20 | return RepositoryCellViewConfiguration(title: item, subtitle: item) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Screens/Settings/SettingsViewCell.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class SettingsViewCell: UITableViewCell { 4 | static let cellIdentifier = "SettingsCell" 5 | } 6 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | title = "Settings" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Screens/Settings/SettingsViewModel.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | struct SettingsViewModel { 4 | private let appVersion = Utils.appVersion 5 | private let header = "APP VERSTION" 6 | 7 | var rowCount: Int { 8 | 1 9 | } 10 | 11 | func getCellFor(_ index: Int) -> String { 12 | "Version " + appVersion 13 | } 14 | 15 | func getHeaderFor(_ index: Int) -> String { 16 | header 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Service/Service.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Service.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 30/09/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Service { 11 | 12 | func fetchList(_ completion: ([String]) -> Void) { 13 | 14 | completion(["Repository 1", "Repository 2", "Repository 3"]) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-firas-safa-1/GitHubApp/Utils/Utils.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | enum Utils { 4 | static let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Missing app version" 5 | } 6 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Models/GitHubApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GitHubApp.swift 3 | // GitHubApp 4 | // 5 | // Created by Rafael Mazzoco on 01/12/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct GitHubApp: Codable { 11 | var name: String 12 | var description: String? 13 | var stargazersCount: Int 14 | var watcherCount: Int 15 | var owner: Owner 16 | } 17 | 18 | struct Owner: Codable { 19 | var login: String 20 | var avatarUrl: String 21 | var type: String 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 14/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository { 11 | let name: String 12 | 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/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-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Empty/ViewCodable.swift: -------------------------------------------------------------------------------- 1 | // ViewCodable.swift 2 | // GitHubApp 3 | // 4 | // Created by Rafael Mazzoco on 23/11/22. 5 | // 6 | 7 | import Foundation 8 | 9 | 10 | public protocol ViewCodable { 11 | 12 | func buildHierarchy() 13 | 14 | func setupConstraints() 15 | 16 | func applyAdditionalChanges() 17 | } 18 | 19 | // 20 | public extension ViewCodable { 21 | 22 | func setupView() { 23 | buildHierarchy() 24 | setupConstraints() 25 | applyAdditionalChanges() 26 | } 27 | 28 | func buildHierarchy() {} 29 | 30 | func setupConstraints() {} 31 | 32 | func applyAdditionalChanges() {} 33 | } 34 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Settings/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-marcus-seixas-1/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 14/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository { 11 | let name: String 12 | 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/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-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Screens/Settings/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-4/GitHubApp/Service/Service.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Service.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 30/09/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Service { 11 | 12 | func fetchList(_ completion: ([String]) -> Void) { 13 | 14 | completion(["Repository 1", "Repository 2", "Repository 3"]) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 14/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository { 11 | let name: String 12 | 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/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-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Screens/Settings/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubApp/Service/Service.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Service.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 30/09/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Service { 11 | 12 | func fetchList(_ completion: ([String]) -> Void) { 13 | 14 | completion(["Repository 1", "Repository 2", "Repository 3"]) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/GitHubAppTests/testExample.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/GitHubAppTests/testExample.1.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/LoadingViewTests/testSnapshotLoadingView.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/LoadingViewTests/testSnapshotLoadingView.1.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/SnapshotTestRepositoryCellView/testRepositoryCellView.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-matheus-reis-8/GitHubAppTests/__Snapshots__/SnapshotTestRepositoryCellView/testRepositoryCellView.1.png -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'GitHubApp' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for GitHubApp 9 | 10 | target 'GitHubAppTests' do 11 | inherit! :search_paths 12 | pod 'SnapshotTesting', '~> 1.9' 13 | # Pods for testing 14 | end 15 | 16 | target 'GitHubAppUITests' do 17 | # Pods for testing 18 | end 19 | 20 | end 21 | -------------------------------------------------------------------------------- /solutions/devsprint-matheus-reis-8/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SnapshotTesting (1.9.0) 3 | 4 | DEPENDENCIES: 5 | - SnapshotTesting (~> 1.9) 6 | 7 | SPEC REPOS: 8 | trunk: 9 | - SnapshotTesting 10 | 11 | SPEC CHECKSUMS: 12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b 13 | 14 | PODFILE CHECKSUM: ddf04402787fa42c500f5724d8ff155a39472aa6 15 | 16 | COCOAPODS: 1.12.0 17 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension String { 4 | 5 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 6 | 7 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/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-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-1/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | } 15 | 16 | override func viewDidLoad() { 17 | self.navigationItem.title = "Settings" 18 | 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 14/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository: Codable { 11 | let name: String 12 | let owner: Login 13 | } 14 | 15 | struct Login: Codable { 16 | let login: String 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/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-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Screens/Settings/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-rafael-silva-2/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Components/RepositoryCell/RepositoryCellViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoryCellViewConfiguration.swift 3 | // GitHubApp 4 | // 5 | // Created by Thyago Raphael on 24/05/22. 6 | // 7 | 8 | import UIKit 9 | 10 | struct RepositoryCellViewConfiguration { 11 | let name: String 12 | let description: String 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Components/Viewcode/Viewcode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewCode.swift 3 | // GitHubApp 4 | // 5 | // Created by Thyago Raphael on 25/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol Viewcode { 11 | func buildHierarchy() 12 | func setupConstraints() 13 | func setupExtraConfiguration() 14 | } 15 | 16 | extension Viewcode { 17 | func setupViewCode() { 18 | buildHierarchy() 19 | setupConstraints() 20 | setupExtraConfiguration() 21 | } 22 | 23 | func setupExtraConfiguration() { } 24 | } 25 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Application/Screens/Settings/StringsHelper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringsHelper.swift 3 | // GitHubApp 4 | // 5 | // Created by Tatiana Rico on 23/05/22. 6 | // 7 | 8 | /** 9 | Arquivo para centralizar todas as 'STRINGS' do projeto. 10 | 1. Manter em ordem alfabetica, para não repetir string 11 | **/ 12 | 13 | import Foundation 14 | 15 | class StringsHelper { 16 | static let TITLE_EMPTYVIEW = "No repositores found" 17 | static let TEXT_EMPTYVIEW = "Search for users to see their public repositores here" 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Data/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 14/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository: Decodable { 11 | let name: String 12 | let description: String? 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Data/Repository/RepositoriesRepository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoriesRepository.swift 3 | // GitHubApp 4 | // 5 | // Created by Renato Sarro on 01/06/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RepositoriesRepository: RepositoriesRepositoryProtocol { 11 | 12 | private let service: ServiceProtocol 13 | 14 | init(service: ServiceProtocol = Service()) { 15 | self.service = service 16 | } 17 | 18 | func fetchRepositoryList(user: String, completion: @escaping (Result<[Repository], ApiError>) -> Void) { 19 | service.fetchData(request: RepositoryRequest(user: user)) { (result: Result<[Repository], ApiError>) in 20 | completion(result) 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Data/Repository/RepositoryRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoryRequest.swift 3 | // GitHubApp 4 | // 5 | // Created by Renato Sarro on 31/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RepositoryRequest: RequestProtocol { 11 | var url: String { 12 | return "https://api.github.com/users/\(user)/repos" 13 | } 14 | 15 | var parameres: [String : Any] { 16 | return [:] 17 | } 18 | 19 | var method: HTTPMethod { 20 | return .get 21 | } 22 | 23 | var user: String 24 | } 25 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Domain/Network/Repositories.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repositories.swift 3 | // GitHubApp 4 | // 5 | // Created by Vinicius Rodrigues on 25/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | class Repositories { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Domain/Network/Request.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Request.swift 3 | // GitHubApp 4 | // 5 | // Created by Renato Sarro on 31/05/22. 6 | // 7 | 8 | import Foundation 9 | 10 | enum HTTPMethod: String { 11 | case get = "GET" 12 | case post = "POST" 13 | case delete = "DELETE" 14 | } 15 | 16 | protocol RequestProtocol { 17 | var url: String { get } 18 | var parameres: [String: Any] { get } 19 | var method: HTTPMethod { get } 20 | } 21 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Domain/Repository/RepositoriesRepositoryProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoriesRepositoryProtocol.swift 3 | // GitHubApp 4 | // 5 | // Created by Renato Sarro on 01/06/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol RepositoriesRepositoryProtocol { 11 | func fetchRepositoryList(user: String, completion: @escaping (Result<[Repository], ApiError>) -> Void) 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Infra/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Infra/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Infra/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Infra/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/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-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/100.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/128.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/144.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/16.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/172.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/196.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/216.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/256.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/32.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/48.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/50.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/512.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/55.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/64.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/72.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/88.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/ListViewControllerSnapshotTest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListViewControllerSnapshotTest.swift 3 | // GitHubAppTests 4 | // 5 | // Created by Renato Sarro on 26/05/22. 6 | // 7 | 8 | import Foundation 9 | import SnapshotTesting 10 | import XCTest 11 | 12 | @testable import GitHubApp 13 | 14 | class ListViewControllerSnapshotTest: XCTestCase { 15 | 16 | var sut: ListViewController! 17 | 18 | override func setUp() { 19 | sut = ListViewController() 20 | } 21 | 22 | func test_WhenPresentListViewController_ShouldHaveValidSnapshot() { 23 | assertSnapshot(matching: UINavigationController(rootViewController: sut), as: .image(on: .iPhoneX)) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/__Snapshots__/ListViewControllerSnapshotTest/test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/__Snapshots__/ListViewControllerSnapshotTest/test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/__Snapshots__/ListViewControllerTest/test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-renato-sarro-3/GitHubAppTests/Screens/List/__Snapshots__/ListViewControllerTest/test_WhenPresentListViewController_ShouldHaveValidSnapshot.1.png -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '15.2' 3 | 4 | target 'GitHubApp' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for GitHubApp 9 | 10 | target 'GitHubAppTests' do 11 | inherit! :search_paths 12 | # Pods for testing 13 | pod 'SnapshotTesting', '~> 1.9.0' 14 | end 15 | 16 | target 'GitHubAppUITests' do 17 | # Pods for testing 18 | end 19 | 20 | end 21 | -------------------------------------------------------------------------------- /solutions/devsprint-renato-sarro-3/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SnapshotTesting (1.9.0) 3 | 4 | DEPENDENCIES: 5 | - SnapshotTesting (~> 1.9.0) 6 | 7 | SPEC REPOS: 8 | trunk: 9 | - SnapshotTesting 10 | 11 | SPEC CHECKSUMS: 12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b 13 | 14 | PODFILE CHECKSUM: aff12353989e2944c22c7ce27b78df3f74d1b9a2 15 | 16 | COCOAPODS: 1.11.2 17 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallenge.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallenge.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallenge/AppDelegate/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import OnboardingChallengeKit 4 | import UIKit 5 | 6 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 7 | var window: UIWindow? 8 | 9 | func scene(_ scene: UIScene, willConnectTo _: UISceneSession, options _: UIScene.ConnectionOptions) { 10 | guard let windowScene = (scene as? UIWindowScene) else { return } 11 | 12 | self.window = UIWindow(frame: UIScreen.main.bounds) 13 | self.window?.rootViewController = UINavigationController(rootViewController: ListViewController()) 14 | self.window?.windowScene = windowScene 15 | self.window?.makeKeyAndVisible() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallenge/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-riccardo-1/OnboardingChallenge/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | DerivedData/ 7 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 8 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/README.md: -------------------------------------------------------------------------------- 1 | # OnboardingChallengeKit 2 | 3 | Package that contains the OnboardingChallenge application. 4 | This package lets us avoid any conflicts in the xcodeproj file and it enables modularization. 5 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import Foundation 4 | 5 | extension String { 6 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 7 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import UIKit 4 | 5 | extension UIColor { 6 | convenience init(red: Int, green: Int, blue: Int) { 7 | self.init( 8 | red: CGFloat(red) / 255.0, 9 | green: CGFloat(green) / 255.0, 10 | blue: CGFloat(blue) / 255.0, 11 | alpha: 1 12 | ) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import UIKit 4 | 5 | extension UITableViewCell { 6 | class func classIdentifier() -> String { 7 | guard let className = String(describing: self).components(separatedBy: ".").last else { 8 | return "" 9 | } 10 | 11 | return className 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import UIKit 4 | 5 | extension UIViewController { 6 | func insideNavigationController() -> UINavigationController { 7 | let navigationController = UINavigationController(rootViewController: self) 8 | navigationController.modalPresentationStyle = .formSheet 9 | 10 | return navigationController 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import UIKit 4 | 5 | class DetailViewController: UIViewController {} 6 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/List/Cell/RepositoryCellViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import Foundation 4 | 5 | struct RepositoryCellViewConfiguration { 6 | var repositoryName: String 7 | var repositoryOwnerName: String 8 | } 9 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/List/ListViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import Foundation 4 | 5 | struct ListViewConfiguration { 6 | let listItems: [RepositoryCellViewConfiguration] 7 | } 8 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/Settings/Models/SettingsTitle.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import Foundation 4 | 5 | enum SettingsTitle { 6 | case appVersion 7 | 8 | var value: String { 9 | switch self { 10 | case .appVersion: return "App Version" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/Settings/SettingsInteractor.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import Foundation 4 | 5 | protocol LoadingPropertyInfo { 6 | func getAppVersion() -> SettingsViewModel 7 | } 8 | 9 | class SettingsInteractor: LoadingPropertyInfo { 10 | var bundleService: BundleService 11 | 12 | init(bundleService: BundleService) { 13 | self.bundleService = bundleService 14 | } 15 | 16 | func getAppVersion() -> SettingsViewModel { 17 | let version = self.bundleService.appVersion 18 | let viewModel = SettingsViewModel(title: .appVersion, items: ["Version " + version]) 19 | return viewModel 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Screens/Settings/SettingsViewModel.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import Foundation 4 | 5 | struct SettingsViewModel { 6 | let title: SettingsTitle 7 | let items: [String] 8 | 9 | init(title: SettingsTitle, items: [String]) { 10 | self.title = title 11 | self.items = items 12 | } 13 | 14 | var count: Int { 15 | return self.items.count 16 | } 17 | 18 | var titleForSection: String { 19 | return self.title.value 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Service/BundleService.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import Foundation 4 | 5 | protocol BundleService { 6 | var appVersion: String { get } 7 | } 8 | 9 | extension Bundle: BundleService { 10 | var appVersion: String { 11 | guard let result = infoDictionary?["CFBundleShortVersionString"] as? String else { return "" } 12 | return result 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Sources/OnboardingChallengeKit/Service/Service.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import Foundation 4 | 5 | protocol ServiceProtocol { 6 | func fetchList(_ completion: ([RepositoryCellViewConfiguration]) -> Void) 7 | } 8 | 9 | struct Service: ServiceProtocol { 10 | func fetchList(_ completion: ([RepositoryCellViewConfiguration]) -> Void) { 11 | completion([ 12 | RepositoryCellViewConfiguration(repositoryName: "hereminders-ios", repositoryOwnerName: "rdgborges"), 13 | RepositoryCellViewConfiguration(repositoryName: "hereminders-ios", repositoryOwnerName: "mateusnazarioc"), 14 | ]) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeKit/Tests/OnboardingChallengeKitTests/OnboardingChallengeKitTests.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import XCTest 4 | @testable import OnboardingChallengeKit 5 | 6 | final class OnboardingChallengeKitTests: XCTestCase {} 7 | -------------------------------------------------------------------------------- /solutions/devsprint-riccardo-1/OnboardingChallengeTests/OnboardingChallengeTests.swift: -------------------------------------------------------------------------------- 1 | // Copyright © 2021 DevPass. All rights reserved. 2 | 3 | import XCTest 4 | 5 | class OnboardingChallengeTests: XCTestCase { 6 | func testExample() throws { 7 | XCTSkip() 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp.xcodeproj/.project.pbxproj.swp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp.xcodeproj/.project.pbxproj.swp -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Pedro Francisco Tres on 17/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository: Codable { 11 | let id: Int 12 | let name, fullName: String 13 | let owner: Owner 14 | 15 | 16 | enum CodingKeys: String, CodingKey { 17 | case id 18 | case name 19 | case fullName = "full_name" 20 | case owner 21 | 22 | } 23 | } 24 | 25 | struct Owner: Codable { 26 | let login: String? 27 | let id: Int 28 | 29 | 30 | enum CodingKeys: String, CodingKey { 31 | case login, id 32 | 33 | } 34 | } 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/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-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Components/EmptyView/EmptyViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EmptyModel.swift 3 | // GitHubApp 4 | // 5 | // Created by Tania Mara Alves Ferreira on 21/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct EmptyViewConfiguration { 11 | let title: String 12 | let subtitle: String 13 | 14 | init(title: String, subtitle: String) { 15 | self.title = title 16 | self.subtitle = subtitle 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Components/LoadingView/LoadingViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingViewModel.swift 3 | // GitHubApp 4 | // 5 | // Created by Felipe Forcinetti on 18/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct LoadingViewConfiguration { 11 | let textLabel: String 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Components/RepositoryInfoView/RepositoryInfoViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoryInfoViewConfiguration.swift 3 | // GitHubApp 4 | // 5 | // Created by Pedro Francisco Tres on 27/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct RepositoryInfoViewConfiguration { 11 | var title: String 12 | var description: String 13 | var stars: Int 14 | var bifurcations: Int 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Components/ViewCode/ViewCode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewCode.swift 3 | // GitHubApp 4 | // 5 | // Created by Pedro Francisco Tres on 27/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol ViewCode { 11 | func configureSubViews() 12 | func configureSubviewsConstraints() 13 | func configureAdditionalBehaviors() 14 | } 15 | 16 | extension ViewCode { 17 | public func setupViews() { 18 | configureSubViews() 19 | configureSubviewsConstraints() 20 | configureAdditionalBehaviors() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/List/ListViewConfiguration.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListViewConfiguration.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | enum ListViewConfiguration { 11 | case loading 12 | case empty 13 | case list(_: [Repository]) 14 | } 15 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | init() { 13 | super.init(nibName: nil, bundle: nil) 14 | } 15 | 16 | required init?(coder: NSCoder) { 17 | fatalError("init(coder:) has not been implemented") 18 | } 19 | 20 | override func loadView() { 21 | self.view = SettingsView() 22 | } 23 | 24 | override func viewDidLoad() { 25 | super.viewDidLoad() 26 | title = "Settings" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubAppTests/RepositoryInfoUnitTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepositoryInfoUnitTests.swift 3 | // GitHubAppTests 4 | // 5 | // Created by Pedro Francisco Tres on 25/01/22. 6 | // 7 | 8 | import XCTest 9 | @testable import GitHubApp 10 | 11 | class RepositoryInfoUnitTests: XCTestCase { 12 | 13 | func testRepositoryInfo() throws { 14 | let repository = String.repositoryInfo(repositoriesCount: 1, bifurcationsCount: 2) 15 | XCTAssertEqual(repository, "1 stars 2 bifurcations") 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubAppTests/UIViewControllerUnitTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewControllerUnitTests.swift 3 | // GitHubAppTests 4 | // 5 | // Created by Pedro Francisco Tres on 23/01/22. 6 | // 7 | 8 | import XCTest 9 | @testable import GitHubApp 10 | 11 | class UIViewControllerUnitTests: XCTestCase { 12 | 13 | func testInsideNavigationController() throws { 14 | 15 | let viewController = UIViewController() 16 | 17 | let navigationController = viewController.insideNavigationController() 18 | 19 | XCTAssert(navigationController.viewControllers.first == viewController) 20 | XCTAssert(navigationController.modalPresentationStyle == .formSheet) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/EmptyViewSnapshotTests/testEmptyView.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/EmptyViewSnapshotTests/testEmptyView.1.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/LoadingViewSnapshotTests/testLoadingView.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/LoadingViewSnapshotTests/testLoadingView.1.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/RepositoryCellViewSnapshotTests/testRepositoyCellViewSnapshotTests.1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-1/GitHubAppTests/__Snapshots__/RepositoryCellViewSnapshotTests/testRepositoyCellViewSnapshotTests.1.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'GitHubApp' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for GitHubApp 9 | 10 | target 'GitHubAppTests' do 11 | inherit! :search_paths 12 | pod 'SnapshotTesting', '~> 1.9.0' 13 | end 14 | 15 | target 'GitHubAppUITests' do 16 | # Pods for testing 17 | end 18 | 19 | end 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-1/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SnapshotTesting (1.9.0) 3 | 4 | DEPENDENCIES: 5 | - SnapshotTesting (~> 1.9.0) 6 | 7 | SPEC REPOS: 8 | trunk: 9 | - SnapshotTesting 10 | 11 | SPEC CHECKSUMS: 12 | SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b 13 | 14 | PODFILE CHECKSUM: 5085947ac7c4264a9a5a6c2b2fbfda3346c146e7 15 | 16 | COCOAPODS: 1.11.2 17 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Extensions/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension String { 11 | 12 | static func repositoryInfo(repositoriesCount: Int, bifurcationsCount: Int) -> String { 13 | 14 | return "\(repositoriesCount) stars \(bifurcationsCount) bifurcations" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Extensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIColor { 11 | 12 | convenience init(red: Int, green: Int, blue: Int) { 13 | 14 | self.init(red: CGFloat(red)/255.0, 15 | green: CGFloat(green)/255.0, 16 | blue: CGFloat(blue)/255.0, 17 | alpha: 1) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Extensions/UITableViewCell+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableViewCell+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UITableViewCell { 11 | 12 | class func classIdentifier() -> String { 13 | guard let className = String(describing: self).components(separatedBy: ".").last else { 14 | return "" 15 | } 16 | 17 | return className 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Extensions/UIViewController+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Extensions.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 06/10/21. 6 | // 7 | 8 | import UIKit 9 | 10 | extension UIViewController { 11 | 12 | func insideNavigationController() -> UINavigationController { 13 | 14 | let navigationController = UINavigationController(rootViewController: self) 15 | navigationController.modalPresentationStyle = .formSheet 16 | 17 | return navigationController 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Models/Repository.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repository.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 14/01/22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Repository { 11 | let name: String 12 | 13 | } 14 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/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-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2-1.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 2.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 3.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 4.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy 5.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devpass-tech/challenge-github-app/d28661d92ee7c195e2af151a8686a2d0d81ae9b9/solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/AppIcon.appiconset/devpass-logo-blue copy.png -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Screens/Detail/DetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Screens/Detail/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class DetailViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = DetailView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Screens/Settings/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 07/01/22. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsView: UIView { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Screens/Settings/SettingsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsViewController.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 03/11/21. 6 | // 7 | 8 | import UIKit 9 | 10 | class SettingsViewController: UIViewController { 11 | 12 | override func loadView() { 13 | self.view = SettingsView() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solutions/devsprint-rodrigo-borges-2/GitHubApp/Service/Service.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Service.swift 3 | // GitHubApp 4 | // 5 | // Created by Rodrigo Borges on 30/09/21. 6 | // 7 | 8 | import Foundation 9 | 10 | struct Service { 11 | 12 | func fetchList(_ completion: ([String]) -> Void) { 13 | 14 | completion(["Repository 1", "Repository 2", "Repository 3"]) 15 | } 16 | } 17 | --------------------------------------------------------------------------------