diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..018b088 --- /dev/null +++ b/.gitignore @@ -0,0 +1,89 @@ +# Created by https://www.toptal.com/developers/gitignore/api/swift +# Edit at https://www.toptal.com/developers/gitignore?templates=swift + +### Swift ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +# *.xcodeproj +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +# .swiftpm + +.build/ + +# CocoaPods +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# Pods/ +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace +*.xcuserstate + +# Carthage +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build/ + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + +# End of https://www.toptal.com/developers/gitignore/api/swift diff --git a/CountApp_Elly/CountApp_Elly.xcodeproj/project.pbxproj b/CountApp_Elly/CountApp_Elly.xcodeproj/project.pbxproj new file mode 100644 index 0000000..63f1ba3 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly.xcodeproj/project.pbxproj @@ -0,0 +1,753 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 453089072B52725500E199B9 /* CountApp_EllyApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089062B52725500E199B9 /* CountApp_EllyApp.swift */; }; + 453089092B52725500E199B9 /* CounterAppView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089082B52725500E199B9 /* CounterAppView.swift */; }; + 4530890B2B52725700E199B9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4530890A2B52725700E199B9 /* Assets.xcassets */; }; + 4530890E2B52725700E199B9 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4530890D2B52725700E199B9 /* Preview Assets.xcassets */; }; + 453089182B52725700E199B9 /* CountApp_EllyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089172B52725700E199B9 /* CountApp_EllyTests.swift */; }; + 453089222B52725700E199B9 /* CountApp_EllyUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089212B52725700E199B9 /* CountApp_EllyUITests.swift */; }; + 453089242B52725700E199B9 /* CountApp_EllyUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089232B52725700E199B9 /* CountApp_EllyUITestsLaunchTests.swift */; }; + 453089322B5275CD00E199B9 /* ComposableArchitecture in Frameworks */ = {isa = PBXBuildFile; productRef = 453089312B5275CD00E199B9 /* ComposableArchitecture */; }; + 453089362B5278A100E199B9 /* CoffeeMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089352B5278A100E199B9 /* CoffeeMenuView.swift */; }; + 453089382B5278B000E199B9 /* CounterAppStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089372B5278B000E199B9 /* CounterAppStore.swift */; }; + 4530893C2B5278C900E199B9 /* TapCountingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4530893B2B5278C900E199B9 /* TapCountingView.swift */; }; + 453089402B527AAF00E199B9 /* Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4530893F2B527AAF00E199B9 /* Menu.swift */; }; + 453089432B527B2F00E199B9 /* Americano.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089422B527B2F00E199B9 /* Americano.swift */; }; + 453089452B527F8900E199B9 /* Mocha.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089442B527F8900E199B9 /* Mocha.swift */; }; + 453089472B527FBD00E199B9 /* Hazelnut.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089462B527FBD00E199B9 /* Hazelnut.swift */; }; + 453089492B527FD500E199B9 /* Latte.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089482B527FD500E199B9 /* Latte.swift */; }; + 4530894B2B527FF700E199B9 /* CaramelMacchiato.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4530894A2B527FF700E199B9 /* CaramelMacchiato.swift */; }; + 4530894D2B52874E00E199B9 /* MenuItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4530894C2B52874E00E199B9 /* MenuItemView.swift */; }; + 453089512B52974700E199B9 /* Color+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453089502B52974700E199B9 /* Color+.swift */; }; + 4539469E2B52B37D007FE780 /* CountingItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4539469D2B52B37D007FE780 /* CountingItemView.swift */; }; + 453946A12B52BE19007FE780 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 453946A02B52BE19007FE780 /* Localizable.xcstrings */; }; + 453946A32B52CB20007FE780 /* CoffeeMenuContextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453946A22B52CB20007FE780 /* CoffeeMenuContextView.swift */; }; + 453946A52B52CBA3007FE780 /* TapCountingContextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 453946A42B52CBA3007FE780 /* TapCountingContextView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 453089142B52725700E199B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 453088FB2B52725500E199B9 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 453089022B52725500E199B9; + remoteInfo = CountApp_Elly; + }; + 4530891E2B52725700E199B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 453088FB2B52725500E199B9 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 453089022B52725500E199B9; + remoteInfo = CountApp_Elly; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 453089032B52725500E199B9 /* CountApp_Elly.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CountApp_Elly.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 453089062B52725500E199B9 /* CountApp_EllyApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountApp_EllyApp.swift; sourceTree = ""; }; + 453089082B52725500E199B9 /* CounterAppView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CounterAppView.swift; sourceTree = ""; }; + 4530890A2B52725700E199B9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 4530890D2B52725700E199B9 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 453089132B52725700E199B9 /* CountApp_EllyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CountApp_EllyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 453089172B52725700E199B9 /* CountApp_EllyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountApp_EllyTests.swift; sourceTree = ""; }; + 4530891D2B52725700E199B9 /* CountApp_EllyUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CountApp_EllyUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 453089212B52725700E199B9 /* CountApp_EllyUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountApp_EllyUITests.swift; sourceTree = ""; }; + 453089232B52725700E199B9 /* CountApp_EllyUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountApp_EllyUITestsLaunchTests.swift; sourceTree = ""; }; + 453089352B5278A100E199B9 /* CoffeeMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoffeeMenuView.swift; sourceTree = ""; }; + 453089372B5278B000E199B9 /* CounterAppStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CounterAppStore.swift; sourceTree = ""; }; + 4530893B2B5278C900E199B9 /* TapCountingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TapCountingView.swift; sourceTree = ""; }; + 4530893F2B527AAF00E199B9 /* Menu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Menu.swift; sourceTree = ""; }; + 453089422B527B2F00E199B9 /* Americano.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Americano.swift; sourceTree = ""; }; + 453089442B527F8900E199B9 /* Mocha.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mocha.swift; sourceTree = ""; }; + 453089462B527FBD00E199B9 /* Hazelnut.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Hazelnut.swift; sourceTree = ""; }; + 453089482B527FD500E199B9 /* Latte.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Latte.swift; sourceTree = ""; }; + 4530894A2B527FF700E199B9 /* CaramelMacchiato.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaramelMacchiato.swift; sourceTree = ""; }; + 4530894C2B52874E00E199B9 /* MenuItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuItemView.swift; sourceTree = ""; }; + 453089502B52974700E199B9 /* Color+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+.swift"; sourceTree = ""; }; + 4539469D2B52B37D007FE780 /* CountingItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountingItemView.swift; sourceTree = ""; }; + 453946A02B52BE19007FE780 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + 453946A22B52CB20007FE780 /* CoffeeMenuContextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoffeeMenuContextView.swift; sourceTree = ""; }; + 453946A42B52CBA3007FE780 /* TapCountingContextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TapCountingContextView.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 453089002B52725500E199B9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 453089322B5275CD00E199B9 /* ComposableArchitecture in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 453089102B52725700E199B9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4530891A2B52725700E199B9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 453088FA2B52725500E199B9 = { + isa = PBXGroup; + children = ( + 453089052B52725500E199B9 /* CountApp_Elly */, + 453089162B52725700E199B9 /* CountApp_EllyTests */, + 453089202B52725700E199B9 /* CountApp_EllyUITests */, + 453089042B52725500E199B9 /* Products */, + ); + sourceTree = ""; + }; + 453089042B52725500E199B9 /* Products */ = { + isa = PBXGroup; + children = ( + 453089032B52725500E199B9 /* CountApp_Elly.app */, + 453089132B52725700E199B9 /* CountApp_EllyTests.xctest */, + 4530891D2B52725700E199B9 /* CountApp_EllyUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 453089052B52725500E199B9 /* CountApp_Elly */ = { + isa = PBXGroup; + children = ( + 453089062B52725500E199B9 /* CountApp_EllyApp.swift */, + 4530893D2B527A7000E199B9 /* Model */, + 4530893E2B527A9400E199B9 /* Domain */, + 4530894F2B52972600E199B9 /* Extension */, + 4530890A2B52725700E199B9 /* Assets.xcassets */, + 4530890C2B52725700E199B9 /* Preview Content */, + 453946A02B52BE19007FE780 /* Localizable.xcstrings */, + ); + path = CountApp_Elly; + sourceTree = ""; + }; + 4530890C2B52725700E199B9 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 4530890D2B52725700E199B9 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 453089162B52725700E199B9 /* CountApp_EllyTests */ = { + isa = PBXGroup; + children = ( + 453089172B52725700E199B9 /* CountApp_EllyTests.swift */, + ); + path = CountApp_EllyTests; + sourceTree = ""; + }; + 453089202B52725700E199B9 /* CountApp_EllyUITests */ = { + isa = PBXGroup; + children = ( + 453089212B52725700E199B9 /* CountApp_EllyUITests.swift */, + 453089232B52725700E199B9 /* CountApp_EllyUITestsLaunchTests.swift */, + ); + path = CountApp_EllyUITests; + sourceTree = ""; + }; + 453089332B52785300E199B9 /* CoffeeMenu */ = { + isa = PBXGroup; + children = ( + 453089352B5278A100E199B9 /* CoffeeMenuView.swift */, + 4530894E2B52875200E199B9 /* Subviews */, + ); + path = CoffeeMenu; + sourceTree = ""; + }; + 453089342B52786000E199B9 /* TapCounting */ = { + isa = PBXGroup; + children = ( + 4530893B2B5278C900E199B9 /* TapCountingView.swift */, + 453946A62B557C4E007FE780 /* Subviews */, + ); + path = TapCounting; + sourceTree = ""; + }; + 4530893D2B527A7000E199B9 /* Model */ = { + isa = PBXGroup; + children = ( + 453089412B527B1900E199B9 /* CoffeeMenu */, + ); + path = Model; + sourceTree = ""; + }; + 4530893E2B527A9400E199B9 /* Domain */ = { + isa = PBXGroup; + children = ( + 4539469F2B52BA32007FE780 /* Home */, + 453089332B52785300E199B9 /* CoffeeMenu */, + 453089342B52786000E199B9 /* TapCounting */, + ); + path = Domain; + sourceTree = ""; + }; + 453089412B527B1900E199B9 /* CoffeeMenu */ = { + isa = PBXGroup; + children = ( + 4530893F2B527AAF00E199B9 /* Menu.swift */, + 453089422B527B2F00E199B9 /* Americano.swift */, + 453089482B527FD500E199B9 /* Latte.swift */, + 4530894A2B527FF700E199B9 /* CaramelMacchiato.swift */, + 453089442B527F8900E199B9 /* Mocha.swift */, + 453089462B527FBD00E199B9 /* Hazelnut.swift */, + ); + path = CoffeeMenu; + sourceTree = ""; + }; + 4530894E2B52875200E199B9 /* Subviews */ = { + isa = PBXGroup; + children = ( + 4530894C2B52874E00E199B9 /* MenuItemView.swift */, + 453946A22B52CB20007FE780 /* CoffeeMenuContextView.swift */, + ); + path = Subviews; + sourceTree = ""; + }; + 4530894F2B52972600E199B9 /* Extension */ = { + isa = PBXGroup; + children = ( + 453089502B52974700E199B9 /* Color+.swift */, + ); + path = Extension; + sourceTree = ""; + }; + 4539469F2B52BA32007FE780 /* Home */ = { + isa = PBXGroup; + children = ( + 453089082B52725500E199B9 /* CounterAppView.swift */, + 453089372B5278B000E199B9 /* CounterAppStore.swift */, + ); + path = Home; + sourceTree = ""; + }; + 453946A62B557C4E007FE780 /* Subviews */ = { + isa = PBXGroup; + children = ( + 4539469D2B52B37D007FE780 /* CountingItemView.swift */, + 453946A42B52CBA3007FE780 /* TapCountingContextView.swift */, + ); + path = Subviews; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 453089022B52725500E199B9 /* CountApp_Elly */ = { + isa = PBXNativeTarget; + buildConfigurationList = 453089272B52725700E199B9 /* Build configuration list for PBXNativeTarget "CountApp_Elly" */; + buildPhases = ( + 453088FF2B52725500E199B9 /* Sources */, + 453089002B52725500E199B9 /* Frameworks */, + 453089012B52725500E199B9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CountApp_Elly; + packageProductDependencies = ( + 453089312B5275CD00E199B9 /* ComposableArchitecture */, + ); + productName = CountApp_Elly; + productReference = 453089032B52725500E199B9 /* CountApp_Elly.app */; + productType = "com.apple.product-type.application"; + }; + 453089122B52725700E199B9 /* CountApp_EllyTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4530892A2B52725700E199B9 /* Build configuration list for PBXNativeTarget "CountApp_EllyTests" */; + buildPhases = ( + 4530890F2B52725700E199B9 /* Sources */, + 453089102B52725700E199B9 /* Frameworks */, + 453089112B52725700E199B9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 453089152B52725700E199B9 /* PBXTargetDependency */, + ); + name = CountApp_EllyTests; + productName = CountApp_EllyTests; + productReference = 453089132B52725700E199B9 /* CountApp_EllyTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4530891C2B52725700E199B9 /* CountApp_EllyUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4530892D2B52725700E199B9 /* Build configuration list for PBXNativeTarget "CountApp_EllyUITests" */; + buildPhases = ( + 453089192B52725700E199B9 /* Sources */, + 4530891A2B52725700E199B9 /* Frameworks */, + 4530891B2B52725700E199B9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4530891F2B52725700E199B9 /* PBXTargetDependency */, + ); + name = CountApp_EllyUITests; + productName = CountApp_EllyUITests; + productReference = 4530891D2B52725700E199B9 /* CountApp_EllyUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 453088FB2B52725500E199B9 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + TargetAttributes = { + 453089022B52725500E199B9 = { + CreatedOnToolsVersion = 15.0.1; + }; + 453089122B52725700E199B9 = { + CreatedOnToolsVersion = 15.0.1; + TestTargetID = 453089022B52725500E199B9; + }; + 4530891C2B52725700E199B9 = { + CreatedOnToolsVersion = 15.0.1; + TestTargetID = 453089022B52725500E199B9; + }; + }; + }; + buildConfigurationList = 453088FE2B52725500E199B9 /* Build configuration list for PBXProject "CountApp_Elly" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = ko; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ko, + ); + mainGroup = 453088FA2B52725500E199B9; + packageReferences = ( + 453089302B5275CD00E199B9 /* XCRemoteSwiftPackageReference "swift-composable-architecture" */, + ); + productRefGroup = 453089042B52725500E199B9 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 453089022B52725500E199B9 /* CountApp_Elly */, + 453089122B52725700E199B9 /* CountApp_EllyTests */, + 4530891C2B52725700E199B9 /* CountApp_EllyUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 453089012B52725500E199B9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4530890E2B52725700E199B9 /* Preview Assets.xcassets in Resources */, + 4530890B2B52725700E199B9 /* Assets.xcassets in Resources */, + 453946A12B52BE19007FE780 /* Localizable.xcstrings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 453089112B52725700E199B9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4530891B2B52725700E199B9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 453088FF2B52725500E199B9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 453089492B527FD500E199B9 /* Latte.swift in Sources */, + 453089362B5278A100E199B9 /* CoffeeMenuView.swift in Sources */, + 4530894D2B52874E00E199B9 /* MenuItemView.swift in Sources */, + 453946A52B52CBA3007FE780 /* TapCountingContextView.swift in Sources */, + 453089432B527B2F00E199B9 /* Americano.swift in Sources */, + 4530894B2B527FF700E199B9 /* CaramelMacchiato.swift in Sources */, + 453089092B52725500E199B9 /* CounterAppView.swift in Sources */, + 453089402B527AAF00E199B9 /* Menu.swift in Sources */, + 453089512B52974700E199B9 /* Color+.swift in Sources */, + 453946A32B52CB20007FE780 /* CoffeeMenuContextView.swift in Sources */, + 453089382B5278B000E199B9 /* CounterAppStore.swift in Sources */, + 4539469E2B52B37D007FE780 /* CountingItemView.swift in Sources */, + 4530893C2B5278C900E199B9 /* TapCountingView.swift in Sources */, + 453089472B527FBD00E199B9 /* Hazelnut.swift in Sources */, + 453089072B52725500E199B9 /* CountApp_EllyApp.swift in Sources */, + 453089452B527F8900E199B9 /* Mocha.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4530890F2B52725700E199B9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 453089182B52725700E199B9 /* CountApp_EllyTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 453089192B52725700E199B9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 453089242B52725700E199B9 /* CountApp_EllyUITestsLaunchTests.swift in Sources */, + 453089222B52725700E199B9 /* CountApp_EllyUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 453089152B52725700E199B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 453089022B52725500E199B9 /* CountApp_Elly */; + targetProxy = 453089142B52725700E199B9 /* PBXContainerItemProxy */; + }; + 4530891F2B52725700E199B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 453089022B52725500E199B9 /* CountApp_Elly */; + targetProxy = 4530891E2B52725700E199B9 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 453089252B52725700E199B9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 453089262B52725700E199B9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 453089282B52725700E199B9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"CountApp_Elly/Preview Content\""; + DEVELOPMENT_TEAM = 4HT2BE32MC; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.elly.CountApp-Elly"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 453089292B52725700E199B9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"CountApp_Elly/Preview Content\""; + DEVELOPMENT_TEAM = 4HT2BE32MC; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.elly.CountApp-Elly"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 4530892B2B52725700E199B9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4HT2BE32MC; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.elly.CountApp-EllyTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CountApp_Elly.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/CountApp_Elly"; + }; + name = Debug; + }; + 4530892C2B52725700E199B9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4HT2BE32MC; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.elly.CountApp-EllyTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CountApp_Elly.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/CountApp_Elly"; + }; + name = Release; + }; + 4530892E2B52725700E199B9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4HT2BE32MC; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.elly.CountApp-EllyUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = CountApp_Elly; + }; + name = Debug; + }; + 4530892F2B52725700E199B9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4HT2BE32MC; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.elly.CountApp-EllyUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = CountApp_Elly; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 453088FE2B52725500E199B9 /* Build configuration list for PBXProject "CountApp_Elly" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 453089252B52725700E199B9 /* Debug */, + 453089262B52725700E199B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 453089272B52725700E199B9 /* Build configuration list for PBXNativeTarget "CountApp_Elly" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 453089282B52725700E199B9 /* Debug */, + 453089292B52725700E199B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4530892A2B52725700E199B9 /* Build configuration list for PBXNativeTarget "CountApp_EllyTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4530892B2B52725700E199B9 /* Debug */, + 4530892C2B52725700E199B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4530892D2B52725700E199B9 /* Build configuration list for PBXNativeTarget "CountApp_EllyUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4530892E2B52725700E199B9 /* Debug */, + 4530892F2B52725700E199B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 453089302B5275CD00E199B9 /* XCRemoteSwiftPackageReference "swift-composable-architecture" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/pointfreeco/swift-composable-architecture.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.6.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 453089312B5275CD00E199B9 /* ComposableArchitecture */ = { + isa = XCSwiftPackageProductDependency; + package = 453089302B5275CD00E199B9 /* XCRemoteSwiftPackageReference "swift-composable-architecture" */; + productName = ComposableArchitecture; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 453088FB2B52725500E199B9 /* Project object */; +} diff --git a/CountApp_Elly/CountApp_Elly.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/CountApp_Elly/CountApp_Elly.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/CountApp_Elly/CountApp_Elly.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/CountApp_Elly/CountApp_Elly.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/CountApp_Elly/CountApp_Elly.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/CountApp_Elly/CountApp_Elly.xcodeproj/xcuserdata/elly.xcuserdatad/xcschemes/xcschememanagement.plist b/CountApp_Elly/CountApp_Elly.xcodeproj/xcuserdata/elly.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..0b04ebc --- /dev/null +++ b/CountApp_Elly/CountApp_Elly.xcodeproj/xcuserdata/elly.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + CountApp_Elly.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/AccentColor.colorset/Contents.json b/CountApp_Elly/CountApp_Elly/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/AppIcon.appiconset/Contents.json b/CountApp_Elly/CountApp_Elly/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/Contents.json b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/Contents.json b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/Contents.json new file mode 100644 index 0000000..008abab --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "americano.jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "americano 1.jpeg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "americano 2.jpeg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/americano 1.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/americano 1.jpeg new file mode 100644 index 0000000..6acc5af Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/americano 1.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/americano 2.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/americano 2.jpeg new file mode 100644 index 0000000..6acc5af Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/americano 2.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/americano.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/americano.jpeg new file mode 100644 index 0000000..6acc5af Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_americano.imageset/americano.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/Contents.json b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/Contents.json new file mode 100644 index 0000000..0509a88 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "caramel_macchiato.jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "caramel_macchiato 1.jpeg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "caramel_macchiato 2.jpeg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/caramel_macchiato 1.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/caramel_macchiato 1.jpeg new file mode 100644 index 0000000..0817778 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/caramel_macchiato 1.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/caramel_macchiato 2.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/caramel_macchiato 2.jpeg new file mode 100644 index 0000000..0817778 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/caramel_macchiato 2.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/caramel_macchiato.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/caramel_macchiato.jpeg new file mode 100644 index 0000000..0817778 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_caramel_macchiato.imageset/caramel_macchiato.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/Contents.json b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/Contents.json new file mode 100644 index 0000000..d072e64 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "hazelnut_latte.jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "hazelnut_latte 1.jpeg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "hazelnut_latte 2.jpeg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/hazelnut_latte 1.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/hazelnut_latte 1.jpeg new file mode 100644 index 0000000..330eec0 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/hazelnut_latte 1.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/hazelnut_latte 2.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/hazelnut_latte 2.jpeg new file mode 100644 index 0000000..330eec0 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/hazelnut_latte 2.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/hazelnut_latte.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/hazelnut_latte.jpeg new file mode 100644 index 0000000..330eec0 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_hazelnut.imageset/hazelnut_latte.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/Contents.json b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/Contents.json new file mode 100644 index 0000000..fcc1c2d --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "latte.jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "latte 1.jpeg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "latte 2.jpeg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/latte 1.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/latte 1.jpeg new file mode 100644 index 0000000..a2411e3 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/latte 1.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/latte 2.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/latte 2.jpeg new file mode 100644 index 0000000..a2411e3 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/latte 2.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/latte.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/latte.jpeg new file mode 100644 index 0000000..a2411e3 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_latte.imageset/latte.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/Contents.json b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/Contents.json new file mode 100644 index 0000000..afb852c --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "moca.jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "moca 1.jpeg", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "moca 2.jpeg", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/moca 1.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/moca 1.jpeg new file mode 100644 index 0000000..95e33d2 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/moca 1.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/moca 2.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/moca 2.jpeg new file mode 100644 index 0000000..95e33d2 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/moca 2.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/moca.jpeg b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/moca.jpeg new file mode 100644 index 0000000..95e33d2 Binary files /dev/null and b/CountApp_Elly/CountApp_Elly/Assets.xcassets/CoffeeMenu/img_mocha.imageset/moca.jpeg differ diff --git a/CountApp_Elly/CountApp_Elly/Assets.xcassets/Contents.json b/CountApp_Elly/CountApp_Elly/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_Elly/CountApp_EllyApp.swift b/CountApp_Elly/CountApp_Elly/CountApp_EllyApp.swift new file mode 100644 index 0000000..e1f2d8b --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/CountApp_EllyApp.swift @@ -0,0 +1,18 @@ +// +// CountApp_EllyApp.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import SwiftUI +import ComposableArchitecture + +@main +struct CountApp_EllyApp: App { + var body: some Scene { + WindowGroup { + CounterAppView(store: Store(initialState: CounterAppStore.State(), reducer: { CounterAppStore() })) + } + } +} diff --git a/CountApp_Elly/CountApp_Elly/Domain/CoffeeMenu/CoffeeMenuView.swift b/CountApp_Elly/CountApp_Elly/Domain/CoffeeMenu/CoffeeMenuView.swift new file mode 100644 index 0000000..c2ce944 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Domain/CoffeeMenu/CoffeeMenuView.swift @@ -0,0 +1,36 @@ +// +// CoffeeMenuView.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import SwiftUI +import ComposableArchitecture + +struct CoffeeMenuView: View { + @ObservedObject var viewStore: ViewStore + + var body: some View { + NavigationView { + VStack(alignment: .leading, spacing: 0) { + ForEach(viewStore.listOfMenu.indices, id: \.self) { index in + MenuItemView(viewStore: viewStore, index: index) + .frame(maxWidth: .infinity) + .onTapGesture { + viewStore.send(.menuTapped(index, 1)) + } + .contextMenu { + CoffeeMenuContextView(viewStore: viewStore, index: index) + } + } + } + .navigationTitle(String(localized: "title_coffee_menu_counting")) + .navigationBarTitleDisplayMode(.inline) + } + } +} + +//#Preview { +// CoffeeMenuView() +//} diff --git a/CountApp_Elly/CountApp_Elly/Domain/CoffeeMenu/Subviews/CoffeeMenuContextView.swift b/CountApp_Elly/CountApp_Elly/Domain/CoffeeMenu/Subviews/CoffeeMenuContextView.swift new file mode 100644 index 0000000..7423fc0 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Domain/CoffeeMenu/Subviews/CoffeeMenuContextView.swift @@ -0,0 +1,40 @@ +// +// CoffeeMenuContextView.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import SwiftUI +import ComposableArchitecture + +struct CoffeeMenuContextView: View { + @ObservedObject var viewStore: ViewStore + var index: Int + + var body: some View { + Button { + viewStore.send(.removeMenuCounting(index)) + } label: { + Text(String(localized: "text_reset")) + } + + Button { + viewStore.send(.menuTapped(index, 1)) + } label: { + Text("+1") + } + + Button { + viewStore.send(.menuTapped(index, 5)) + } label: { + Text("+5") + } + + Button { + viewStore.send(.menuTapped(index, 10)) + } label: { + Text("+10") + } + } +} diff --git a/CountApp_Elly/CountApp_Elly/Domain/CoffeeMenu/Subviews/MenuItemView.swift b/CountApp_Elly/CountApp_Elly/Domain/CoffeeMenu/Subviews/MenuItemView.swift new file mode 100644 index 0000000..a2317bd --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Domain/CoffeeMenu/Subviews/MenuItemView.swift @@ -0,0 +1,39 @@ +// +// MenuItemView.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import SwiftUI +import ComposableArchitecture + +struct MenuItemView: View { + @ObservedObject var viewStore: ViewStore + var index: Int + private var menu: any CoffeeMenu { + return viewStore.listOfMenu[index] + } + + var body: some View { + ZStack { + Color(hex: menu.backgroundColor()) + Image(menu.icon()) + .cornerRadius(25) + HStack { + Spacer() + if viewStore.isShowMenuCounting && viewStore.indexOfTapped == index { + Text("+\(menu.tapCount)") + .font(.system(size: 20, weight: .bold)) + .foregroundStyle(Color(hex: 0x283618)) + .onAppear(perform: { + Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { timer in + viewStore.send(.hideMenuCounting) + } + }) + } + } + .padding(.trailing, 20) + } + } +} diff --git a/CountApp_Elly/CountApp_Elly/Domain/Home/CounterAppStore.swift b/CountApp_Elly/CountApp_Elly/Domain/Home/CounterAppStore.swift new file mode 100644 index 0000000..353b60d --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Domain/Home/CounterAppStore.swift @@ -0,0 +1,56 @@ +// +// CounterAppStore.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import ComposableArchitecture + +@Reducer +struct CounterAppStore { + struct State: Equatable { + var listOfMenu: [any CoffeeMenu] = [ + Americano(), Latte(), CaramelMacchiato(), Mocha(), Hazelnut() + ] + var indexOfTapped: Int = 0 + var isShowMenuCounting: Bool = false + static func == (lhs: CounterAppStore.State, rhs: CounterAppStore.State) -> Bool { + return false + } + } + + enum Action { + case menuTapped(_ index: Int, _ count: Int) + case hideMenuCounting + case addCount(_ count: Int) + case setShowMenuCounting + case removeAllMenuCounting + case removeMenuCounting(_ index: Int) + } + + var body: some Reducer { + Reduce { state, action in + switch action { + case .menuTapped(let index, let count): + state.indexOfTapped = index + return .send(.addCount(count)) + case .addCount(let count): + state.listOfMenu[state.indexOfTapped].addCount(count) + return .send(.setShowMenuCounting) + case .setShowMenuCounting: + state.isShowMenuCounting = true + return .none + case .hideMenuCounting: + state.isShowMenuCounting = false + return .none + case .removeAllMenuCounting: + _ = state.listOfMenu.compactMap { $0.resetCount() } + return .none + case .removeMenuCounting(let index): + _ = state.listOfMenu[index].resetCount() + return .none + } + } + } +} diff --git a/CountApp_Elly/CountApp_Elly/Domain/Home/CounterAppView.swift b/CountApp_Elly/CountApp_Elly/Domain/Home/CounterAppView.swift new file mode 100644 index 0000000..37640e2 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Domain/Home/CounterAppView.swift @@ -0,0 +1,35 @@ +// +// CounterAppView.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import SwiftUI +import ComposableArchitecture + +struct CounterAppView: View { + let store: Store + @ObservedObject var viewStore: ViewStore + + public init(store: Store) { + self.store = store + viewStore = ViewStore(store, observe: { $0 }) + } + + var body: some View { + TabView { + CoffeeMenuView(viewStore: viewStore) + .tabItem { + Image(systemName: "cup.and.saucer") + Text(String(localized: "title_coffee_menu_counting")) + } + TapCountingView(viewStore: viewStore) + .tabItem { + Image(systemName: "chart.bar") + Text(String(localized: "title_tap_counting")) + } + } + .font(.headline) + } +} diff --git a/CountApp_Elly/CountApp_Elly/Domain/TapCounting/Subviews/CountingItemView.swift b/CountApp_Elly/CountApp_Elly/Domain/TapCounting/Subviews/CountingItemView.swift new file mode 100644 index 0000000..437efb7 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Domain/TapCounting/Subviews/CountingItemView.swift @@ -0,0 +1,34 @@ +// +// CountingItemView.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import SwiftUI +import ComposableArchitecture + +struct CountingItemView: View { + @ObservedObject var viewStore: ViewStore + var index: Int + private var menu: any CoffeeMenu { + return viewStore.listOfMenu[index] + } + + var body: some View { + ZStack { + Color(hex: menu.backgroundColor()) + Text(menu.title()) + HStack { + Spacer() + Text(String(format: String(localized: "%dpoint"), menu.tapCount)) + .font(.system(size: 15, weight: .bold)) + .foregroundStyle(Color(hex: 0x283618)) + + } + .padding(.trailing, 20) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + .frame(height: 60) + } +} diff --git a/CountApp_Elly/CountApp_Elly/Domain/TapCounting/Subviews/TapCountingContextView.swift b/CountApp_Elly/CountApp_Elly/Domain/TapCounting/Subviews/TapCountingContextView.swift new file mode 100644 index 0000000..9014c5e --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Domain/TapCounting/Subviews/TapCountingContextView.swift @@ -0,0 +1,51 @@ +// +// TapCountingContextView.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import SwiftUI +import ComposableArchitecture + +struct TapCountingContextView: View { + @ObservedObject var viewStore: ViewStore + + var body: some View { + Button(action: { + viewStore.send(.removeAllMenuCounting) + }, label: { + Text(String(localized: "text_all_reset")) + }) + + Button(action: { + viewStore.send(.removeMenuCounting(0)) + }, label: { + Text(String(localized: "text_reset_americano")) + }) + + Button(action: { + viewStore.send(.removeMenuCounting(1)) + }, label: { + Text(String(localized: "text_reset_latte")) + }) + + Button(action: { + viewStore.send(.removeMenuCounting(2)) + }, label: { + Text(String(localized: "text_reset_caramel_macchiato")) + }) + + Button(action: { + viewStore.send(.removeMenuCounting(3)) + }, label: { + Text(String(localized: "text_reset_mocha")) + }) + + Button(action: { + viewStore.send(.removeMenuCounting(4)) + }, label: { + Text(String(localized: "text_reset_hazelnut")) + }) + } +} diff --git a/CountApp_Elly/CountApp_Elly/Domain/TapCounting/TapCountingView.swift b/CountApp_Elly/CountApp_Elly/Domain/TapCounting/TapCountingView.swift new file mode 100644 index 0000000..3225312 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Domain/TapCounting/TapCountingView.swift @@ -0,0 +1,38 @@ +// +// TapCountingView.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import SwiftUI +import ComposableArchitecture + +struct TapCountingView: View { + @ObservedObject var viewStore: ViewStore + + var body: some View { + NavigationView { + VStack { + VStack(alignment: .leading, spacing: 0) { + ForEach(viewStore.listOfMenu.indices, id: \.self) { index in + CountingItemView(viewStore: viewStore, index: index) + .padding(.all, 5) + } + } + Spacer() + } + .navigationTitle(String(localized: "title_tap_counting")) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Menu(content: { + TapCountingContextView(viewStore: viewStore) + }, label: { + Image(systemName: "gearshape") + }) + } + } + } + } +} diff --git a/CountApp_Elly/CountApp_Elly/Extension/Color+.swift b/CountApp_Elly/CountApp_Elly/Extension/Color+.swift new file mode 100644 index 0000000..ed8d02a --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Extension/Color+.swift @@ -0,0 +1,17 @@ +// +// Color+.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import SwiftUI + +extension Color { + init(hex: Int, opacity: Double = 1.0) { + let red = Double((hex & 0xff0000) >> 16) / 255.0 + let green = Double((hex & 0xff00) >> 8) / 255.0 + let blue = Double((hex & 0xff) >> 0) / 255.0 + self.init(.sRGB, red: red, green: green, blue: blue, opacity: opacity) + } +} diff --git a/CountApp_Elly/CountApp_Elly/Localizable.xcstrings b/CountApp_Elly/CountApp_Elly/Localizable.xcstrings new file mode 100644 index 0000000..6980fc7 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Localizable.xcstrings @@ -0,0 +1,168 @@ +{ + "sourceLanguage" : "ko", + "strings" : { + "%dpoint" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%d점" + } + } + } + }, + "+%lld" : { + + }, + "+1" : { + + }, + "+5" : { + + }, + "+10" : { + + }, + "menu_americano" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "아메리카노" + } + } + } + }, + "menu_caramel_macchiato" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "카라멜 마키아또" + } + } + } + }, + "menu_hazelnut" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "헤이즐넛 라떼" + } + } + } + }, + "menu_latte" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "라떼" + } + } + } + }, + "menu_mocha" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "카페 모카" + } + } + } + }, + "text_all_reset" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "모두 초기화" + } + } + } + }, + "text_reset" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "초기화" + } + } + } + }, + "text_reset_americano" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "아메리카노 초기화" + } + } + } + }, + "text_reset_caramel_macchiato" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "카라멜 마끼아또 초기화" + } + } + } + }, + "text_reset_hazelnut" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "헤이즐넛 라떼 초기화" + } + } + } + }, + "text_reset_latte" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "카페 라떼 초기화" + } + } + } + }, + "text_reset_mocha" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "카페 모카 초기화" + } + } + } + }, + "title_coffee_menu_counting" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "커피메뉴 카운팅" + } + } + } + }, + "title_tap_counting" : { + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "탭 횟수" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Americano.swift b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Americano.swift new file mode 100644 index 0000000..74a4283 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Americano.swift @@ -0,0 +1,33 @@ +// +// Americano.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import Foundation + +class Americano: CoffeeMenu { + var id = UUID() + private(set) var tapCount: Int = 0 + + func title() -> String { + return String(localized: "menu_americano") + } + + func icon() -> String { + return "img_americano" + } + + func backgroundColor() -> Int { + return 0xd4a373 + } + + func addCount(_ number: Int) { + self.tapCount += number + } + + func resetCount() { + self.tapCount = 0 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/CaramelMacchiato.swift b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/CaramelMacchiato.swift new file mode 100644 index 0000000..d0d034f --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/CaramelMacchiato.swift @@ -0,0 +1,33 @@ +// +// CaramelMacchiato.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import Foundation + +class CaramelMacchiato: CoffeeMenu { + var id = UUID() + private(set) var tapCount: Int = 0 + + func title() -> String { + return String(localized: "menu_caramel_macchiato") + } + + func icon() -> String { + return "img_caramel_macchiato" + } + + func backgroundColor() -> Int { + return 0xfefae0 + } + + func addCount(_ number: Int) { + self.tapCount += number + } + + func resetCount() { + self.tapCount = 0 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Hazelnut.swift b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Hazelnut.swift new file mode 100644 index 0000000..177eca4 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Hazelnut.swift @@ -0,0 +1,33 @@ +// +// Hazelnut.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import Foundation + +class Hazelnut: CoffeeMenu { + var id = UUID() + private(set) var tapCount: Int = 0 + + func title() -> String { + return String(localized: "menu_hazelnut") + } + + func icon() -> String { + return "img_hazelnut" + } + + func backgroundColor() -> Int { + return 0xccd5ae + } + + func addCount(_ number: Int) { + self.tapCount += number + } + + func resetCount() { + self.tapCount = 0 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Latte.swift b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Latte.swift new file mode 100644 index 0000000..2f8aed7 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Latte.swift @@ -0,0 +1,33 @@ +// +// Latte.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import Foundation + +class Latte: CoffeeMenu { + var id = UUID() + private(set) var tapCount: Int = 0 + + func title() -> String { + return String(localized: "menu_latte") + } + + func icon() -> String { + return "img_latte" + } + + func backgroundColor() -> Int { + return 0xfaedcd + } + + func addCount(_ number: Int) { + self.tapCount += number + } + + func resetCount() { + self.tapCount = 0 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Menu.swift b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Menu.swift new file mode 100644 index 0000000..ed936e1 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Menu.swift @@ -0,0 +1,18 @@ +// +// Menu.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import Foundation + +protocol CoffeeMenu: Identifiable { + var id: UUID { get } + var tapCount: Int { get } + func title() -> String + func icon() -> String + func backgroundColor() -> Int + func addCount(_ number: Int) + func resetCount() +} diff --git a/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Mocha.swift b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Mocha.swift new file mode 100644 index 0000000..9dcfc74 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Model/CoffeeMenu/Mocha.swift @@ -0,0 +1,33 @@ +// +// Mocha.swift +// CountApp_Elly +// +// Created by elly on 1/13/24. +// + +import Foundation + +class Mocha: CoffeeMenu { + var id = UUID() + private(set) var tapCount: Int = 0 + + func title() -> String { + return String(localized: "menu_mocha") + } + + func icon() -> String { + return "img_mocha" + } + + func backgroundColor() -> Int { + return 0xe9edc9 + } + + func addCount(_ number: Int) { + self.tapCount += number + } + + func resetCount() { + self.tapCount = 0 + } +} diff --git a/CountApp_Elly/CountApp_Elly/Preview Content/Preview Assets.xcassets/Contents.json b/CountApp_Elly/CountApp_Elly/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/CountApp_Elly/CountApp_Elly/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/CountApp_Elly/CountApp_EllyTests/CountApp_EllyTests.swift b/CountApp_Elly/CountApp_EllyTests/CountApp_EllyTests.swift new file mode 100644 index 0000000..52f5e2e --- /dev/null +++ b/CountApp_Elly/CountApp_EllyTests/CountApp_EllyTests.swift @@ -0,0 +1,36 @@ +// +// CountApp_EllyTests.swift +// CountApp_EllyTests +// +// Created by elly on 1/13/24. +// + +import XCTest +@testable import CountApp_Elly + +final class CountApp_EllyTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/CountApp_Elly/CountApp_EllyUITests/CountApp_EllyUITests.swift b/CountApp_Elly/CountApp_EllyUITests/CountApp_EllyUITests.swift new file mode 100644 index 0000000..1f4e2a3 --- /dev/null +++ b/CountApp_Elly/CountApp_EllyUITests/CountApp_EllyUITests.swift @@ -0,0 +1,41 @@ +// +// CountApp_EllyUITests.swift +// CountApp_EllyUITests +// +// Created by elly on 1/13/24. +// + +import XCTest + +final class CountApp_EllyUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } + } +} diff --git a/CountApp_Elly/CountApp_EllyUITests/CountApp_EllyUITestsLaunchTests.swift b/CountApp_Elly/CountApp_EllyUITests/CountApp_EllyUITestsLaunchTests.swift new file mode 100644 index 0000000..6b09421 --- /dev/null +++ b/CountApp_Elly/CountApp_EllyUITests/CountApp_EllyUITestsLaunchTests.swift @@ -0,0 +1,32 @@ +// +// CountApp_EllyUITestsLaunchTests.swift +// CountApp_EllyUITests +// +// Created by elly on 1/13/24. +// + +import XCTest + +final class CountApp_EllyUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +} diff --git a/img/countapp_elly.gif b/img/countapp_elly.gif new file mode 100644 index 0000000..74d72b6 Binary files /dev/null and b/img/countapp_elly.gif differ diff --git a/readme.md b/readme.md index 718f4d2..7303494 100644 --- a/readme.md +++ b/readme.md @@ -1 +1,40 @@ t + + +> Elly 구현 내용 + +- 기능 + - 탭바 구성 (커피메뉴 카운팅 / 탭 횟수) + - 커피메뉴 카운팅 탭 + - 각 메뉴를 누를 때마다 카운팅이 1씩 올라감 + - 커피 메뉴 종류 + - 아메리카노 + - 카페 라떼 + - 카라멜 마끼아토 + - 바닐라 라떼 + - 헤이즐넛 라떼 + - 딥 프레싱을 하면 컨텍스트 메뉴가 나옴 + - 컨텍스트 메뉴 내용 + - 모두 초기화 + - +1 + - +5 + - +10 + - 탭 횟수 탭 + - 커피메뉴 카운팅에서 누른 횟수를 정리해 보여줌 + - 네비게이션 바 오른쪽에 설정 아이콘 + - 아이콘 누르면 컨텍스트 메뉴 뜸 + - 컨텍스트 메뉴 내용 + - 모두 초기화 + - 아메리카노 초기화 + - 카페 라떼 초기화 + - 카라멜 마끼아또 초기화 + - 바닐라 라떼 초기화 + - 헤이즐넛 라떼 초기화 + - 기타 + - 커피메뉴 카운팅의 경우 메뉴가 이미지로 구성 + - 커피메뉴 누를 때 색상 변경 및 현재 카운팅 숫자 나타남 -> 1초 후 사라짐 + - 타이틀 : 각 탭 바 타이틀 + +- 구현 미리보기 + +