feat: TIApplication module and other fixes and improvements #13

Merged
ivan.smolin merged 3 commits from feature/ti_application into master 2023-09-06 11:31:37 +03:00
Member

Пример использования CoreDependencies:

open class CommonDependencies {
    public let networkService: ProjectNetworkService
    public let storages: AppStorages

    public let userService: UserService
    public let mapService: MapItemsService
    public let fuelingService: FuelingService

    public let userLocationFetcher: UserLocationFetcher

    public init(coreDependencies: CoreDependencies) {
        let userAgent = "TouchinProject/iOS/\(coreDependencies.device.model)/\(coreDependencies.device.systemVersion)"

        networkService = ProjectNetworkService(jsonCodingConfigurator: coreDependencies.jsonCodingConfigurator,
                                               userAgent: userAgent)
        networkService.callbackQueue = coreDependencies.networkCallbackQueue

        storages = AppStorages(coreDependencies: coreDependencies)

        userService = UserService(networkService: networkService,
                                  sessionIdStorage: storages.sessionIdStorage,
                                  device: coreDependencies.device,
                                  bundle: coreDependencies.bundle)

        mapService = MapItemsService(networkService: networkService,
                                     jsonCodingConfigurator: coreDependencies.jsonCodingConfigurator,
                                     appGroupCacheDirectory: coreDependencies.appGroupCacheDirectory)

        fuelingService = FuelingService(networkService: networkService,
                                        fuelingSessionStorage: storages.fuelingSessionStorage)

        let locationManager = CLLocationManager()
        locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters

        userLocationFetcher = UserLocationFetcher(locationManager: locationManager,
                                                  accuracyRequest: .fullAccuracy(purposeKey: "NearItemRequest"))
    }
}

Наследование CoreDependencies и реализация TargetDependencies в TodayExtension

final class TodayWidgetDependencies: CommonDependencies, TargetDependencies {
    // MARK: - Dependencies

    static func assemble() -> TodayWidgetDependencies {
        TodayWidgetDependencies(coreDependencies: CoreDependencies(bundleIdentifierPrefix: "touchin.project",
                                                                   appIdentifier: "app.today-extension"))
    }

    static func assembleForPreview() -> TodayWidgetDependencies {
        assemble()
    }
}

Наследование CoreDependencies и реализация TargetDependencies в основном приложении

final class AppDependencies: CommonDependencies, TargetDependencies {
    // MARK: - Dependencies

    static func assemble() -> AppDependencies {
        AppDependencies(coreDependencies: CoreDependencies(bundleIdentifierPrefix: "touchin.project",
                                                           appIdentifier: "app"))
    }

    static func assembleForPreview() -> AppDependencies {
        assemble()
    }
}

Пример использования AppDependencies в Preview

@available(iOS 13.0.0, *)
struct MyPreviewProvider_Previews: PreviewProvider {
    static var previews: some View {
        let dependencies = AppDependencies.assembleForPreview()
        let presenter = StationInfoViewPresenter(fuelingStation: .defaultFuelingStation,
                                                 fuelingService: dependencies.fuelingService,
                                                 alertFactory: dependencies.alertFactory,
                                                 errorFormatter: dependencies.errorFormatter)
        let viewController = presenter.createViewController()
        return viewController.showPreview()
    }
}

Пример использования в TodayExtension

@objc(TodayWidgetController)
final class TodayWidgetController: BaseCustomViewController<TodayWidgetView>, NCWidgetProviding {
    private let presenter = TodayWidgetPresenter(dependencies: TodayWidgetDependencies.assemble())

    override func viewDidLoad() {
        super.viewDidLoad()

        presenter.view = customView

        presenter.viewDidLoad()
    }
}

Пример использования DefaultHomogeneousItemsCollectionView

final class TraitsCollectionView: DefaultHomogeneousItemsCollectionView<FuelingStationTraitView> {
    override func createLayout() -> UICollectionViewLayout {
        let layout = UICollectionViewLeftAlignedLayout()

        layout.minimumInteritemSpacing = 8
        layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

        return layout
    }
}

