Skip to content

canhth/Github-DirectMessage

Repository files navigation

A simple GitHub Direct Messaging app.

Scenario

An iOS team with 5 members. Long term project, with both development and maintenance being handled within the team. Design the app and as the tech lead, implement the main fundamental functionalities.

How to run the app

Open Messenger/Messenger.xcodeproj, and Run (Cmd + R).

Technical notes

  • Show a list of users retrieved from GitHub.
  • Handle rate limit case.
  • Pull to refresh list users.
  • Paging loading.
  • Support landscape and portrait.
  • Images caching.
  • Direct messaging screen functionalities.
  • UI improved.
  • Storing messages for each user.
  • Following VIPER architechture.
  • UnitTests.
  • Swiftlint for coding styles & clean code.
  • Support fastlane. Run fastlane scan in Xcode project directory.
  • Prepared to support multi environments (dev and prod).

Project structures

Messenger
├── Resources
├── Models
├── Modules
├── Core
│  └── Image
│  └── Persistence
│  └── Helper
|  └── Extensions
|  └── Networking
│  └── BaseVIPER
|     └── Presenter
|     └── Router
|     └── View

MessengerTests

VIPER

VIPER is a very clean architecture. It isolates each module from others. So changing or fixing bugs are very easy as you only have to update a specific module. Also for having modular approach VIPER creates a very good environment for unit testing.

Other Key Advantages of VIPER Architecture:
  • Good for large teams.
  • Makes it scalable. Enable developers to simultaneously work on it as seamlessly as possible.
  • Makes it easy to add new features.
  • Makes it easy to write automated tests since your UI logic is separated from the business logic.
  • Makes it easier to track issues via crash reports due to the Single Responsibility Principle.
  • Makes the source code cleaner, more compact, and reusable.
  • Reduces the number of conflicts within the development team.
  • Applies SOLID principles.
  • Reduces the number of merge conflicts.

VIPER Template

I created a VIPER Xcode template to make the work easier, reduce time for create new files and repeate the same code per module.

Installation Instruction

To create new module: Create new Group as your module name ---> Add new File --> Scroll down to select VIPER template --> type your module name.

BaseNetworking

A very lightweight URLSession wrapper to work with REST APIs. Easy to use and flexible with diffirent endpoints, methods.

networkClient.fetch(endPoint: ListUsersEndpoint.fetchListUser(lastId: lastId), type: [User].self) { (result) in
            switch result {
            case .success(let users):
                print("Fetched list users: \(users)")
            case .failure(let error):
                print("Error: \(error)")
            }
        }

TestCases

Add test cases for each modules or base components to make sure we won't break it after changes. Can run fastlane scan [x] PersistenceTests. [x] ImagesCacheTests. [x] ListUsersTests. [x] DirectMessagesTests. [x] Support Mockable test or load data from local JSON.

Things to improve

  1. Intergrate CI/CD with this repo, to double check every commit/PR pass the test cases.
  2. Separate Chat sessions by date. And store it with CoreData/Realm, not UserDefault like current approach.
  3. Add UI tests.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published