GitHub iOS client with minimum third-party dependencies.

Overview

GitHubSearch

GitHub iOS client with minimum third-party dependencies. The app allows for searching for repositories using GitHub API.

🔜 In the next release will be possible to save info about repositories in local storage, so a user can see them offline.

Features

  • Each part of the screen modules was separated by its responsibilities into Assembly, Presenter, Router, Interactor, View, and ViewController.
  • Screen layout was done fully programmatically with Auto Layout and UICollectionViewCompositionalLayout.
  • All dependencies built in Dependency Container and injected as needed.
  • The networking layer uses Moya.
  • Navigation to screens uses custom routing mechanics.

Screenshots

GitHubSearchPreview

License

MIT License. See LICENSE.

Comments
  • Crash caused by delete operation of Realm

    Crash caused by delete operation of Realm

    Open a 'About repository' interface.

    1. Click the 'Favorite' button,
    2. then click the 'Unfavorite' button
    3. finally click the 'Favorite' button. The APP crashed.

    Reason: When you click the 'Unfavorite' button, the repository is delete from Realm

        func delete(_ object: Object) {
            // Deletes an object from the Realm. Once the object is deleted it is considered invalidated.
            write { $0.delete(object) }
        }
    

    Now, the repository is considered invalidated and can no longer be accessed.

    When finally click the 'Favorite' button, you access the deleted repository, so that APP crashed.

        @objc func favoriteButtonTapped() {
            if !viewModel.repository.isFavorite {  // crash
            ...
    
    bug good first issue 
    opened by yaoxp 1
  • Fix three issues

    Fix three issues

    1.https://github.com/Karambirov/GitHubSearch/issues/47 2.https://github.com/Karambirov/GitHubSearch/issues/43 3.https://github.com/Karambirov/GitHubSearch/issues/46

    feature 
    opened by 5SMNOONMS5 1
  • Separate Codable models from Realm

    Separate Codable models from Realm

    Codable and Realm objects should not be in the same class. It would be better if Realm object has convenience init with Codable object like so:

    class UserRealm: Object {
        // ...
        convenience init(with: User) { 
            // ...
        }
    }
    

    https://github.com/volkanbicer/RealmStore

    feature technical debt 
    opened by Karambirov 1
  • Create Searching Service

    Create Searching Service

    Maybe it worth it to create a service for searching instead of doing a search in VC.

    What needs to be done:

    feature technical debt 
    opened by Karambirov 1
  • Support analytics

    Support analytics

    https://www.lordcodes.com/articles/a-modular-analytics-layer-in-swift https://www.swiftbysundell.com/articles/building-an-enum-based-analytics-system-in-swift/

    feature 
    opened by Karambirov 0
  • Wrong navigation bar button title in Details

    Wrong navigation bar button title in Details

    If you try to open from Search a repository that already has been saved, navigation bar button title in Details will be "Favorite".

    • [x] While opening Details, check if the repository already saved.
    bug help wanted 
    opened by Karambirov 0
  • Favorites' table stays empty after fetching

    Favorites' table stays empty after fetching

    If a user taps "Favorite" in Details, the repository saves to the Realm file (it works correctly, the entry appears in Realm Browser). However, fetching in Favorites doesn't work – the table stays empty.

    • [x] Fix Favorites fetching
    bug help wanted 
    opened by Karambirov 0
  • Black screen after switching tabs

    Black screen after switching tabs

    Just after search's table view has been populated with data from a network everything works as expected. But if you decide to switch tab to Favorites and back, Search will be black (maybe it's been deallocated).

    • [x] Figure out what's wrong
    bug help wanted 
    opened by Karambirov 0
  • Handle errors

    Handle errors

    Right now all errors in the app are printed into the console. There should be correct error handling, not just printing.

    • [ ] Add Result type
    • [ ] Handle errors correctly.

    https://www.swiftbysundell.com/articles/providing-a-unified-swift-error-api/ https://www.swiftbysundell.com/basics/result/ https://www.swiftbysundell.com/articles/the-power-of-result-types-in-swift/ https://www.swiftbysundell.com/tips/result-type-convenience-apis/

    feature help wanted 
    opened by Karambirov 0
  • Add infinite scrolling

    Add infinite scrolling

    When a user reached the end of the search results a new request should be sent.

    • [ ] Show 25 results at a time (twice of what iPhone screen can show).
    • [ ] Send a new request when a user reached the end of the list. Or send the request after the first half of the results have been shown.
    feature help wanted 
    opened by Karambirov 0
  • Handle states of UI

    Handle states of UI

    UI must be user-friendly, so a user should be aware of loading, errors, absence of results.

    • [ ] Handle error state. Show a message that something went wrong.
    • [ ] Handle loading state. Show a spinner when trying to get results from a server.
    • [ ] Handle empty state. Show a label in the middle of the screen that there are no results.
    image feature help wanted 
    opened by Karambirov 0
  • Add Readme screen with Markdown rendering

    Add Readme screen with Markdown rendering

    From Details screen user should be able to open Readme screen.

    • [ ] Should be opened from Details.
    • [ ] Should be available without an Internet connection.
    • [ ] Markdown should be rendered like in a browser.
    feature help wanted 
    opened by Karambirov 0
Releases(v.2.0.0)
Owner
Eugene Karambirov
iOS developer at @aviasales
Eugene Karambirov
Create an iOS app with two views, MainViewController and DetailViewController

iOS Take Home Create an iOS app with two views, MainViewController and DetailViewController. The MainViewController contains a list of GIFs from the G

Jakub Towarek 0 Oct 25, 2021
Simple and integrated way to customize navigation bar experience on iOS app.

NavKit Simple and integrated way to customize navigation bar experience on iOS app. It should save our time that we usually use to make abstraction of

Wilbert Liu 37 Dec 7, 2022
Replicating the 'clear' navigation bar style of the iOS 12 Apple TV app.

TONavigationBar TONavigationBar is an open-source subclass of UINavigationBar that adds the ability to set the background content of the navigation ba

Tim Oliver 247 Dec 7, 2022
A lightweight iOS mini framework that enables programmatic navigation with SwiftUI, by using UIKit under the hood.

RouteLinkKit A lightweight iOS mini framework that enables programmatic navigation with SwiftUI. RouteLinkKit is fully compatible with native Navigati

Αθανάσιος Κεφαλάς 4 Feb 8, 2022
BulbapediaIOS - The home for Kiwix apps on iOS and macOS

Kiwix for iOS & macOS This is the home for Kiwix apps on iOS and macOS. Mobile a

null 0 Dec 30, 2021
Simple iOS app to showcase navigation with coordinators in SwiftUI + MVVM.

SimpleNavigation Simple iOS app to showcase the use of the Coordinator pattern using SwiftUI and MVVM. The implementation is as easy as calling a push

Erik Lopez 7 Dec 6, 2022
SimVirtualLocation - iOS simulator location mocking tool

SimVirtualLocation Easy to use MacOS 11+ application for easy mocking iOS device

Sergey Shirnin 45 Dec 9, 2022
iOS UI library to show and hide an extension to your UINavigationBar

ADNavigationBarExtension is a UI library written in Swift. It allows you to show and hide an extension to your UINavigationBar Features Use Extensible

FABERNOVEL 58 Aug 29, 2022
An easier way to handle third-party URL schemes in iOS apps.

IntentKit ========= IntentKit is an easier way to handle third-party URL schemes in iOS apps. Linking to third-party apps is essentially broken on iOS

null 1.8k Dec 24, 2022
Demonstrate a way to build your own line chart without using any third-party library

LineChart This code demonstrate a way to build your own line chart without using any third-party library. It contains a simple yet effective algorithm

Van Hung Nguyen 0 Oct 17, 2021
Integrate third party libraries by using Cocoapods and Swift Package Manager, store data in the cloud using Firebase Firestore.

Integrate third party libraries by using Cocoapods and Swift Package Manager, store data in the cloud using Firebase Firestore. Exercising query and s

WEI 0 Dec 19, 2021
CryptoExchange - A fully functional structure for Crypto Exchange app without using many third party assests

cryptoExchange A fully functional structure for Crypto Exchange app without usin

Shwait Kumar 0 Jan 6, 2022
A macOS menu bar app that enables system-wide navigation functionality for side buttons on third-party mice.

SaneSideButtons macOS mostly ignores the M4/M5 mouse buttons, commonly used for navigation. Third-party apps can bind them to ⌘+[ and ⌘+], but this on

Jan Hülsmann 121 Dec 23, 2022
Developed with use Swift language. As a third party library used SDWebImage. JSON parsing using URLSession with TMDB API. This app provide by the Core Data structure.

Capstone Project ?? About Developed with use Swift language. As a third party library used SDWebImage. JSON parsing using URLSession with TMDB API. Ad

Ensar Batuhan Unverdi 9 Aug 22, 2022
A slider, similar in style to UISlider, but which allows you to pick a minimum and maximum range.

TTRangeSlider A slider, similar in style to UISlider, but which allows you to pick a minimum and maximum range. Installation TTRangeSlider is availabl

Tom Thorpe 952 Dec 2, 2022
An Integer type that clamps its value to its minimum and maximum instead of over- or underflowing.

ClampedInteger An Integer type that clamps its value to its minimum and maximum instead of over- or underflowing. Examples let big = ClampedIntege

Berik Visschers 0 Jan 17, 2022
Github iOS Client based on Github REST V3 API and GraphQL V4 API

ZLGithubClient Github iOS 客户端 by Existorlive Objective-c 2.0 Swift 5 Cocoapods 1.9.1 iOS >= 11.0 基于 Github REST V3 API 和 Github GraphQL V4 API 开发的iOS客

朱猛 55 Dec 29, 2022
Third Prize for Uber Hackathon China 2016. Source code for iOS client of UberGuide Project.

Smart Traveller Intro It's the project we did for Uber Hackathon China 2016. This is the repo for iOS client. Using swift and Objective-C. The project

hACKbUSTER 266 Sep 9, 2022
GraphQL-GitHub-Reader - Simple sample project that demonstrates how to connect with GitHub's API using GraphQL + Apollo

GHPViewer A beatiful way to see your GitHub Profile Installation The project is splitted in two folders: GHPViewer: Contains the iOS Application relat

Andrés Pesate 1 Jan 2, 2022
Managing Pull Requests and Issues For GitHub & GitHub Enterprise

Trailer For maintained binaries and/or more info: Latest macOS version Latest iOS version Trailer CLI for Mac, Linux and Windows Trailer for Android N

Paul Tsochantaris 1.1k Dec 14, 2022