@MainActor
struct StationInfoTableBuilder {
    typealias TraitsRow = TraitsCollectionView.InCollectionTableCell.TableRow

    static func buildMainSection(dataSource: FuelingStationInfoViewPresenter) -> TableSection {
        TableSection(onlyRows: [
            TraitsRow(item: DefaultCollectionViewModel(items: dataSource.traits))
                .with(appearance: Self.traitsAppearance)
        ])
    }

    static var traitsAppearance: TraitsRow.Appearance {
        .make {
            $0.subviewAppearance {
                $0.layout.insets = UIEdgeInsets(top: 6, left: 16, bottom: 14, right: 16)

                $0.subviewAppearance {
                    $0.leadingViewAppearance {
                        $0.layout {
                            $0.size = CGSize(width: 12, height: 12)
                            $0.centerOffset = .centerVertical()
                        }
                    }

                    $0.middleViewAppearance.layout.insets.left = 4
                }
            }
        }
    }
}

## Пример использования CoreDependencies: ```swift open class CommonDependencies { public let networkService: ProjectNetworkService public let storages: AppStorages public let userService: UserService public let mapService: MapItemsService public let fuelingService: FuelingService public let userLocationFetcher: UserLocationFetcher public init(coreDependencies: CoreDependencies) { let userAgent = "TouchinProject/iOS/\(coreDependencies.device.model)/\(coreDependencies.device.systemVersion)" networkService = ProjectNetworkService(jsonCodingConfigurator: coreDependencies.jsonCodingConfigurator, userAgent: userAgent) networkService.callbackQueue = coreDependencies.networkCallbackQueue storages = AppStorages(coreDependencies: coreDependencies) userService = UserService(networkService: networkService, sessionIdStorage: storages.sessionIdStorage, device: coreDependencies.device, bundle: coreDependencies.bundle) mapService = MapItemsService(networkService: networkService, jsonCodingConfigurator: coreDependencies.jsonCodingConfigurator, appGroupCacheDirectory: coreDependencies.appGroupCacheDirectory) fuelingService = FuelingService(networkService: networkService, fuelingSessionStorage: storages.fuelingSessionStorage) let locationManager = CLLocationManager() locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters userLocationFetcher = UserLocationFetcher(locationManager: locationManager, accuracyRequest: .fullAccuracy(purposeKey: "NearItemRequest")) } } ``` ### Наследование CoreDependencies и реализация TargetDependencies в TodayExtension ```swift final class TodayWidgetDependencies: CommonDependencies, TargetDependencies { // MARK: - Dependencies static func assemble() -> TodayWidgetDependencies { TodayWidgetDependencies(coreDependencies: CoreDependencies(bundleIdentifierPrefix: "touchin.project", appIdentifier: "app.today-extension")) } static func assembleForPreview() -> TodayWidgetDependencies { assemble() } } ``` ### Наследование CoreDependencies и реализация TargetDependencies в основном приложении ```swift final class AppDependencies: CommonDependencies, TargetDependencies { // MARK: - Dependencies static func assemble() -> AppDependencies { AppDependencies(coreDependencies: CoreDependencies(bundleIdentifierPrefix: "touchin.project", appIdentifier: "app")) } static func assembleForPreview() -> AppDependencies { assemble() } } ``` ### Пример использования AppDependencies в Preview ```swift @available(iOS 13.0.0, *) struct MyPreviewProvider_Previews: PreviewProvider { static var previews: some View { let dependencies = AppDependencies.assembleForPreview() let presenter = StationInfoViewPresenter(fuelingStation: .defaultFuelingStation, fuelingService: dependencies.fuelingService, alertFactory: dependencies.alertFactory, errorFormatter: dependencies.errorFormatter) let viewController = presenter.createViewController() return viewController.showPreview() } } ``` ### Пример использования в TodayExtension ```swift @objc(TodayWidgetController) final class TodayWidgetController: BaseCustomViewController<TodayWidgetView>, NCWidgetProviding { private let presenter = TodayWidgetPresenter(dependencies: TodayWidgetDependencies.assemble()) override func viewDidLoad() { super.viewDidLoad() presenter.view = customView presenter.viewDidLoad() } } ``` ## Пример использования DefaultHomogeneousItemsCollectionView ```swift final class TraitsCollectionView: DefaultHomogeneousItemsCollectionView<FuelingStationTraitView> { override func createLayout() -> UICollectionViewLayout { let layout = UICollectionViewLeftAlignedLayout() layout.minimumInteritemSpacing = 8 layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize return layout } } @MainActor struct StationInfoTableBuilder { typealias TraitsRow = TraitsCollectionView.InCollectionTableCell.TableRow static func buildMainSection(dataSource: FuelingStationInfoViewPresenter) -> TableSection { TableSection(onlyRows: [ TraitsRow(item: DefaultCollectionViewModel(items: dataSource.traits)) .with(appearance: Self.traitsAppearance) ]) } static var traitsAppearance: TraitsRow.Appearance { .make { $0.subviewAppearance { $0.layout.insets = UIEdgeInsets(top: 6, left: 16, bottom: 14, right: 16) $0.subviewAppearance { $0.leadingViewAppearance { $0.layout { $0.size = CGSize(width: 12, height: 12) $0.centerOffset = .centerVertical() } } $0.middleViewAppearance.layout.insets.left = 4 } } } } } ``` ![](https://github.com/TouchInstinct/LeadKit/assets/6436245/09c48ffe-993b-4199-b925-8c33228a61cc)
ivan.smolin added 1 commit 2023-08-24 12:07:53 +03:00
vladimir.makarov reviewed 2023-09-05 13:16:36 +03:00
@ -27,2 +27,3 @@
open class SingleValueAuthKeychainStorage<ValueType>: BaseSingleValueKeychainStorage<ValueType> {
open class SingleValueAuthKeychainStorage<ValueType>: AppInstallLifetimeSingleValueStorage<
BaseSingleValueKeychainStorage<ValueType>,

Минор, но тут что-то поплыло, кажется

Минор, но тут что-то поплыло, кажется
Author
Member

попробовал сделать перенос иначе

попробовал сделать перенос иначе
vladimir.makarov marked this conversation as resolved
@ -0,0 +23,4 @@
import TIUIKitCore
import UIKit
open class BaseInitializeableStackView: UIStackView, InitializableViewProtocol {

Вроде бы, обсуждали, что e убираем из InitializEable и используем Initializable

Вроде бы, обсуждали, что `e` убираем из Initializ`E`able и используем `Initializable`
vladimir.makarov marked this conversation as resolved
@ -0,0 +76,4 @@
}
switch cell {
case let configureableCell as CellType:

configurable?

`configurable`?
vladimir.makarov marked this conversation as resolved
@ -117,6 +129,10 @@ open class BaseListItemView<LeadingView: UIView,
leadingView.isHidden
}
open var isMiddleViewHidded: Bool {

hidden

`hidden`
vladimir.makarov marked this conversation as resolved
@ -50,3 +50,2 @@
public var isLoading = false {
didSet {
private var backedIsLoading = false

А что такое backed?

А что такое `backed`?
Author
Member
типа backing storage (https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties/#Stored-Properties-and-Instance-Variables)
vladimir.makarov marked this conversation as resolved
@ -104,0 +105,4 @@
// MARK: - AppearanceConfigurable
extension ContainerCollectionViewCell: AppearanceConfigurable where View: AppearanceConfigurable,
View.Appearance: WrappedViewAppearance {

Тоже поехало немного

Тоже поехало немного
vladimir.makarov marked this conversation as resolved
ivan.smolin added 1 commit 2023-09-05 16:49:12 +03:00
vladimir.makarov approved these changes 2023-09-06 09:37:46 +03:00
ivan.smolin merged commit 93b0f61b00 into master 2023-09-06 11:31:37 +03:00
ivan.smolin deleted branch feature/ti_application 2023-09-06 11:31:38 +03:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: TouchInstinct/LeadKit#13
No description provided.