Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add App module #137

Merged
merged 7 commits into from
Feb 9, 2023
Merged
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
14 changes: 7 additions & 7 deletions App/Develop.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
objects = {

/* Begin PBXBuildFile section */
1185D03D2993E93A0021EFDE /* Develop in Frameworks */ = {isa = PBXBuildFile; productRef = 1185D03C2993E93A0021EFDE /* Develop */; };
4B70E98A29912ECC00D55B7B /* DevelopApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B70E98429912ECC00D55B7B /* DevelopApp.swift */; };
4B70E98B29912ECC00D55B7B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4B70E98729912ECC00D55B7B /* Assets.xcassets */; };
4B70E98C29912ECC00D55B7B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4B70E98929912ECC00D55B7B /* Preview Assets.xcassets */; };
4B70E98F29912F6300D55B7B /* DevelopApp in Frameworks */ = {isa = PBXBuildFile; productRef = 4B70E98E29912F6300D55B7B /* DevelopApp */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand All @@ -26,7 +26,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4B70E98F29912F6300D55B7B /* DevelopApp in Frameworks */,
1185D03D2993E93A0021EFDE /* Develop in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -102,7 +102,7 @@
);
name = Develop;
packageProductDependencies = (
4B70E98E29912F6300D55B7B /* DevelopApp */,
1185D03C2993E93A0021EFDE /* Develop */,
);
productName = Develop;
productReference = 4B70E97229912DEA00D55B7B /* Develop.app */;
Expand All @@ -129,8 +129,8 @@
hasScannedForEncodings = 0;
knownRegions = (
ja,
Base,
en,
Base,
en,
);
mainGroup = 4B70E96929912DEA00D55B7B;
productRefGroup = 4B70E97329912DEA00D55B7B /* Products */;
Expand Down Expand Up @@ -378,9 +378,9 @@
/* End XCConfigurationList section */

/* Begin XCSwiftPackageProductDependency section */
4B70E98E29912F6300D55B7B /* DevelopApp */ = {
1185D03C2993E93A0021EFDE /* Develop */ = {
isa = XCSwiftPackageProductDependency;
productName = DevelopApp;
productName = Develop;
};
/* End XCSwiftPackageProductDependency section */
};
Expand Down
4 changes: 2 additions & 2 deletions App/Loki/Develop/DevelopApp.swift
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import SwiftUI
import SakatsuFeature
import DevelopApp

@main
struct DevelopApp: App {
var body: some Scene {
WindowGroup {
SakatsuListScreen()
DevelopRouter.shared.firstScreen()
}
}
}
4 changes: 2 additions & 2 deletions App/Loki/Production/ProductionApp.swift
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import SwiftUI
import SakatsuFeature
import ProductionApp

@main
struct ProductionApp: App {
var body: some Scene {
WindowGroup {
SakatsuListScreen()
ProductionRouter.shared.firstScreen()
}
}
}
10 changes: 5 additions & 5 deletions App/Production.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
objects = {

/* Begin PBXBuildFile section */
4B66C3B0298EB22F007E7159 /* ProductionApp in Frameworks */ = {isa = PBXBuildFile; productRef = 4B66C3AF298EB22F007E7159 /* ProductionApp */; };
1185D03F2993EDED0021EFDE /* Production in Frameworks */ = {isa = PBXBuildFile; productRef = 1185D03E2993EDED0021EFDE /* Production */; };
4BD67C21298EA70400440ADA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4BD67C1C298EA70400440ADA /* Assets.xcassets */; };
4BD67C22298EA70400440ADA /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4BD67C1E298EA70400440ADA /* Preview Assets.xcassets */; };
4BD67C23298EA70400440ADA /* ProductionApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BD67C20298EA70400440ADA /* ProductionApp.swift */; };
Expand All @@ -26,7 +26,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4B66C3B0298EB22F007E7159 /* ProductionApp in Frameworks */,
1185D03F2993EDED0021EFDE /* Production in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -102,7 +102,7 @@
);
name = Production;
packageProductDependencies = (
4B66C3AF298EB22F007E7159 /* ProductionApp */,
1185D03E2993EDED0021EFDE /* Production */,
);
productName = Full;
productReference = 1181AC6E290F845800F9C89A /* Production.app */;
Expand Down Expand Up @@ -391,9 +391,9 @@
/* End XCConfigurationList section */

