Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 106 additions & 44 deletions App/Course App.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 16 additions & 2 deletions App/Course App/App/AppCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
//

import Combine
import DependencyInjection
import DesignSystem
import UIKit

final class AppCoordinator: ObservableObject, ViewControllerCoordinator, CancellablesContaining {
Expand All @@ -18,23 +20,35 @@ final class AppCoordinator: ObservableObject, ViewControllerCoordinator, Cancell
}
}()


// MARK: Public properties
var cancellables = Set<AnyCancellable>()
var childCoordinators = [Coordinator]()
var container = Container()
@Published var isSignedIn = false
}

// MARK: - Start coordinator
extension AppCoordinator {
func start() {
setupAppUI()
assembleDependencyInjectionRegistration()
}
}

// MARK: - Dependency injection registration
private extension AppCoordinator {
func assembleDependencyInjectionRegistration() {
ManagerRegistration.registerDependencies(to: container)
ServiceRegistration.registerDependecies(to: container)
StoreRegistration.registerDependencies(to: container)
}
}

// MARK: - Factory Methods
private extension AppCoordinator {
func makeTabBarFlow() -> ViewControllerCoordinator {
let mainTabBarCoordinator = MainTabBarCoordinator()
let mainTabBarCoordinator = MainTabBarCoordinator(container: container)
startChildCoordinator(mainTabBarCoordinator)
mainTabBarCoordinator.eventPublisher.sink { [weak self] event in
self?.handle(event)
Expand All @@ -44,7 +58,7 @@ private extension AppCoordinator {
}

func makeSignInFlow() -> ViewControllerCoordinator {
let signInCoordinator = SignInNavigationCoordinator()
let signInCoordinator = SignInNavigationCoordinator(container: container)
startChildCoordinator(signInCoordinator)
signInCoordinator.eventPublisher.sink { [weak self] event in
self?.handle(event)
Expand Down
2 changes: 2 additions & 0 deletions App/Course App/Common/Navigation/Coordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
// Created by Tomáš Duchoslav on 30.05.2024.
//

import DependencyInjection
import Foundation

protocol Coordinator: AnyObject, DeeplinkHandling {
var childCoordinators: [Coordinator] { get set }
var container: Container { get }
func start()
}

Expand Down
17 changes: 17 additions & 0 deletions App/Course App/Common/Protocols/Store.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// Store.swift
// Course App
//
// Created by Tomáš Duchoslav on 14.06.2024.
//

import Foundation

protocol Store {
associatedtype State
associatedtype Action

@MainActor var viewState: State { get }

@MainActor func send(action: Action)
}
37 changes: 37 additions & 0 deletions App/Course App/DIRegistration/ManagerRegistration.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//
// ManagerRegistration.swift
// Course App
//
// Created by Tomáš Duchoslav on 14.06.2024.
//

import DependencyInjection
import Foundation

enum ManagerRegistration {
static func registerDependencies(to container: Container) {
container.autoregister(
type: StorageManaging.self,
in: .shared,
initializer: StorageManager.init
)

container.autoregister(
type: KeychainManaging.self,
in: .shared,
initializer: KeychainManager.init
)

container.autoregister(
type: APIManaging.self,
in: .shared,
initializer: APIManager.init
)

container.autoregister(
type: FirebaseAuthManaging.self,
in: .shared,
initializer: FirebaseAuthManager.init
)
}
}
25 changes: 25 additions & 0 deletions App/Course App/DIRegistration/ServiceRegistration.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// ServiceRegistration.swift
// Course App
//
// Created by Tomáš Duchoslav on 14.06.2024.
//

import DependencyInjection
import Foundation

enum ServiceRegistration {
static func registerDependecies(to container: Container) {
container.autoregister(
type: KeychainServicing.self,
in: .shared,
initializer: KeychainService.init
)

container.autoregister(
type: JokeServicing.self,
in: .shared,
initializer: JokeService.init
)
}
}
25 changes: 25 additions & 0 deletions App/Course App/DIRegistration/StoreRegistration.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// StoreRegistration.swift
// Course App
//
// Created by Tomáš Duchoslav on 15.06.2024.
//

import DependencyInjection
import Foundation

enum StoreRegistration {
static func registerDependencies(to container: Container) {
container.autoregister(
type: SwipingViewStore.self,
in: .new,
initializer: SwipingViewStore.init
)

container.autoregister(
type: SignInViewStore.self,
in: .new,
initializer: SignInViewStore.init
)
}
}
2 changes: 1 addition & 1 deletion App/Course App/Networking/Storage/StorageManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ final class StorageManager: StorageManaging {
}
}

func liked(jokeId: String) async throws -> Bool {
func loadLiked(jokeId: String) async throws -> Bool {
let docRef = database.collection("jokesLikes").document(jokeId)
do {
let document = try await docRef.getDocument()
Expand Down
1 change: 1 addition & 0 deletions App/Course App/Networking/Storage/StorageManaging.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ import Foundation

protocol StorageManaging {
func storeLike(jokeId: String, liked: Bool) async throws
func loadLiked(jokeId: String) async throws -> Bool
}
3 changes: 2 additions & 1 deletion App/Course App/Scenes/Home/HomeViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
//

import Combine
import DesignSystem
import os
import SwiftUI
import UIKit
Expand Down Expand Up @@ -109,7 +110,7 @@ extension HomeViewController {

for sectionIndex in dataProvider.data.indices {
for jokeIndex in dataProvider.data[sectionIndex].jokes.indices {
let isLiked = try await storage.liked(jokeId: dataProvider.data[sectionIndex].jokes[jokeIndex].jokeID)
let isLiked = try await storage.loadLiked(jokeId: dataProvider.data[sectionIndex].jokes[jokeIndex].jokeID)
dataProvider.data[sectionIndex].jokes[jokeIndex].isLiked = isLiked
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
//

import Combine
import DependencyInjection
import os
import SwiftUI
import UIKit

final class HomeNavigationCoordinator: NavigationControllerCoordinator, CancellablesContaining, SwipingViewFactory {
final class HomeNavigationCoordinator: NavigationControllerCoordinator, CancellablesContaining, SwipingViewCoordinating {
// MARK: Private properties
private(set) lazy var navigationController: UINavigationController = CustomNavigationController()
private let logger = Logger()
Expand All @@ -18,10 +20,16 @@ final class HomeNavigationCoordinator: NavigationControllerCoordinator, Cancella
// MARK: Public properties
var childCoordinators = [Coordinator]()
var cancellables = Set<AnyCancellable>()
var container: Container

// MARK: Lifecycle
deinit {
logger.info("Deinit HomeNavigationCoordinator")
}

init(container: Container) {
self.container = container
}
}

// MARK: - EventEmitting
Expand Down Expand Up @@ -51,12 +59,12 @@ private extension HomeNavigationCoordinator {
}

// MARK: - Handling events
private extension HomeNavigationCoordinator {
extension HomeNavigationCoordinator {
func handle(_ event: HomeViewEvent) {
switch event {
case let .itemTapped(joke):
logger.info("Joke on home screen was tapped \(joke.text)")
navigationController.pushViewController(makeSwipingView(with: joke), animated: true)
navigationController.pushViewController(makeSwipingView(with: joke, isChildCoordinator: true), animated: true)
}
}
}
12 changes: 9 additions & 3 deletions App/Course App/Scenes/Navigation/MainTabBarCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
//

import Combine
import DependencyInjection
import os
import SwiftUI
import UIKit
Expand All @@ -19,11 +20,16 @@ final class MainTabBarCoordinator: NSObject, TabBarControllerCoordinator, Cancel
// MARK: Public Properties
var cancellables = Set<AnyCancellable>()
var childCoordinators = [Coordinator]()
var container: Container

// MARK: Lifecycle
deinit {
logger.info("Deinit MainTabBarCoordinator")
}

init(container: Container) {
self.container = container
}
}

// MARK: - Start the coordinator
Expand Down Expand Up @@ -68,7 +74,7 @@ private extension MainTabBarCoordinator {
}

func makeHomeFlow() -> ViewControllerCoordinator {
let homeViewCoordinator = HomeNavigationCoordinator()
let homeViewCoordinator = HomeNavigationCoordinator(container: container)
startChildCoordinator(homeViewCoordinator)
homeViewCoordinator.rootViewController.tabBarItem = UITabBarItem(
title: "Categories",
Expand All @@ -79,14 +85,14 @@ private extension MainTabBarCoordinator {
}

func makeSwipingFlow() -> ViewControllerCoordinator {
let swipingNavigationCoordinator = SwipingViewNavigationCoordinator()
let swipingNavigationCoordinator = SwipingViewNavigationCoordinator(container: container)
startChildCoordinator(swipingNavigationCoordinator)
swipingNavigationCoordinator.rootViewController.tabBarItem = UITabBarItem(title: "Random", image: UIImage(systemName: "switch.2"), tag: 1)
return swipingNavigationCoordinator
}

func makeProfileFlow() -> ViewControllerCoordinator {
let profileNavigationCoordinator = ProfileNavigationCoordinator()
let profileNavigationCoordinator = ProfileNavigationCoordinator(container: container)
startChildCoordinator(profileNavigationCoordinator)
profileNavigationCoordinator.eventPublisher.sink { [weak self] event in
self?.handle(event)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ protocol OnboardingCoordinatorPresenting {

extension OnboardingCoordinatorPresenting where Self: Coordinator, Self: CancellablesContaining, Self: UINavigationControllerDelegate {
func makeOnboardingFlow(navigationController: UINavigationController? = nil) -> ViewControllerCoordinator {
let coordinator = OnboardingNavigationCoordinator(navigationController: navigationController)
let coordinator = OnboardingNavigationCoordinator(container: container, navigationController: navigationController)
startChildCoordinator(coordinator)

if navigationController != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
//

import Combine
import DependencyInjection
import os
import SwiftUI
import UIKit
Expand All @@ -20,12 +21,14 @@ final class OnboardingNavigationCoordinator: NavigationControllerCoordinator, Ca
// MARK: Public properties
var cancellables = Set<AnyCancellable>()
var childCoordinators = [Coordinator]()
var container: Container

deinit {
logger.info("Deinit OnboardingNavigationCoordinator")
}

init(navigationController: UINavigationController? = nil) {
init(container: Container, navigationController: UINavigationController? = nil) {
self.container = container
if let navigationController {
isPushNavigation = true
self.navigationController = navigationController
Expand Down
1 change: 1 addition & 0 deletions App/Course App/Scenes/Onboarding/OnboardingView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
//

import Combine
import DesignSystem
import SwiftUI

struct OnboardingView: View {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
//

import Combine
import DependencyInjection
import os
import SwiftUI
import UIKit
Expand All @@ -19,11 +20,16 @@ final class ProfileNavigationCoordinator: NSObject, NavigationControllerCoordina
// MARK: Public properties
var cancellables = Set<AnyCancellable>()
var childCoordinators = [Coordinator]()
var container: Container

// MARK: Lifecycle
deinit {
logger.info("Deinit ProfileNavigationCoordinator")
}

init(container: Container) {
self.container = container
}
}

// MARK: - Start coordinator
Expand Down
Loading