From 55e56c0ff59714b50570a607b2de1efaba4a561d Mon Sep 17 00:00:00 2001 From: Victor Socaciu Date: Mon, 11 Dec 2023 18:22:58 +0400 Subject: [PATCH] move application logic to package --- FoodSpec/App/AppFeature.swift | 34 +++++++++++++++++ FoodSpec/App/FoodSpecApp.swift | 32 ++++++++++++++++ FoodSpec/FoodSpecApp.swift | 38 ------------------- .../Sources/API}/ApiKeysClient.swift | 0 food-spec/Sources/API/Food+API.swift | 8 ++++ .../Sources/API}/FoodClient.swift | 0 .../Sources/Ads}/BillboardClient.swift | 13 ++++--- .../Sources}/Database/Database+Creation.swift | 0 .../Sources}/Database/DatabaseClient.swift | 0 .../Sources/Database/Food+Database.swift | 8 ++++ .../EnergyBreakdownComparisonChart.swift | 5 ++- .../MacronutrientsComparisonChart.swift | 1 + .../Charts/QuantityComparisonChart.swift | 5 ++- .../Sources/FoodComparison}/Comparison.swift | 0 .../FoodComparison}/FoodComparison.swift | 1 + .../FoodComparisonFeature.swift | 1 + .../FoodComparison}/FoodSelection.swift | 1 + .../FoodDetails}/EnergyBreakdownChart.swift | 1 + .../Sources/FoodDetails}/FoodDetails.swift | 1 + .../FoodDetails}/FoodDetailsFeature.swift | 1 + .../FoodDetails}/NutritionalValueCard.swift | 0 .../Sources/FoodList}/BillboardReducer.swift | 0 .../Sources/FoodList}/FoodList.swift | 1 + .../Sources/FoodList}/FoodListFeature.swift | 2 + .../Sources/FoodList}/FoodListRow.swift | 2 +- .../Sources/FoodList}/SpotlightReducer.swift | 1 + .../Extensions/SortOrder+Extensions.swift | 8 ++++ .../Sources/Shared}/Model/Energy.swift | 0 .../Sources/Shared}/Model/Food.swift | 0 .../Sources/Shared}/Model/Quantity.swift | 0 .../Shared}/Utilities/EnergyCalculator.swift | 1 + .../Sources/Spotlight}/SpotlightClient.swift | 1 + .../UserDefaults}/UserDefaultsClient.swift | 1 + 33 files changed, 118 insertions(+), 49 deletions(-) create mode 100644 FoodSpec/App/AppFeature.swift create mode 100644 FoodSpec/App/FoodSpecApp.swift delete mode 100644 FoodSpec/FoodSpecApp.swift rename {FoodSpec/Clients => food-spec/Sources/API}/ApiKeysClient.swift (100%) create mode 100644 food-spec/Sources/API/Food+API.swift rename {FoodSpec/Clients => food-spec/Sources/API}/FoodClient.swift (100%) rename {FoodSpec/Clients => food-spec/Sources/Ads}/BillboardClient.swift (76%) rename {FoodSpec/Clients => food-spec/Sources}/Database/Database+Creation.swift (100%) rename {FoodSpec/Clients => food-spec/Sources}/Database/DatabaseClient.swift (100%) create mode 100644 food-spec/Sources/Database/Food+Database.swift rename {FoodSpec/Food Comparison => food-spec/Sources/FoodComparison}/Charts/EnergyBreakdownComparisonChart.swift (97%) rename {FoodSpec/Food Comparison => food-spec/Sources/FoodComparison}/Charts/MacronutrientsComparisonChart.swift (99%) rename {FoodSpec/Food Comparison => food-spec/Sources/FoodComparison}/Charts/QuantityComparisonChart.swift (96%) rename {FoodSpec/Food Comparison => food-spec/Sources/FoodComparison}/Comparison.swift (100%) rename {FoodSpec/Food Comparison => food-spec/Sources/FoodComparison}/FoodComparison.swift (99%) rename {FoodSpec/Food Comparison => food-spec/Sources/FoodComparison}/FoodComparisonFeature.swift (99%) rename {FoodSpec/Food Comparison => food-spec/Sources/FoodComparison}/FoodSelection.swift (99%) rename {FoodSpec/Food Details => food-spec/Sources/FoodDetails}/EnergyBreakdownChart.swift (99%) rename {FoodSpec/Food Details => food-spec/Sources/FoodDetails}/FoodDetails.swift (99%) rename {FoodSpec/Food Details => food-spec/Sources/FoodDetails}/FoodDetailsFeature.swift (96%) rename {FoodSpec/Food Details => food-spec/Sources/FoodDetails}/NutritionalValueCard.swift (100%) rename {FoodSpec/Food List => food-spec/Sources/FoodList}/BillboardReducer.swift (100%) rename {FoodSpec/Food List => food-spec/Sources/FoodList}/FoodList.swift (99%) rename {FoodSpec/Food List => food-spec/Sources/FoodList}/FoodListFeature.swift (99%) rename {FoodSpec/Food List => food-spec/Sources/FoodList}/FoodListRow.swift (96%) rename {FoodSpec/Food List => food-spec/Sources/FoodList}/SpotlightReducer.swift (99%) create mode 100644 food-spec/Sources/Shared/Extensions/SortOrder+Extensions.swift rename {FoodSpec => food-spec/Sources/Shared}/Model/Energy.swift (100%) rename {FoodSpec => food-spec/Sources/Shared}/Model/Food.swift (100%) rename {FoodSpec => food-spec/Sources/Shared}/Model/Quantity.swift (100%) rename {FoodSpec => food-spec/Sources/Shared}/Utilities/EnergyCalculator.swift (99%) rename {FoodSpec/Clients => food-spec/Sources/Spotlight}/SpotlightClient.swift (99%) rename {FoodSpec/Clients => food-spec/Sources/UserDefaults}/UserDefaultsClient.swift (99%) diff --git a/FoodSpec/App/AppFeature.swift b/FoodSpec/App/AppFeature.swift new file mode 100644 index 0000000..d456391 --- /dev/null +++ b/FoodSpec/App/AppFeature.swift @@ -0,0 +1,34 @@ +// +// AppFeature.swift +// FoodSpec +// +// Created by Victor Socaciu on 11/12/2023. +// + +import Foundation +import ComposableArchitecture + +@Reducer +struct AppFeature { + @ObservableState + struct State: Equatable { + var foodList: FoodListFeature.State = .init() + } + + @CasePathable + enum Action { + case foodList(FoodListFeature.Action) + } + + var body: some ReducerOf { + Scope(state: \.foodList, action: \.foodList) { + FoodListFeature() + } + Reduce { state, action in + switch action { + case .foodList: + return .none + } + } + } +} diff --git a/FoodSpec/App/FoodSpecApp.swift b/FoodSpec/App/FoodSpecApp.swift new file mode 100644 index 0000000..02bdb2f --- /dev/null +++ b/FoodSpec/App/FoodSpecApp.swift @@ -0,0 +1,32 @@ +// +// FoodSpecApp.swift +// FoodSpec +// +// Created by Victor Socaciu on 29/11/2023. +// + +import SwiftUI +import SwiftData +import ComposableArchitecture + +@main +struct FoodSpecApp: App { + @State var store = Store( + initialState: AppFeature.State(), + reducer: { + AppFeature() + ._printChanges() + } + ) + + var body: some Scene { + WindowGroup { + FoodList( + store: store.scope( + state: \.foodList, + action: \.foodList + ) + ) + } + } +} diff --git a/FoodSpec/FoodSpecApp.swift b/FoodSpec/FoodSpecApp.swift deleted file mode 100644 index 5d06a58..0000000 --- a/FoodSpec/FoodSpecApp.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// FoodSpecApp.swift -// FoodSpec -// -// Created by Victor Socaciu on 29/11/2023. -// - -import SwiftUI -import SwiftData -import ComposableArchitecture - -@main -struct FoodSpecApp: App { - let store = Store( - initialState: FoodListFeature.State(), - reducer: { - FoodListFeature() - ._printChanges() - } - ) - - var body: some Scene { - WindowGroup { - FoodList(store: store) - } - } -} - -private enum BundleKey: DependencyKey { - static let liveValue: Bundle = .main -} - -extension DependencyValues { - var bundle: Bundle { - get { self[BundleKey.self] } - set { self[BundleKey.self] = newValue } - } -} diff --git a/FoodSpec/Clients/ApiKeysClient.swift b/food-spec/Sources/API/ApiKeysClient.swift similarity index 100% rename from FoodSpec/Clients/ApiKeysClient.swift rename to food-spec/Sources/API/ApiKeysClient.swift diff --git a/food-spec/Sources/API/Food+API.swift b/food-spec/Sources/API/Food+API.swift new file mode 100644 index 0000000..89cf89a --- /dev/null +++ b/food-spec/Sources/API/Food+API.swift @@ -0,0 +1,8 @@ +// +// File.swift +// +// +// Created by Victor Socaciu on 11/12/2023. +// + +import Foundation diff --git a/FoodSpec/Clients/FoodClient.swift b/food-spec/Sources/API/FoodClient.swift similarity index 100% rename from FoodSpec/Clients/FoodClient.swift rename to food-spec/Sources/API/FoodClient.swift diff --git a/FoodSpec/Clients/BillboardClient.swift b/food-spec/Sources/Ads/BillboardClient.swift similarity index 76% rename from FoodSpec/Clients/BillboardClient.swift rename to food-spec/Sources/Ads/BillboardClient.swift index 54196c5..5f29840 100644 --- a/FoodSpec/Clients/BillboardClient.swift +++ b/food-spec/Sources/Ads/BillboardClient.swift @@ -6,16 +6,17 @@ // import Foundation -import ComposableArchitecture -import Billboard +import Dependencies +import DependenciesMacros +@_exported import Billboard @DependencyClient -struct BillboardClient { +public struct BillboardClient { var getRandomBanners: () async throws -> AsyncThrowingStream } extension BillboardClient: DependencyKey { - static var liveValue: BillboardClient = .init( + public static var liveValue: BillboardClient = .init( getRandomBanners: { @Dependency(\.continuousClock) var continuousClock let first = ActorIsolated(true) @@ -30,11 +31,11 @@ extension BillboardClient: DependencyKey { } ) - static var testValue: BillboardClient = .init() + public static var testValue: BillboardClient = .init() } extension DependencyValues { - var billboardClient: BillboardClient { + public var billboardClient: BillboardClient { get { self[BillboardClient.self] } set { self[BillboardClient.self] = newValue } } diff --git a/FoodSpec/Clients/Database/Database+Creation.swift b/food-spec/Sources/Database/Database+Creation.swift similarity index 100% rename from FoodSpec/Clients/Database/Database+Creation.swift rename to food-spec/Sources/Database/Database+Creation.swift diff --git a/FoodSpec/Clients/Database/DatabaseClient.swift b/food-spec/Sources/Database/DatabaseClient.swift similarity index 100% rename from FoodSpec/Clients/Database/DatabaseClient.swift rename to food-spec/Sources/Database/DatabaseClient.swift diff --git a/food-spec/Sources/Database/Food+Database.swift b/food-spec/Sources/Database/Food+Database.swift new file mode 100644 index 0000000..89cf89a --- /dev/null +++ b/food-spec/Sources/Database/Food+Database.swift @@ -0,0 +1,8 @@ +// +// File.swift +// +// +// Created by Victor Socaciu on 11/12/2023. +// + +import Foundation diff --git a/FoodSpec/Food Comparison/Charts/EnergyBreakdownComparisonChart.swift b/food-spec/Sources/FoodComparison/Charts/EnergyBreakdownComparisonChart.swift similarity index 97% rename from FoodSpec/Food Comparison/Charts/EnergyBreakdownComparisonChart.swift rename to food-spec/Sources/FoodComparison/Charts/EnergyBreakdownComparisonChart.swift index 7b300da..0404f3c 100644 --- a/FoodSpec/Food Comparison/Charts/EnergyBreakdownComparisonChart.swift +++ b/food-spec/Sources/FoodComparison/Charts/EnergyBreakdownComparisonChart.swift @@ -7,6 +7,7 @@ import SwiftUI import Charts +import Shared struct EnergyBreakdownComparisonChart: View { let foods: [Food] @@ -93,11 +94,11 @@ Fat: \(breakdown.fatRatio.formatted(.percent.precision(.fractionLength(0...1)))) } extension Energy: Plottable { - var primitivePlottable: Double { + public var primitivePlottable: Double { value } - init?(primitivePlottable: Double) { + public init?(primitivePlottable: Double) { self = .kcal(primitivePlottable) } } diff --git a/FoodSpec/Food Comparison/Charts/MacronutrientsComparisonChart.swift b/food-spec/Sources/FoodComparison/Charts/MacronutrientsComparisonChart.swift similarity index 99% rename from FoodSpec/Food Comparison/Charts/MacronutrientsComparisonChart.swift rename to food-spec/Sources/FoodComparison/Charts/MacronutrientsComparisonChart.swift index 29a4513..b80486b 100644 --- a/FoodSpec/Food Comparison/Charts/MacronutrientsComparisonChart.swift +++ b/food-spec/Sources/FoodComparison/Charts/MacronutrientsComparisonChart.swift @@ -7,6 +7,7 @@ import SwiftUI import Charts +import Shared struct MacronutrientsComparisonChart: View { let foods: [Food] diff --git a/FoodSpec/Food Comparison/Charts/QuantityComparisonChart.swift b/food-spec/Sources/FoodComparison/Charts/QuantityComparisonChart.swift similarity index 96% rename from FoodSpec/Food Comparison/Charts/QuantityComparisonChart.swift rename to food-spec/Sources/FoodComparison/Charts/QuantityComparisonChart.swift index da500a4..64f5f06 100644 --- a/FoodSpec/Food Comparison/Charts/QuantityComparisonChart.swift +++ b/food-spec/Sources/FoodComparison/Charts/QuantityComparisonChart.swift @@ -7,6 +7,7 @@ import SwiftUI import Charts +import Shared struct QuantityComparisonChart: View { let foods: [Food] @@ -69,11 +70,11 @@ struct QuantityComparisonChart: View { } extension Quantity: Plottable { - var primitivePlottable: Double { + public var primitivePlottable: Double { value } - init?(primitivePlottable: Double) { + public init?(primitivePlottable: Double) { self = .grams(primitivePlottable) } } diff --git a/FoodSpec/Food Comparison/Comparison.swift b/food-spec/Sources/FoodComparison/Comparison.swift similarity index 100% rename from FoodSpec/Food Comparison/Comparison.swift rename to food-spec/Sources/FoodComparison/Comparison.swift diff --git a/FoodSpec/Food Comparison/FoodComparison.swift b/food-spec/Sources/FoodComparison/FoodComparison.swift similarity index 99% rename from FoodSpec/Food Comparison/FoodComparison.swift rename to food-spec/Sources/FoodComparison/FoodComparison.swift index 5687151..db9664d 100644 --- a/FoodSpec/Food Comparison/FoodComparison.swift +++ b/food-spec/Sources/FoodComparison/FoodComparison.swift @@ -6,6 +6,7 @@ // import SwiftUI +import Shared import ComposableArchitecture struct FoodComparison: View { diff --git a/FoodSpec/Food Comparison/FoodComparisonFeature.swift b/food-spec/Sources/FoodComparison/FoodComparisonFeature.swift similarity index 99% rename from FoodSpec/Food Comparison/FoodComparisonFeature.swift rename to food-spec/Sources/FoodComparison/FoodComparisonFeature.swift index e87ff9d..d32d5bd 100644 --- a/FoodSpec/Food Comparison/FoodComparisonFeature.swift +++ b/food-spec/Sources/FoodComparison/FoodComparisonFeature.swift @@ -7,6 +7,7 @@ import Foundation import ComposableArchitecture +import Shared @Reducer struct FoodComparisonFeature { diff --git a/FoodSpec/Food Comparison/FoodSelection.swift b/food-spec/Sources/FoodComparison/FoodSelection.swift similarity index 99% rename from FoodSpec/Food Comparison/FoodSelection.swift rename to food-spec/Sources/FoodComparison/FoodSelection.swift index 22d763a..09b6946 100644 --- a/FoodSpec/Food Comparison/FoodSelection.swift +++ b/food-spec/Sources/FoodComparison/FoodSelection.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Shared struct FoodSelection: View { @Bindable var store: StoreOf diff --git a/FoodSpec/Food Details/EnergyBreakdownChart.swift b/food-spec/Sources/FoodDetails/EnergyBreakdownChart.swift similarity index 99% rename from FoodSpec/Food Details/EnergyBreakdownChart.swift rename to food-spec/Sources/FoodDetails/EnergyBreakdownChart.swift index e1a78d6..402e92c 100644 --- a/FoodSpec/Food Details/EnergyBreakdownChart.swift +++ b/food-spec/Sources/FoodDetails/EnergyBreakdownChart.swift @@ -7,6 +7,7 @@ import SwiftUI import Charts +import Shared struct EnergyBreakdownChart: View { let food: Food diff --git a/FoodSpec/Food Details/FoodDetails.swift b/food-spec/Sources/FoodDetails/FoodDetails.swift similarity index 99% rename from FoodSpec/Food Details/FoodDetails.swift rename to food-spec/Sources/FoodDetails/FoodDetails.swift index 55c7803..83bc994 100644 --- a/FoodSpec/Food Details/FoodDetails.swift +++ b/food-spec/Sources/FoodDetails/FoodDetails.swift @@ -7,6 +7,7 @@ import SwiftUI import ComposableArchitecture +import Shared struct FoodDetails: View { @Bindable var store: StoreOf diff --git a/FoodSpec/Food Details/FoodDetailsFeature.swift b/food-spec/Sources/FoodDetails/FoodDetailsFeature.swift similarity index 96% rename from FoodSpec/Food Details/FoodDetailsFeature.swift rename to food-spec/Sources/FoodDetails/FoodDetailsFeature.swift index 0a56611..2c86b3c 100644 --- a/FoodSpec/Food Details/FoodDetailsFeature.swift +++ b/food-spec/Sources/FoodDetails/FoodDetailsFeature.swift @@ -7,6 +7,7 @@ import Foundation import ComposableArchitecture +import Shared @Reducer struct FoodDetailsFeature { diff --git a/FoodSpec/Food Details/NutritionalValueCard.swift b/food-spec/Sources/FoodDetails/NutritionalValueCard.swift similarity index 100% rename from FoodSpec/Food Details/NutritionalValueCard.swift rename to food-spec/Sources/FoodDetails/NutritionalValueCard.swift diff --git a/FoodSpec/Food List/BillboardReducer.swift b/food-spec/Sources/FoodList/BillboardReducer.swift similarity index 100% rename from FoodSpec/Food List/BillboardReducer.swift rename to food-spec/Sources/FoodList/BillboardReducer.swift diff --git a/FoodSpec/Food List/FoodList.swift b/food-spec/Sources/FoodList/FoodList.swift similarity index 99% rename from FoodSpec/Food List/FoodList.swift rename to food-spec/Sources/FoodList/FoodList.swift index 56a9f61..64b72c3 100644 --- a/FoodSpec/Food List/FoodList.swift +++ b/food-spec/Sources/FoodList/FoodList.swift @@ -10,6 +10,7 @@ import SwiftData import ComposableArchitecture import CoreSpotlight import Billboard +import Shared struct FoodList: View { @Bindable var store: StoreOf diff --git a/FoodSpec/Food List/FoodListFeature.swift b/food-spec/Sources/FoodList/FoodListFeature.swift similarity index 99% rename from FoodSpec/Food List/FoodListFeature.swift rename to food-spec/Sources/FoodList/FoodListFeature.swift index a444732..bf350d1 100644 --- a/FoodSpec/Food List/FoodListFeature.swift +++ b/food-spec/Sources/FoodList/FoodListFeature.swift @@ -8,6 +8,8 @@ import Foundation import GRDB import ComposableArchitecture +import Shared +import API @Reducer struct FoodListFeature { diff --git a/FoodSpec/Food List/FoodListRow.swift b/food-spec/Sources/FoodList/FoodListRow.swift similarity index 96% rename from FoodSpec/Food List/FoodListRow.swift rename to food-spec/Sources/FoodList/FoodListRow.swift index 1da0d12..5f2ab7d 100644 --- a/FoodSpec/Food List/FoodListRow.swift +++ b/food-spec/Sources/FoodList/FoodListRow.swift @@ -6,7 +6,7 @@ // import SwiftUI -import SwiftData +import Shared struct FoodListRow: View { let food: Food diff --git a/FoodSpec/Food List/SpotlightReducer.swift b/food-spec/Sources/FoodList/SpotlightReducer.swift similarity index 99% rename from FoodSpec/Food List/SpotlightReducer.swift rename to food-spec/Sources/FoodList/SpotlightReducer.swift index 256f715..d505f3a 100644 --- a/FoodSpec/Food List/SpotlightReducer.swift +++ b/food-spec/Sources/FoodList/SpotlightReducer.swift @@ -8,6 +8,7 @@ import Foundation import ComposableArchitecture import CoreSpotlight +import Database @Reducer struct SpotlightReducer { diff --git a/food-spec/Sources/Shared/Extensions/SortOrder+Extensions.swift b/food-spec/Sources/Shared/Extensions/SortOrder+Extensions.swift new file mode 100644 index 0000000..89cf89a --- /dev/null +++ b/food-spec/Sources/Shared/Extensions/SortOrder+Extensions.swift @@ -0,0 +1,8 @@ +// +// File.swift +// +// +// Created by Victor Socaciu on 11/12/2023. +// + +import Foundation diff --git a/FoodSpec/Model/Energy.swift b/food-spec/Sources/Shared/Model/Energy.swift similarity index 100% rename from FoodSpec/Model/Energy.swift rename to food-spec/Sources/Shared/Model/Energy.swift diff --git a/FoodSpec/Model/Food.swift b/food-spec/Sources/Shared/Model/Food.swift similarity index 100% rename from FoodSpec/Model/Food.swift rename to food-spec/Sources/Shared/Model/Food.swift diff --git a/FoodSpec/Model/Quantity.swift b/food-spec/Sources/Shared/Model/Quantity.swift similarity index 100% rename from FoodSpec/Model/Quantity.swift rename to food-spec/Sources/Shared/Model/Quantity.swift diff --git a/FoodSpec/Utilities/EnergyCalculator.swift b/food-spec/Sources/Shared/Utilities/EnergyCalculator.swift similarity index 99% rename from FoodSpec/Utilities/EnergyCalculator.swift rename to food-spec/Sources/Shared/Utilities/EnergyCalculator.swift index 13c4e93..aa9f7f5 100644 --- a/FoodSpec/Utilities/EnergyCalculator.swift +++ b/food-spec/Sources/Shared/Utilities/EnergyCalculator.swift @@ -6,6 +6,7 @@ // import Foundation +import Shared struct EnergyCalculator { struct EnergyBreakdown: Hashable { diff --git a/FoodSpec/Clients/SpotlightClient.swift b/food-spec/Sources/Spotlight/SpotlightClient.swift similarity index 99% rename from FoodSpec/Clients/SpotlightClient.swift rename to food-spec/Sources/Spotlight/SpotlightClient.swift index d8dc4ea..2e9780f 100644 --- a/FoodSpec/Clients/SpotlightClient.swift +++ b/food-spec/Sources/Spotlight/SpotlightClient.swift @@ -8,6 +8,7 @@ import Foundation import CoreSpotlight import ComposableArchitecture +import Shared @DependencyClient struct SpotlightClient { diff --git a/FoodSpec/Clients/UserDefaultsClient.swift b/food-spec/Sources/UserDefaults/UserDefaultsClient.swift similarity index 99% rename from FoodSpec/Clients/UserDefaultsClient.swift rename to food-spec/Sources/UserDefaults/UserDefaultsClient.swift index 00763b6..185bdda 100644 --- a/FoodSpec/Clients/UserDefaultsClient.swift +++ b/food-spec/Sources/UserDefaults/UserDefaultsClient.swift @@ -8,6 +8,7 @@ import Foundation import ComposableArchitecture import XCTestDynamicOverlay +import Shared public struct UserDefaultsClient { public var bool: @Sendable (_ key: String) -> Bool