/* Begin XCSwiftPackageProductDependency section */
4B66C3AF298EB22F007E7159 /* ProductionApp */ = {
1185D03E2993EDED0021EFDE /* Production */ = {
isa = XCSwiftPackageProductDependency;
productName = ProductionApp;
productName = Production;
};
/* End XCSwiftPackageProductDependency section */
};
Expand Down
Binary file modified Docs/module_diagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 24 additions & 9 deletions LokiPackage/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,11 @@ let package = Package(
],
products: [
.library(
name: "ProductionApp",
targets: [
"SakatsuFeature",
]),
name: "Production",
targets: ["ProductionApp"]),
.library(
name: "DevelopApp",
targets: [
"SakatsuFeature",
]),
name: "Develop",
targets: ["DevelopApp"]),
],
dependencies: [
.package(url: "https://github.com/apple/swift-algorithms.git", from: "1.0.0"),
Expand All @@ -35,11 +31,30 @@ let package = Package(
.package(url: "https://github.com/SwiftGen/SwiftGenPlugin", from: "6.6.2"),
],
targets: [
// App layer
.target(
name: "ProductionApp",
dependencies: [
"SakatsuFeature",
"SettingsFeature",
"UICore",
],
path: "./Sources/Apps/Production",
swiftSettings: [.unsafeFlags(debugOtherSwiftFlags, .when(configuration: .debug))]),
.target(
name: "DevelopApp",
dependencies: [
"SakatsuFeature",
"SettingsFeature",
"UICore",
],
path: "./Sources/Apps/Develop",
swiftSettings: [.unsafeFlags(debugOtherSwiftFlags, .when(configuration: .debug))]),

// Feature layer
.target(
name: "SakatsuFeature",
dependencies: [
"SettingsFeature",
"UICore",
"SakatsuData",
.product(name: "Algorithms", package: "swift-algorithms"),
Expand Down
37 changes: 37 additions & 0 deletions LokiPackage/Sources/Apps/Develop/DevelopRouter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import SwiftUI
import SakatsuFeature
import SettingsFeature
import UICore

@MainActor
public final class DevelopRouter {
public static let shared = DevelopRouter()

private init() {}

public func firstScreen() -> some View {
NavigationStack {
makeSakatsuListScreen()
}
}
}

extension DevelopRouter: SakatsuRouterProtocol {
public func settingsScreen() -> some View {
NavigationStack {
makeSettingsScreen()
}
}
}

// MARK: - Screen factory

private extension DevelopRouter {
func makeSakatsuListScreen() -> some View {
SakatsuListScreen(router: Self.shared)
}

func makeSettingsScreen() -> some View {
SettingsScreen()
}
}
37 changes: 37 additions & 0 deletions LokiPackage/Sources/Apps/Production/ProductionRouter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import SwiftUI
import SakatsuFeature
import SettingsFeature
import UICore

@MainActor
public final class ProductionRouter {
public static let shared = ProductionRouter()

private init() {}

public func firstScreen() -> some View {
NavigationStack {
makeSakatsuListScreen()
}
}
}

extension ProductionRouter: SakatsuRouterProtocol {
public func settingsScreen() -> some View {
NavigationStack {
makeSettingsScreen()
}
}
}

// MARK: - Screen factory

private extension ProductionRouter {
func makeSakatsuListScreen() -> some View {
SakatsuListScreen(router: Self.shared)
}

func makeSettingsScreen() -> some View {
SettingsScreen()
}
}
21 changes: 21 additions & 0 deletions LokiPackage/Sources/Core/UI/Routers/SakatsuRouterProtocol.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import SwiftUI

@MainActor
public protocol SakatsuRouterProtocol {
associatedtype Screen : View
func settingsScreen() -> Self.Screen
}

#if DEBUG
public final class SakatsuRouterMock {
public static let shared = SakatsuRouterMock()

private init() {}
}

extension SakatsuRouterMock: SakatsuRouterProtocol {
public func settingsScreen() -> some View {
EmptyView()
}
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -10,58 +10,56 @@ struct SakatsuInputScreen: View {
@Environment(\.dismiss) private var dismiss

var body: some View {
NavigationStack {
SakatsuInputView(
sakatsu: viewModel.uiState.sakatsu,
onAddNewSaunaSetButtonClick: {
viewModel.onAddNewSaunaSetButtonClick()
}, onFacilityNameChange: { facilityName in
viewModel.onFacilityNameChange(facilityName: facilityName)
}, onVisitingDateChange: { visitingDate in
viewModel.onVisitingDateChange(visitingDate: visitingDate)
}, onForewordChange: { foreword in
viewModel.onForewordChange(foreword: foreword)
}, onSaunaTitleChange: { saunaSetIndex, saunaTitle in
viewModel.onSaunaTitleChange(saunaSetIndex: saunaSetIndex, saunaTitle: saunaTitle)
}, onSaunaTimeChange: { saunaSetIndex, saunaTime in
viewModel.onSaunaTimeChange(saunaSetIndex: saunaSetIndex, saunaTime: saunaTime)
}, onCoolBathTitleChange: { saunaSetIndex, coolBathTitle in
viewModel.onCoolBathTitleChange(saunaSetIndex: saunaSetIndex, coolBathTitle: coolBathTitle)
}, onCoolBathTimeChange: { saunaSetIndex, coolBathTime in
viewModel.onCoolBathTimeChange(saunaSetIndex: saunaSetIndex, coolBathTime: coolBathTime)
}, onRelaxationTitleChange: { saunaSetIndex, relaxationTitle in
viewModel.onRelaxationTitleChange(saunaSetIndex: saunaSetIndex, relaxationTitle: relaxationTitle)
}, onRelaxationTimeChange: { saunaSetIndex, relaxationTime in
viewModel.onRelaxationTimeChange(saunaSetIndex: saunaSetIndex, relaxationTime: relaxationTime)
}, onRemoveSaunaSetButtonClick: { saunaSetIndex in
viewModel.onRemoveSaunaSetButtonClick(saunaSetIndex: saunaSetIndex)
}, onAfterwordChange: { afterword in
viewModel.onAfterwordChange(afterword: afterword)
}, onTemperatureTitleChange: { temperatureIndex, temperatureTitle in
viewModel.onTemperatureTitleChange(temperatureIndex: temperatureIndex, temperatureTitle: temperatureTitle)
}, onTemperatureChange: { temperatureIndex, temperature in
viewModel.onTemperatureChange(temperatureIndex: temperatureIndex, temperature: temperature)
}, onTemperatureDelete: { offsets in
viewModel.onTemperatureDelete(at: offsets)
}, onAddNewTemperatureButtonClick: {
viewModel.onAddNewTemperatureButtonClick()
}
)
.navigationTitle(L10n.registerSakatsu)
.navigationBarTitleDisplayMode(.inline)
.scrollDismissesKeyboard(.interactively)
.sakatsuInputScreenToolbar(
saveButtonDisabled: viewModel.uiState.sakatsu.facilityName.isEmpty,
onSaveButtonClick: {
viewModel.onSaveButtonClick()
onSakatsuSave()
}, onCloseButtonClick: { dismiss() }
)
.errorAlert(
error: viewModel.uiState.sakatsuInputError,
onDismiss: { viewModel.onErrorAlertDismiss() }
)
}
SakatsuInputView(
sakatsu: viewModel.uiState.sakatsu,
onAddNewSaunaSetButtonClick: {
viewModel.onAddNewSaunaSetButtonClick()
}, onFacilityNameChange: { facilityName in
viewModel.onFacilityNameChange(facilityName: facilityName)
}, onVisitingDateChange: { visitingDate in
viewModel.onVisitingDateChange(visitingDate: visitingDate)
}, onForewordChange: { foreword in
viewModel.onForewordChange(foreword: foreword)
}, onSaunaTitleChange: { saunaSetIndex, saunaTitle in
viewModel.onSaunaTitleChange(saunaSetIndex: saunaSetIndex, saunaTitle: saunaTitle)
}, onSaunaTimeChange: { saunaSetIndex, saunaTime in
viewModel.onSaunaTimeChange(saunaSetIndex: saunaSetIndex, saunaTime: saunaTime)
}, onCoolBathTitleChange: { saunaSetIndex, coolBathTitle in
viewModel.onCoolBathTitleChange(saunaSetIndex: saunaSetIndex, coolBathTitle: coolBathTitle)
}, onCoolBathTimeChange: { saunaSetIndex, coolBathTime in
viewModel.onCoolBathTimeChange(saunaSetIndex: saunaSetIndex, coolBathTime: coolBathTime)
}, onRelaxationTitleChange: { saunaSetIndex, relaxationTitle in
viewModel.onRelaxationTitleChange(saunaSetIndex: saunaSetIndex, relaxationTitle: relaxationTitle)
}, onRelaxationTimeChange: { saunaSetIndex, relaxationTime in
viewModel.onRelaxationTimeChange(saunaSetIndex: saunaSetIndex, relaxationTime: relaxationTime)
}, onRemoveSaunaSetButtonClick: { saunaSetIndex in
viewModel.onRemoveSaunaSetButtonClick(saunaSetIndex: saunaSetIndex)
}, onAfterwordChange: { afterword in
viewModel.onAfterwordChange(afterword: afterword)
}, onTemperatureTitleChange: { temperatureIndex, temperatureTitle in
viewModel.onTemperatureTitleChange(temperatureIndex: temperatureIndex, temperatureTitle: temperatureTitle)
}, onTemperatureChange: { temperatureIndex, temperature in
viewModel.onTemperatureChange(temperatureIndex: temperatureIndex, temperature: temperature)
}, onTemperatureDelete: { offsets in
viewModel.onTemperatureDelete(at: offsets)
}, onAddNewTemperatureButtonClick: {
viewModel.onAddNewTemperatureButtonClick()
}
)
.navigationTitle(L10n.registerSakatsu)
.navigationBarTitleDisplayMode(.inline)
.scrollDismissesKeyboard(.interactively)
.sakatsuInputScreenToolbar(
saveButtonDisabled: viewModel.uiState.sakatsu.facilityName.isEmpty,
onSaveButtonClick: {
viewModel.onSaveButtonClick()
onSakatsuSave()
}, onCloseButtonClick: { dismiss() }
)
.errorAlert(
error: viewModel.uiState.sakatsuInputError,
onDismiss: { viewModel.onErrorAlertDismiss() }
)
}

init(
Expand Down Expand Up @@ -100,10 +98,12 @@ private extension View {
#if DEBUG
struct SakatsuInputScreen_Previews: PreviewProvider {
static var previews: some View {
SakatsuInputScreen(
editMode: .edit(sakatsu: .preview),
onSakatsuSave: {}
)
NavigationStack {
SakatsuInputScreen(
editMode: .edit(sakatsu: .preview),
onSakatsuSave: {}
)
}
}
}
#endif
Loading