A small project to display the upcoming initial public offerings in USA Stock Exchanges. It has 2 Tabs, one for the list of IPO's and the second for the user Favourites IPO stocks.
Overal this project aims to demostrate many iOS app development techniques and features.
The providers of the financial data are:
- Finnhub provides the ipo lists and filings infomation
- Marketaux provides the financial news of stocks in the stocks market.
- Using
SwiftUI
Views, Modifiers and ViewBuilders. - Using States, Observables and Bindings
The project is seperated into different module to represent clean architecture and SOLID principles
MarketDropsCore
contains app wide common functionalitiesMarketDropsRouting
layer handles navigation and deeplinking, where previously in UIKit it would be referred as the Coordinator.MarketDropsAPIClient
has the API client requests (i.e Finnhub and Marketaux) and their EntitiesMarketDropsDomain
layer represents the Domain use cases of each entityMarketDrops
is the main application target which contains the Presentation and Data Layer
- All modules are tested with unit tests and the project had code coverage enabled.
Should errors occur when using the financial API's, users will be notified with an Alert
.
The supported deeplinks are as follows:
applink:///ipo
applink:///ipo?symbol=BIAF&date=2022-08-30&status=expected
applink:///favourites
- Most API's and developed using
Combine
Images loaded for financial news are cached and reused
The persistence mechanism used is UserDefaults
, other options could have been Core Data
or File Manager
but since we only needed to store symbols. UserDefaults was simple enough.
The project uses Localizable strings, but currently only for English language.
Colors
support Light
and Dark
mode.
Haptics
feedbacks are embeded in NavigationBar items and List items.
When a user still hasn't selected a favourite stock, they are presented with an Empty state
prompting them to select their favourite stock.
The app design pattern and infrastructure is inspired by Pointfree, it follows The Composible Architecture Design where screens are driven by a reducer that uses State
, Action
and Environment