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
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//
// FeatureImplement.swift
// EnvironmentPlugin
//
// Created by gnksbm on 7/12/25.
//

// TODO: Featuer 객체가 필요하지 않을 때 Feature로 네이밍 변경될 예정
public struct FeatureImplement: ImplementTarget {
public let name: String
public let hasResource: Bool
public let dependencies: [TargetDependency]

public let product: Product = .staticFramework
public let infoPlist: InfoPlist?
public let settings: Settings = .frameworkDebug
public let scripts: [TargetScript]
public var sources: SourceFilesList? { ["Implement/Sources/**"] }
public var resources: ResourceFileElements? { hasResource ? ["Implement/Resources/**"] : nil }
public var targetDependencyPath: Path {
.relativeToRoot("Projects/Feature/\(name)")
}

public init(
name: String,
hasResource: Bool = false,
@TargetComponentBuilder dependencies builder: () -> TargetComponentBuilder = { .init() }
) {
let builder = builder()
self.name = name
self.hasResource = hasResource
self.dependencies = builder.buildTargetDependency()
self.scripts = builder.buildTargetScript()
self.infoPlist = builder.buildInfoPlist()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// FeatureInterface.swift
// EnvironmentPlugin
//
// Created by gnksbm on 7/12/25.
//

public struct FeatureInterface: BundleIDSuffixTarget, LocalDependency {
public var projectName: String
public let dependencies: [TargetDependency]
public let infoPlist: InfoPlist?
public let scripts: [TargetScript]

public var name: String { projectName + "Interface" }
public var product: Product { .framework }
public var sources: SourceFilesList? { ["Interface/Sources/**"] }
public var targetDependencyPath: Path {
.relativeToRoot("Projects/Feature/\(projectName)")
}

public init(
name: String,
@TargetComponentBuilder dependencies builder: () -> TargetComponentBuilder = { .init() }
) {
let builder = builder()
self.projectName = name
self.dependencies = builder.buildTargetDependency()
self.scripts = builder.buildTargetScript()
self.infoPlist = builder.buildInfoPlist()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//
// FeatureTesting.swift
// EnvironmentPlugin
//
// Created by gnksbm on 7/19/25.
//

import Foundation

public struct FeatureTesting: BundleIDSuffixTarget, LocalDependency {
public var projectName: String
public let dependencies: [TargetDependency]
public let infoPlist: InfoPlist?
public let scripts: [TargetScript]

public var name: String { projectName + "Testing" }
public var product: Product { .framework }
public var sources: SourceFilesList? { ["Testing/Sources/**"] }
public var targetDependencyPath: Path {
.relativeToRoot("Projects/Feature/\(projectName)")
}

public init(
name: String,
@TargetComponentBuilder dependencies builder: () -> TargetComponentBuilder = { .init() }
) {
let builder = builder()
self.projectName = name
self.dependencies = builder.buildTargetDependency()
self.scripts = builder.buildTargetScript()
self.infoPlist = builder.buildInfoPlist()
}
}
8 changes: 6 additions & 2 deletions Projects/App/Sources/Coordinator/AppCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ final class AppCoordinator: Coordinator {
var parent: Coordinator?
var childs: [Coordinator] = []
var navigationController: UINavigationController
public var coordinatorType: CoordinatorType = .app

private let coordinatorProvider = DefaultCoordinatorProvider()
private let dependency: AppCoordinatorDependency

Expand All @@ -40,6 +40,7 @@ final class AppCoordinator: Coordinator {
parent: self,
navigationController: navigationController,
coordinatorProvider: coordinatorProvider,
homeCoordinatorBuilder: coordinatorProvider,
viewModelDependency: dependency
)
childs.append(splashCoordinator)
Expand All @@ -52,7 +53,10 @@ final class AppCoordinator: Coordinator {
navigationController: navigationController,
busStopId: busStopId,
coordinatorProvider: coordinatorProvider,
flow: .fromHome
flow: .fromHome,
nearMapCoordinatorBuilder: coordinatorProvider,
addRegularAlarmCoordinatorBuilder: coordinatorProvider,
delegate: nil
)
childs.append(busStopCoordinator)
busStopCoordinator.start()
Expand Down
10 changes: 7 additions & 3 deletions Projects/App/Sources/Coordinator/Splash/SplashCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,32 @@ import UIKit

import MainFeature
import FeatureDependency
import HomeFeatureInterface

protocol SplashCoordinator: Coordinator {
func startTabFlow()
func openURL(_ url: URL)
}

final class SplashCoordinatorImpl: SplashCoordinator {
var parent: Coordinator?
var childs: [Coordinator] = []
var navigationController: UINavigationController
public var coordinatorType: CoordinatorType = .splash

private let coordinatorProvider: CoordinatorProvider
private let homeCoordinatorBuilder: HomeCoordinatorBuilder
private let viewModelDependency: SplashViewModelDependency

init(
parent: Coordinator,
navigationController: UINavigationController,
coordinatorProvider: CoordinatorProvider,
homeCoordinatorBuilder: HomeCoordinatorBuilder,
viewModelDependency: SplashViewModelDependency
) {
self.parent = parent
self.navigationController = navigationController
self.coordinatorProvider = coordinatorProvider
self.homeCoordinatorBuilder = homeCoordinatorBuilder
self.viewModelDependency = viewModelDependency
}

Expand All @@ -46,7 +49,8 @@ final class SplashCoordinatorImpl: SplashCoordinator {
func startTabFlow() {
let tabBarCoordinator = TabBarCoordinator(
navigationController: navigationController,
coordinatorProvider: coordinatorProvider
coordinatorProvider: coordinatorProvider,
homeCoordinatorBuilder: homeCoordinatorBuilder
)
childs.append(tabBarCoordinator)
tabBarCoordinator.start()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ final class SplashViewController: UIViewController {
output.alert
.observe(on: MainScheduler.instance)
.bind(with: self) { owner, alert in
guard !alert.actions.isEmpty else { return }
let alertController = UIAlertController(
title: alert.title,
message: alert.message,
Expand Down
60 changes: 41 additions & 19 deletions Projects/App/Sources/DefaultCoordinatorProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,44 +14,43 @@ import SearchFeature
import AlarmFeature
import BusStopFeature
import NearMapFeature
import NearMapFeatureInterface
import HomeFeatureInterface
import AlarmFeatureInterface
import Domain

final class DefaultCoordinatorProvider: CoordinatorProvider {
func makeHomeCoordinator(
parent: Coordinator,
navigationController: UINavigationController
) -> HomeCoordinator {
DefaultHomeCoordinator(
parent: parent,
navigationController: navigationController,
coordinatorProvider: self
)
}

func makeBusStopCoordinator(
parent: Coordinator,
navigationController: UINavigationController,
busStopId: String,
flow: FlowState
flow: FlowState,
delegate: BusStopCoordinatorDelegate?
) -> BusStopCoordinator {
DefaultBusStopCoordinator(
parent: parent,
navigationController: navigationController,
busStopId: busStopId,
coordinatorProvider: self,
flow: flow
flow: flow,
nearMapCoordinatorBuilder: self,
addRegularAlarmCoordinatorBuilder: self,
delegate: delegate
)
}

func makeSearchCoordinator(
parent: Coordinator,
navigationController: UINavigationController,
flow: FlowState
flow: FlowState,
busStopCoordinatorDelegate: BusStopCoordinatorDelegate?
) -> SearchCoordinator {
DefaultSearchCoordinator(
parent: parent,
navigationController: navigationController,
coordinatorProvider: self,
nearMapCoordinatorBuilder: self,
busStopCoordinatorDelegate: busStopCoordinatorDelegate,
flow: flow
)
}
Expand All @@ -68,18 +67,41 @@ final class DefaultCoordinatorProvider: CoordinatorProvider {
flow: .fromAlarm
)
}

func makeNearMapCoordinator(
parent: Coordinator,
}

extension DefaultCoordinatorProvider: AddRegularAlarmCoordinatorBuilder {
func build(parent: any Coordinator, navigationController: UINavigationController, flow: FlowState) -> any AddRegularAlarmCoordinator {
DefaultAddRegularAlarmCoordinator(
parent: parent,
navigationController: navigationController,
coordinatorProvider: self,
flow: flow
)
}
}

extension DefaultCoordinatorProvider: HomeCoordinatorBuilder {
func build(parent: any Coordinator, navigationController: UINavigationController) -> HomeCoordinator {
DefaultHomeCoordinator(
parent: parent,
navigationController: navigationController,
coordinatorProvider: self
)
}
}

extension DefaultCoordinatorProvider: NearMapCoordinatorBuilder {
func build(
parent: any Coordinator,
navigationController: UINavigationController,
flow: FlowState,
busStopId: String?
) -> NearMapCoordinator {
DefaultNearMapCoordinator(
parent: parent,
navigationController: navigationController,
navigationController: navigationController,
coordinatorProvider: self,
flow: flow,
flow: flow,
busStopId: busStopId
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ public final class DefaultAddRegularAlarmCoordinator {
public var navigationController: UINavigationController
public let coordinatorProvider: CoordinatorProvider
private let flow: FlowState
public var coordinatorType: CoordinatorType = .addAlarm

private var vcForFinishFlow: UIViewController?
private weak var viewModel: AddRegularAlarmViewModel?

public init(
parent: Coordinator,
Expand All @@ -34,11 +34,7 @@ public final class DefaultAddRegularAlarmCoordinator {
}

public func start() {
let addRegularAlarmViewController = AddRegularAlarmViewController(
viewModel: .init(
coordinator: self
)
)
let addRegularAlarmViewController = AddRegularAlarmViewController(viewModel: .init(coordinator: self))
vcForFinishFlow = addRegularAlarmViewController
navigationController.pushViewController(
addRegularAlarmViewController,
Expand All @@ -49,12 +45,9 @@ public final class DefaultAddRegularAlarmCoordinator {

extension DefaultAddRegularAlarmCoordinator: AddRegularAlarmCoordinator {
public func start(with: RegularAlarmResponse) {
let addRegularAlarmViewController = AddRegularAlarmViewController(
viewModel: .init(
alarmToEdit: with,
coordinator: self
)
)
let viewModel = AddRegularAlarmViewModel(alarmToEdit: with, coordinator: self)
let addRegularAlarmViewController = AddRegularAlarmViewController(viewModel: viewModel)
self.viewModel = viewModel
vcForFinishFlow = addRegularAlarmViewController
navigationController.pushViewController(
addRegularAlarmViewController,
Expand All @@ -66,7 +59,8 @@ extension DefaultAddRegularAlarmCoordinator: AddRegularAlarmCoordinator {
let searchCoordinator = coordinatorProvider.makeSearchCoordinator(
parent: self,
navigationController: navigationController,
flow: .fromAlarm
flow: .fromAlarm,
busStopCoordinatorDelegate: viewModel
)
childs.append(searchCoordinator)
searchCoordinator.start()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ public final class DefaultRegularAlarmCoordinator: RegularAlarmCoordinator {
public var childs: [Coordinator] = []
public var navigationController: UINavigationController
public var coordinatorProvider: CoordinatorProvider
public var coordinatorType: CoordinatorType = .regularAlarm

public init(
navigationController: UINavigationController,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//
// Dependencies.swift
// AlarmFeatureInterface
//
// Created by gnksbm on 7/19/25.
// Copyright © 2025 Pepsi-Club. All rights reserved.
//

@_exported import AlarmFeatureInterface
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,16 @@ extension AddRegularAlarmViewModel {
let regularAlarm: BehaviorRelay<RegularAlarmResponse>
}
}

extension AddRegularAlarmViewModel: BusStopCoordinatorDelegate {
func didSelect(busStopInfo: BusStopArrivalInfoResponse, busInfo: BusArrivalInfoResponse) {
regularAlarmEditingService.update(
busStopId: busStopInfo.busStopId,
busStopName: busStopInfo.busStopName,
busId: busInfo.busId,
busName: busInfo.busName,
adirection: busInfo.adirection
)
coordinator.removeChildViewController()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Foundation
import Core
import Domain
import FeatureDependency
import AlarmFeatureInterface

import RxSwift

Expand Down
Loading
Loading