diff --git a/SideDishApp/.DS_Store b/SideDishApp/.DS_Store new file mode 100644 index 000000000..ac353fe41 Binary files /dev/null and b/SideDishApp/.DS_Store differ diff --git a/SideDishApp/Podfile b/SideDishApp/Podfile new file mode 100644 index 000000000..9b7400c0f --- /dev/null +++ b/SideDishApp/Podfile @@ -0,0 +1,12 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'SideDishApp' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for SideDishApp + + pod 'Toast-Swift', '~> 5.0.1' + +end diff --git a/SideDishApp/Podfile.lock b/SideDishApp/Podfile.lock new file mode 100644 index 000000000..b94bbde0e --- /dev/null +++ b/SideDishApp/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - Toast-Swift (5.0.1) + +DEPENDENCIES: + - Toast-Swift (~> 5.0.1) + +SPEC REPOS: + trunk: + - Toast-Swift + +SPEC CHECKSUMS: + Toast-Swift: 9b6a70f28b3bf0b96c40d46c0c4b9d6639846711 + +PODFILE CHECKSUM: bcdbceab1bc9b42ae0eb2250656ec728644ed17a + +COCOAPODS: 1.10.1 diff --git a/SideDishApp/Pods/Manifest.lock b/SideDishApp/Pods/Manifest.lock new file mode 100644 index 000000000..b94bbde0e --- /dev/null +++ b/SideDishApp/Pods/Manifest.lock @@ -0,0 +1,16 @@ +PODS: + - Toast-Swift (5.0.1) + +DEPENDENCIES: + - Toast-Swift (~> 5.0.1) + +SPEC REPOS: + trunk: + - Toast-Swift + +SPEC CHECKSUMS: + Toast-Swift: 9b6a70f28b3bf0b96c40d46c0c4b9d6639846711 + +PODFILE CHECKSUM: bcdbceab1bc9b42ae0eb2250656ec728644ed17a + +COCOAPODS: 1.10.1 diff --git a/SideDishApp/Pods/Pods.xcodeproj/project.pbxproj b/SideDishApp/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 000000000..9ee9d8ab2 --- /dev/null +++ b/SideDishApp/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,610 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 0544331B64997483CB81D24779976B12 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 31FE7C6ECA71C614A5A667C679B23874 /* Foundation.framework */; }; + 2024EE5E265681137A9FEBC630E6E0F1 /* Toast-Swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E15AC60C991B08D578D75E5D7EABB64 /* Toast-Swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4753716AE7A1AB22FB6BA61AA74D942F /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = F318FE758DBBEDD53C43B7374CF4B0EF /* Toast.swift */; }; + 6B326644BB08AEDF697A82A0F1A66D68 /* Toast-Swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E6FCD31C4EE1DA60FB90F8B432CDE1C /* Toast-Swift-dummy.m */; }; + 753C8C42CEFBED94E1F1E752955F0254 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 31FE7C6ECA71C614A5A667C679B23874 /* Foundation.framework */; }; + 7F046CCD3CFA3AC3EE390685DD4B528D /* Pods-SideDishApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CCF25B7DB8D667AE393C11E77BE319AD /* Pods-SideDishApp-dummy.m */; }; + CD94E769E8CF925559BB67ED2FD8940E /* Pods-SideDishApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DECF379F04EC5C28957F1D0B0AA99373 /* Pods-SideDishApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E30AFF09BE355906C38B27B0CD35F806 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FEFE490E4A06D19E868B2B9014BB8BF /* QuartzCore.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 9CB80EB1A7B49893B360727294C72B67 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B990BD87169C76A3ED3FE8A9258D91A3; + remoteInfo = "Toast-Swift"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0A789C6DECC324202E565343211304DE /* Pods-SideDishApp-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SideDishApp-acknowledgements.plist"; sourceTree = ""; }; + 0E6FCD31C4EE1DA60FB90F8B432CDE1C /* Toast-Swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-Swift-dummy.m"; sourceTree = ""; }; + 1E15AC60C991B08D578D75E5D7EABB64 /* Toast-Swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-Swift-umbrella.h"; sourceTree = ""; }; + 25039F7BEC4628E58D8FA03887D4102C /* Pods-SideDishApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SideDishApp.debug.xcconfig"; sourceTree = ""; }; + 2976B0134E79F013D43DD21DA35DB5F9 /* Pods-SideDishApp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-SideDishApp.modulemap"; sourceTree = ""; }; + 2F50B18C74D2D97745E4801987A30384 /* Toast-Swift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Toast-Swift-Info.plist"; sourceTree = ""; }; + 2FEFE490E4A06D19E868B2B9014BB8BF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 31FE7C6ECA71C614A5A667C679B23874 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 3B2845562E646CF443B9CC526C2668A3 /* Toast-Swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Toast-Swift.debug.xcconfig"; sourceTree = ""; }; + 4007A72BDCD28826D29D220D8AF11806 /* Toast-Swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Toast-Swift.release.xcconfig"; sourceTree = ""; }; + 5FBC7B7D13B30930168B88E63ECB1846 /* Pods-SideDishApp-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SideDishApp-frameworks.sh"; sourceTree = ""; }; + 63984B43E35D0FE1BBF58F2BD32F2657 /* Pods-SideDishApp-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SideDishApp-Info.plist"; sourceTree = ""; }; + 7E2E5146BA112427FEF4F0F97CA5D11D /* Pods_SideDishApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_SideDishApp.framework; path = "Pods-SideDishApp.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 825B95930816FF3991519AC0ED095A7F /* Toast-Swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Toast-Swift.modulemap"; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + BF1E10D2888B2F7C3435BFF6A7F4667A /* Toast-Swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-Swift-prefix.pch"; sourceTree = ""; }; + CCF25B7DB8D667AE393C11E77BE319AD /* Pods-SideDishApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-SideDishApp-dummy.m"; sourceTree = ""; }; + D4CF6D4FED9B23D8523666D695542867 /* Pods-SideDishApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-SideDishApp-acknowledgements.markdown"; sourceTree = ""; }; + D6043471C96F93DC41F7DD1E0D7D8B35 /* Toast_Swift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Toast_Swift.framework; path = "Toast-Swift.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + DECF379F04EC5C28957F1D0B0AA99373 /* Pods-SideDishApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-SideDishApp-umbrella.h"; sourceTree = ""; }; + F318FE758DBBEDD53C43B7374CF4B0EF /* Toast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Toast.swift; path = Toast/Toast.swift; sourceTree = ""; }; + F5608B321915F31C4312BCF29ED24DDD /* Pods-SideDishApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SideDishApp.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6102CF7EA55F5A7D669F88BF0D1A701F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 753C8C42CEFBED94E1F1E752955F0254 /* Foundation.framework in Frameworks */, + E30AFF09BE355906C38B27B0CD35F806 /* QuartzCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6B57BAC9C9DFA85E36C9FC50718B7B6C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0544331B64997483CB81D24779976B12 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 01B6499BB351F4D13DA64A16EF49B6FC /* Pods */ = { + isa = PBXGroup; + children = ( + E4DD821E3F92A576E63FCE4FAEA66257 /* Toast-Swift */, + ); + name = Pods; + sourceTree = ""; + }; + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D325A42620E7427FB70FB046C7B7B240 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 2E7C0C8FBAB0435026A680ED5BD9C42C /* Products */ = { + isa = PBXGroup; + children = ( + 7E2E5146BA112427FEF4F0F97CA5D11D /* Pods_SideDishApp.framework */, + D6043471C96F93DC41F7DD1E0D7D8B35 /* Toast_Swift.framework */, + ); + name = Products; + sourceTree = ""; + }; + 309A74E340FC2AEB4CA0163593D8595A /* Pods-SideDishApp */ = { + isa = PBXGroup; + children = ( + 2976B0134E79F013D43DD21DA35DB5F9 /* Pods-SideDishApp.modulemap */, + D4CF6D4FED9B23D8523666D695542867 /* Pods-SideDishApp-acknowledgements.markdown */, + 0A789C6DECC324202E565343211304DE /* Pods-SideDishApp-acknowledgements.plist */, + CCF25B7DB8D667AE393C11E77BE319AD /* Pods-SideDishApp-dummy.m */, + 5FBC7B7D13B30930168B88E63ECB1846 /* Pods-SideDishApp-frameworks.sh */, + 63984B43E35D0FE1BBF58F2BD32F2657 /* Pods-SideDishApp-Info.plist */, + DECF379F04EC5C28957F1D0B0AA99373 /* Pods-SideDishApp-umbrella.h */, + 25039F7BEC4628E58D8FA03887D4102C /* Pods-SideDishApp.debug.xcconfig */, + F5608B321915F31C4312BCF29ED24DDD /* Pods-SideDishApp.release.xcconfig */, + ); + name = "Pods-SideDishApp"; + path = "Target Support Files/Pods-SideDishApp"; + sourceTree = ""; + }; + 33766B3047DCD86835C369640F8DC357 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 309A74E340FC2AEB4CA0163593D8595A /* Pods-SideDishApp */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + ADB41ECB626BC7FC84F0B17847BEB04F /* Support Files */ = { + isa = PBXGroup; + children = ( + 825B95930816FF3991519AC0ED095A7F /* Toast-Swift.modulemap */, + 0E6FCD31C4EE1DA60FB90F8B432CDE1C /* Toast-Swift-dummy.m */, + 2F50B18C74D2D97745E4801987A30384 /* Toast-Swift-Info.plist */, + BF1E10D2888B2F7C3435BFF6A7F4667A /* Toast-Swift-prefix.pch */, + 1E15AC60C991B08D578D75E5D7EABB64 /* Toast-Swift-umbrella.h */, + 3B2845562E646CF443B9CC526C2668A3 /* Toast-Swift.debug.xcconfig */, + 4007A72BDCD28826D29D220D8AF11806 /* Toast-Swift.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/Toast-Swift"; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, + 01B6499BB351F4D13DA64A16EF49B6FC /* Pods */, + 2E7C0C8FBAB0435026A680ED5BD9C42C /* Products */, + 33766B3047DCD86835C369640F8DC357 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D325A42620E7427FB70FB046C7B7B240 /* iOS */ = { + isa = PBXGroup; + children = ( + 31FE7C6ECA71C614A5A667C679B23874 /* Foundation.framework */, + 2FEFE490E4A06D19E868B2B9014BB8BF /* QuartzCore.framework */, + ); + name = iOS; + sourceTree = ""; + }; + E4DD821E3F92A576E63FCE4FAEA66257 /* Toast-Swift */ = { + isa = PBXGroup; + children = ( + F318FE758DBBEDD53C43B7374CF4B0EF /* Toast.swift */, + ADB41ECB626BC7FC84F0B17847BEB04F /* Support Files */, + ); + name = "Toast-Swift"; + path = "Toast-Swift"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 541A0721D8D26374CF7CF04B1473A45A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 2024EE5E265681137A9FEBC630E6E0F1 /* Toast-Swift-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CFB6BC1BE14D9DBE18F75852F469AD3B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + CD94E769E8CF925559BB67ED2FD8940E /* Pods-SideDishApp-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 9D5BAF8DC907111EE9B1AFF2E129B815 /* Pods-SideDishApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3C9CB781D90944DF3E41111FE0CA37B0 /* Build configuration list for PBXNativeTarget "Pods-SideDishApp" */; + buildPhases = ( + CFB6BC1BE14D9DBE18F75852F469AD3B /* Headers */, + 24E53F0CE92F1050F09D638735CF32F1 /* Sources */, + 6B57BAC9C9DFA85E36C9FC50718B7B6C /* Frameworks */, + E9753324C70C95951DA187EFBD9B1D7D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + CA7D71B3DC006332DAA7CEBCA096308B /* PBXTargetDependency */, + ); + name = "Pods-SideDishApp"; + productName = "Pods-SideDishApp"; + productReference = 7E2E5146BA112427FEF4F0F97CA5D11D /* Pods_SideDishApp.framework */; + productType = "com.apple.product-type.framework"; + }; + B990BD87169C76A3ED3FE8A9258D91A3 /* Toast-Swift */ = { + isa = PBXNativeTarget; + buildConfigurationList = B8C401847A53B4C2810311A8CBD715AD /* Build configuration list for PBXNativeTarget "Toast-Swift" */; + buildPhases = ( + 541A0721D8D26374CF7CF04B1473A45A /* Headers */, + 32133C6B0EACD421CB9EB1ABFCE89B97 /* Sources */, + 6102CF7EA55F5A7D669F88BF0D1A701F /* Frameworks */, + 8812DCC289D1E7BE07818E350A3B8656 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Toast-Swift"; + productName = "Toast-Swift"; + productReference = D6043471C96F93DC41F7DD1E0D7D8B35 /* Toast_Swift.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = 2E7C0C8FBAB0435026A680ED5BD9C42C /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9D5BAF8DC907111EE9B1AFF2E129B815 /* Pods-SideDishApp */, + B990BD87169C76A3ED3FE8A9258D91A3 /* Toast-Swift */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8812DCC289D1E7BE07818E350A3B8656 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E9753324C70C95951DA187EFBD9B1D7D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 24E53F0CE92F1050F09D638735CF32F1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7F046CCD3CFA3AC3EE390685DD4B528D /* Pods-SideDishApp-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 32133C6B0EACD421CB9EB1ABFCE89B97 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6B326644BB08AEDF697A82A0F1A66D68 /* Toast-Swift-dummy.m in Sources */, + 4753716AE7A1AB22FB6BA61AA74D942F /* Toast.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + CA7D71B3DC006332DAA7CEBCA096308B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Toast-Swift"; + target = B990BD87169C76A3ED3FE8A9258D91A3 /* Toast-Swift */; + targetProxy = 9CB80EB1A7B49893B360727294C72B67 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 03E76E2FE0A9366114F81640AA5875EA /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4007A72BDCD28826D29D220D8AF11806 /* Toast-Swift.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Toast-Swift/Toast-Swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Toast-Swift/Toast-Swift-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Toast-Swift/Toast-Swift.modulemap"; + PRODUCT_MODULE_NAME = Toast_Swift; + PRODUCT_NAME = Toast_Swift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 125C51B0F88E28C868DC90BD45E4E727 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "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 = 14.3; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 911DE61EA33B535BEACDF1278067FF9E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F5608B321915F31C4312BCF29ED24DDD /* Pods-SideDishApp.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-SideDishApp/Pods-SideDishApp-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 14.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-SideDishApp/Pods-SideDishApp.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 92A3E9AC052A7345115439021B218E3B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=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 = 14.3; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + C646B80E4D8A9B6FB6B471288AD9746F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3B2845562E646CF443B9CC526C2668A3 /* Toast-Swift.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Toast-Swift/Toast-Swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Toast-Swift/Toast-Swift-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Toast-Swift/Toast-Swift.modulemap"; + PRODUCT_MODULE_NAME = Toast_Swift; + PRODUCT_NAME = Toast_Swift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CE3F27A9F50053DF3ED2542D377FF1C1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 25039F7BEC4628E58D8FA03887D4102C /* Pods-SideDishApp.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-SideDishApp/Pods-SideDishApp-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 14.3; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-SideDishApp/Pods-SideDishApp.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3C9CB781D90944DF3E41111FE0CA37B0 /* Build configuration list for PBXNativeTarget "Pods-SideDishApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CE3F27A9F50053DF3ED2542D377FF1C1 /* Debug */, + 911DE61EA33B535BEACDF1278067FF9E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 125C51B0F88E28C868DC90BD45E4E727 /* Debug */, + 92A3E9AC052A7345115439021B218E3B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B8C401847A53B4C2810311A8CBD715AD /* Build configuration list for PBXNativeTarget "Toast-Swift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C646B80E4D8A9B6FB6B471288AD9746F /* Debug */, + 03E76E2FE0A9366114F81640AA5875EA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/SideDishApp/Pods/Pods.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/Pods-SideDishApp.xcscheme b/SideDishApp/Pods/Pods.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/Pods-SideDishApp.xcscheme new file mode 100644 index 000000000..0cea68867 --- /dev/null +++ b/SideDishApp/Pods/Pods.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/Pods-SideDishApp.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SideDishApp/Pods/Pods.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/Toast-Swift.xcscheme b/SideDishApp/Pods/Pods.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/Toast-Swift.xcscheme new file mode 100644 index 000000000..f9889528f --- /dev/null +++ b/SideDishApp/Pods/Pods.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/Toast-Swift.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SideDishApp/Pods/Pods.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/xcschememanagement.plist b/SideDishApp/Pods/Pods.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..386ed40f9 --- /dev/null +++ b/SideDishApp/Pods/Pods.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,25 @@ + + + + + SchemeUserState + + Pods-SideDishApp.xcscheme + + isShown + + orderHint + 0 + + Toast-Swift.xcscheme + + isShown + + orderHint + 1 + + + SuppressBuildableAutocreation + + + diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-Info.plist b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-Info.plist new file mode 100644 index 000000000..2243fe6e2 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-acknowledgements.markdown b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-acknowledgements.markdown new file mode 100644 index 000000000..f10b0cea7 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-acknowledgements.markdown @@ -0,0 +1,27 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## Toast-Swift + +Copyright (c) 2015-2017 Charles Scalesse. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Generated by CocoaPods - https://cocoapods.org diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-acknowledgements.plist b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-acknowledgements.plist new file mode 100644 index 000000000..6d2841063 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-acknowledgements.plist @@ -0,0 +1,59 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2015-2017 Charles Scalesse. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + License + MIT + Title + Toast-Swift + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-dummy.m b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-dummy.m new file mode 100644 index 000000000..6ed23d647 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_SideDishApp : NSObject +@end +@implementation PodsDummy_Pods_SideDishApp +@end diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Debug-input-files.xcfilelist b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 000000000..3d7028ba6 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks.sh +${BUILT_PRODUCTS_DIR}/Toast-Swift/Toast_Swift.framework \ No newline at end of file diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Debug-output-files.xcfilelist b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 000000000..337e6e0e3 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Toast_Swift.framework \ No newline at end of file diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Release-input-files.xcfilelist b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Release-input-files.xcfilelist new file mode 100644 index 000000000..3d7028ba6 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks.sh +${BUILT_PRODUCTS_DIR}/Toast-Swift/Toast_Swift.framework \ No newline at end of file diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Release-output-files.xcfilelist b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Release-output-files.xcfilelist new file mode 100644 index 000000000..337e6e0e3 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-Release-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Toast_Swift.framework \ No newline at end of file diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks.sh b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks.sh new file mode 100755 index 000000000..34750d103 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks.sh @@ -0,0 +1,185 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +BCSYMBOLMAP_DIR="BCSymbolMaps" + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then + # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied + find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do + echo "Installing $f" + install_bcsymbolmap "$f" "$destination" + rm "$f" + done + rmdir "${source}/${BCSYMBOLMAP_DIR}" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures from the dSYM. + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + if [[ $STRIP_BINARY_RETVAL == 0 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=1 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=0 +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/Toast-Swift/Toast_Swift.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/Toast-Swift/Toast_Swift.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-umbrella.h b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-umbrella.h new file mode 100644 index 000000000..8e87de6b6 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_SideDishAppVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_SideDishAppVersionString[]; + diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp.debug.xcconfig b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp.debug.xcconfig new file mode 100644 index 000000000..797a888fc --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp.debug.xcconfig @@ -0,0 +1,14 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift/Toast_Swift.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "QuartzCore" -framework "Toast_Swift" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp.modulemap b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp.modulemap new file mode 100644 index 000000000..9ba19a004 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp.modulemap @@ -0,0 +1,6 @@ +framework module Pods_SideDishApp { + umbrella header "Pods-SideDishApp-umbrella.h" + + export * + module * { export * } +} diff --git a/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp.release.xcconfig b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp.release.xcconfig new file mode 100644 index 000000000..797a888fc --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Pods-SideDishApp/Pods-SideDishApp.release.xcconfig @@ -0,0 +1,14 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift/Toast_Swift.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "QuartzCore" -framework "Toast_Swift" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-Info.plist b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-Info.plist new file mode 100644 index 000000000..8d87a1ae9 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 5.0.1 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-dummy.m b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-dummy.m new file mode 100644 index 000000000..2962aa47f --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Toast_Swift : NSObject +@end +@implementation PodsDummy_Toast_Swift +@end diff --git a/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-prefix.pch b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-prefix.pch new file mode 100644 index 000000000..beb2a2441 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-umbrella.h b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-umbrella.h new file mode 100644 index 000000000..8abdfa083 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Toast_SwiftVersionNumber; +FOUNDATION_EXPORT const unsigned char Toast_SwiftVersionString[]; + diff --git a/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift.debug.xcconfig b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift.debug.xcconfig new file mode 100644 index 000000000..e918f50d4 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift.debug.xcconfig @@ -0,0 +1,13 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "QuartzCore" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Toast-Swift +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift.modulemap b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift.modulemap new file mode 100644 index 000000000..af3db9f59 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift.modulemap @@ -0,0 +1,6 @@ +framework module Toast_Swift { + umbrella header "Toast-Swift-umbrella.h" + + export * + module * { export * } +} diff --git a/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift.release.xcconfig b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift.release.xcconfig new file mode 100644 index 000000000..e918f50d4 --- /dev/null +++ b/SideDishApp/Pods/Target Support Files/Toast-Swift/Toast-Swift.release.xcconfig @@ -0,0 +1,13 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_LDFLAGS = $(inherited) -framework "QuartzCore" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Toast-Swift +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/SideDishApp/Pods/Toast-Swift/LICENSE b/SideDishApp/Pods/Toast-Swift/LICENSE new file mode 100644 index 000000000..14ba7c72e --- /dev/null +++ b/SideDishApp/Pods/Toast-Swift/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2015-2017 Charles Scalesse. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/SideDishApp/Pods/Toast-Swift/README.md b/SideDishApp/Pods/Toast-Swift/README.md new file mode 100644 index 000000000..a99d68946 --- /dev/null +++ b/SideDishApp/Pods/Toast-Swift/README.md @@ -0,0 +1,135 @@ +Toast-Swift +============= + +[![Build Status](https://travis-ci.org/scalessec/Toast-Swift.svg?branch=master)](https://travis-ci.org/scalessec/Toast-Swift) +[![CocoaPods Version](https://img.shields.io/cocoapods/v/Toast-Swift.svg)](http://cocoadocs.org/docsets/Toast-Swift) +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) + +Toast-Swift is a Swift extension that adds toast notifications to the `UIView` object class. It is intended to be simple, lightweight, and easy to use. Most toast notifications can be triggered with a single line of code. + +**Toast-Swift is a native Swift port of [Toast for iOS](https://github.com/scalessec/Toast "Toast for iOS").** + +Screenshots +--------- +![Toast-Swift Screenshots](toast_swift_screenshot.jpg) + + +Basic Examples +--------- +```swift +// basic usage +self.view.makeToast("This is a piece of toast") + +// toast with a specific duration and position +self.view.makeToast("This is a piece of toast", duration: 3.0, position: .top) + +// toast presented with multiple options and with a completion closure +self.view.makeToast("This is a piece of toast", duration: 2.0, point: CGPoint(x: 110.0, y: 110.0), title: "Toast Title", image: UIImage(named: "toast.png")) { didTap in + if didTap { + print("completion from tap") + } else { + print("completion without tap") + } +} + +// display toast with an activity spinner +self.view.makeToastActivity(.center) + +// display any view as toast +self.view.showToast(myView) + +// immediately hides all toast views in self.view +self.view.hideAllToasts() +``` + +But wait, there's more! +--------- +```swift +// create a new style +var style = ToastStyle() + +// this is just one of many style options +style.messageColor = .blue + +// present the toast with the new style +self.view.makeToast("This is a piece of toast", duration: 3.0, position: .bottom, style: style) + +// or perhaps you want to use this style for all toasts going forward? +// just set the shared style and there's no need to provide the style again +ToastManager.shared.style = style +self.view.makeToast("This is a piece of toast") // now uses the shared style + +// toggle "tap to dismiss" functionality +ToastManager.shared.isTapToDismissEnabled = true + +// toggle queueing behavior +ToastManager.shared.isQueueEnabled = true +``` + +See the demo project for more examples. + + +Setup Instructions +------------------ + +[CocoaPods](http://cocoapods.org) +------------------ + +To integrate Toast-Swift into your Xcode project using CocoaPods, specify it in your `Podfile`: + +```ruby +pod 'Toast-Swift', '~> 5.0.0' +``` + +and in your code add `import Toast_Swift`. + +[Carthage](https://github.com/Carthage/Carthage) +------------------ + +To integrate Toast-Swift into your Xcode project using Carthage, specify it in your `Cartfile`: + +```ogdl +github "scalessec/Toast-Swift" ~> 5.0.0 +``` + +Run `carthage update` to build the framework and drag the built `ToastSwiftFramework.framework` into your Xcode project. + +and in your code add `import ToastSwiftFramework`. + +Manually +------------------ + +1. Add `Toast.swift` to your project. +2. Grab yourself a cold 🍺. + +Compatibility +------------------ +* Version `5.x.x` requires Swift 5 and Xcode 10.2. +* Version `4.x.x` requires Swift 4.2 and Xcode 10. +* Version `3.x.x` requires Swift 4 and Xcode 9. +* Version `2.x.x` requires Swift 3 and Xcode 8. +* Version `1.4.x` requires Swift 2.2 and Xcode 7.3. +* Version `1.0.0` can be used with Swift 2.1 and earlier versions of Xcode. + +MIT License +----------- + Copyright (c) 2015-2019 Charles Scalesse. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/SideDishApp/Pods/Toast-Swift/Toast/Toast.swift b/SideDishApp/Pods/Toast-Swift/Toast/Toast.swift new file mode 100644 index 000000000..49e64a8ed --- /dev/null +++ b/SideDishApp/Pods/Toast-Swift/Toast/Toast.swift @@ -0,0 +1,782 @@ +// +// Toast.swift +// Toast-Swift +// +// Copyright (c) 2015-2019 Charles Scalesse. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import UIKit +import ObjectiveC + +/** + Toast is a Swift extension that adds toast notifications to the `UIView` object class. + It is intended to be simple, lightweight, and easy to use. Most toast notifications + can be triggered with a single line of code. + + The `makeToast` methods create a new view and then display it as toast. + + The `showToast` methods display any view as toast. + + */ +public extension UIView { + + /** + Keys used for associated objects. + */ + private struct ToastKeys { + static var timer = "com.toast-swift.timer" + static var duration = "com.toast-swift.duration" + static var point = "com.toast-swift.point" + static var completion = "com.toast-swift.completion" + static var activeToasts = "com.toast-swift.activeToasts" + static var activityView = "com.toast-swift.activityView" + static var queue = "com.toast-swift.queue" + } + + /** + Swift closures can't be directly associated with objects via the + Objective-C runtime, so the (ugly) solution is to wrap them in a + class that can be used with associated objects. + */ + private class ToastCompletionWrapper { + let completion: ((Bool) -> Void)? + + init(_ completion: ((Bool) -> Void)?) { + self.completion = completion + } + } + + private enum ToastError: Error { + case missingParameters + } + + private var activeToasts: NSMutableArray { + get { + if let activeToasts = objc_getAssociatedObject(self, &ToastKeys.activeToasts) as? NSMutableArray { + return activeToasts + } else { + let activeToasts = NSMutableArray() + objc_setAssociatedObject(self, &ToastKeys.activeToasts, activeToasts, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + return activeToasts + } + } + } + + private var queue: NSMutableArray { + get { + if let queue = objc_getAssociatedObject(self, &ToastKeys.queue) as? NSMutableArray { + return queue + } else { + let queue = NSMutableArray() + objc_setAssociatedObject(self, &ToastKeys.queue, queue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + return queue + } + } + } + + // MARK: - Make Toast Methods + + /** + Creates and presents a new toast view. + + @param message The message to be displayed + @param duration The toast duration + @param position The toast's position + @param title The title + @param image The image + @param style The style. The shared style will be used when nil + @param completion The completion closure, executed after the toast view disappears. + didTap will be `true` if the toast view was dismissed from a tap. + */ + func makeToast(_ message: String?, duration: TimeInterval = ToastManager.shared.duration, position: ToastPosition = ToastManager.shared.position, title: String? = nil, image: UIImage? = nil, style: ToastStyle = ToastManager.shared.style, completion: ((_ didTap: Bool) -> Void)? = nil) { + do { + let toast = try toastViewForMessage(message, title: title, image: image, style: style) + showToast(toast, duration: duration, position: position, completion: completion) + } catch ToastError.missingParameters { + print("Error: message, title, and image are all nil") + } catch {} + } + + /** + Creates a new toast view and presents it at a given center point. + + @param message The message to be displayed + @param duration The toast duration + @param point The toast's center point + @param title The title + @param image The image + @param style The style. The shared style will be used when nil + @param completion The completion closure, executed after the toast view disappears. + didTap will be `true` if the toast view was dismissed from a tap. + */ + func makeToast(_ message: String?, duration: TimeInterval = ToastManager.shared.duration, point: CGPoint, title: String?, image: UIImage?, style: ToastStyle = ToastManager.shared.style, completion: ((_ didTap: Bool) -> Void)?) { + do { + let toast = try toastViewForMessage(message, title: title, image: image, style: style) + showToast(toast, duration: duration, point: point, completion: completion) + } catch ToastError.missingParameters { + print("Error: message, title, and image cannot all be nil") + } catch {} + } + + // MARK: - Show Toast Methods + + /** + Displays any view as toast at a provided position and duration. The completion closure + executes when the toast view completes. `didTap` will be `true` if the toast view was + dismissed from a tap. + + @param toast The view to be displayed as toast + @param duration The notification duration + @param position The toast's position + @param completion The completion block, executed after the toast view disappears. + didTap will be `true` if the toast view was dismissed from a tap. + */ + func showToast(_ toast: UIView, duration: TimeInterval = ToastManager.shared.duration, position: ToastPosition = ToastManager.shared.position, completion: ((_ didTap: Bool) -> Void)? = nil) { + let point = position.centerPoint(forToast: toast, inSuperview: self) + showToast(toast, duration: duration, point: point, completion: completion) + } + + /** + Displays any view as toast at a provided center point and duration. The completion closure + executes when the toast view completes. `didTap` will be `true` if the toast view was + dismissed from a tap. + + @param toast The view to be displayed as toast + @param duration The notification duration + @param point The toast's center point + @param completion The completion block, executed after the toast view disappears. + didTap will be `true` if the toast view was dismissed from a tap. + */ + func showToast(_ toast: UIView, duration: TimeInterval = ToastManager.shared.duration, point: CGPoint, completion: ((_ didTap: Bool) -> Void)? = nil) { + objc_setAssociatedObject(toast, &ToastKeys.completion, ToastCompletionWrapper(completion), .OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + if ToastManager.shared.isQueueEnabled, activeToasts.count > 0 { + objc_setAssociatedObject(toast, &ToastKeys.duration, NSNumber(value: duration), .OBJC_ASSOCIATION_RETAIN_NONATOMIC); + objc_setAssociatedObject(toast, &ToastKeys.point, NSValue(cgPoint: point), .OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + queue.add(toast) + } else { + showToast(toast, duration: duration, point: point) + } + } + + // MARK: - Hide Toast Methods + + /** + Hides the active toast. If there are multiple toasts active in a view, this method + hides the oldest toast (the first of the toasts to have been presented). + + @see `hideAllToasts()` to remove all active toasts from a view. + + @warning This method has no effect on activity toasts. Use `hideToastActivity` to + hide activity toasts. + + */ + func hideToast() { + guard let activeToast = activeToasts.firstObject as? UIView else { return } + hideToast(activeToast) + } + + /** + Hides an active toast. + + @param toast The active toast view to dismiss. Any toast that is currently being displayed + on the screen is considered active. + + @warning this does not clear a toast view that is currently waiting in the queue. + */ + func hideToast(_ toast: UIView) { + guard activeToasts.contains(toast) else { return } + hideToast(toast, fromTap: false) + } + + /** + Hides all toast views. + + @param includeActivity If `true`, toast activity will also be hidden. Default is `false`. + @param clearQueue If `true`, removes all toast views from the queue. Default is `true`. + */ + func hideAllToasts(includeActivity: Bool = false, clearQueue: Bool = true) { + if clearQueue { + clearToastQueue() + } + + activeToasts.compactMap { $0 as? UIView } + .forEach { hideToast($0) } + + if includeActivity { + hideToastActivity() + } + } + + /** + Removes all toast views from the queue. This has no effect on toast views that are + active. Use `hideAllToasts(clearQueue:)` to hide the active toasts views and clear + the queue. + */ + func clearToastQueue() { + queue.removeAllObjects() + } + + // MARK: - Activity Methods + + /** + Creates and displays a new toast activity indicator view at a specified position. + + @warning Only one toast activity indicator view can be presented per superview. Subsequent + calls to `makeToastActivity(position:)` will be ignored until `hideToastActivity()` is called. + + @warning `makeToastActivity(position:)` works independently of the `showToast` methods. Toast + activity views can be presented and dismissed while toast views are being displayed. + `makeToastActivity(position:)` has no effect on the queueing behavior of the `showToast` methods. + + @param position The toast's position + */ + func makeToastActivity(_ position: ToastPosition) { + // sanity + guard objc_getAssociatedObject(self, &ToastKeys.activityView) as? UIView == nil else { return } + + let toast = createToastActivityView() + let point = position.centerPoint(forToast: toast, inSuperview: self) + makeToastActivity(toast, point: point) + } + + /** + Creates and displays a new toast activity indicator view at a specified position. + + @warning Only one toast activity indicator view can be presented per superview. Subsequent + calls to `makeToastActivity(position:)` will be ignored until `hideToastActivity()` is called. + + @warning `makeToastActivity(position:)` works independently of the `showToast` methods. Toast + activity views can be presented and dismissed while toast views are being displayed. + `makeToastActivity(position:)` has no effect on the queueing behavior of the `showToast` methods. + + @param point The toast's center point + */ + func makeToastActivity(_ point: CGPoint) { + // sanity + guard objc_getAssociatedObject(self, &ToastKeys.activityView) as? UIView == nil else { return } + + let toast = createToastActivityView() + makeToastActivity(toast, point: point) + } + + /** + Dismisses the active toast activity indicator view. + */ + func hideToastActivity() { + if let toast = objc_getAssociatedObject(self, &ToastKeys.activityView) as? UIView { + UIView.animate(withDuration: ToastManager.shared.style.fadeDuration, delay: 0.0, options: [.curveEaseIn, .beginFromCurrentState], animations: { + toast.alpha = 0.0 + }) { _ in + toast.removeFromSuperview() + objc_setAssociatedObject(self, &ToastKeys.activityView, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + } + + // MARK: - Private Activity Methods + + private func makeToastActivity(_ toast: UIView, point: CGPoint) { + toast.alpha = 0.0 + toast.center = point + + objc_setAssociatedObject(self, &ToastKeys.activityView, toast, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + + self.addSubview(toast) + + UIView.animate(withDuration: ToastManager.shared.style.fadeDuration, delay: 0.0, options: .curveEaseOut, animations: { + toast.alpha = 1.0 + }) + } + + private func createToastActivityView() -> UIView { + let style = ToastManager.shared.style + + let activityView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: style.activitySize.width, height: style.activitySize.height)) + activityView.backgroundColor = style.activityBackgroundColor + activityView.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin] + activityView.layer.cornerRadius = style.cornerRadius + + if style.displayShadow { + activityView.layer.shadowColor = style.shadowColor.cgColor + activityView.layer.shadowOpacity = style.shadowOpacity + activityView.layer.shadowRadius = style.shadowRadius + activityView.layer.shadowOffset = style.shadowOffset + } + + let activityIndicatorView = UIActivityIndicatorView(style: .whiteLarge) + activityIndicatorView.center = CGPoint(x: activityView.bounds.size.width / 2.0, y: activityView.bounds.size.height / 2.0) + activityView.addSubview(activityIndicatorView) + activityIndicatorView.color = style.activityIndicatorColor + activityIndicatorView.startAnimating() + + return activityView + } + + // MARK: - Private Show/Hide Methods + + private func showToast(_ toast: UIView, duration: TimeInterval, point: CGPoint) { + toast.center = point + toast.alpha = 0.0 + + if ToastManager.shared.isTapToDismissEnabled { + let recognizer = UITapGestureRecognizer(target: self, action: #selector(UIView.handleToastTapped(_:))) + toast.addGestureRecognizer(recognizer) + toast.isUserInteractionEnabled = true + toast.isExclusiveTouch = true + } + + activeToasts.add(toast) + self.addSubview(toast) + + UIView.animate(withDuration: ToastManager.shared.style.fadeDuration, delay: 0.0, options: [.curveEaseOut, .allowUserInteraction], animations: { + toast.alpha = 1.0 + }) { _ in + let timer = Timer(timeInterval: duration, target: self, selector: #selector(UIView.toastTimerDidFinish(_:)), userInfo: toast, repeats: false) + RunLoop.main.add(timer, forMode: .common) + objc_setAssociatedObject(toast, &ToastKeys.timer, timer, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + private func hideToast(_ toast: UIView, fromTap: Bool) { + if let timer = objc_getAssociatedObject(toast, &ToastKeys.timer) as? Timer { + timer.invalidate() + } + + UIView.animate(withDuration: ToastManager.shared.style.fadeDuration, delay: 0.0, options: [.curveEaseIn, .beginFromCurrentState], animations: { + toast.alpha = 0.0 + }) { _ in + toast.removeFromSuperview() + self.activeToasts.remove(toast) + + if let wrapper = objc_getAssociatedObject(toast, &ToastKeys.completion) as? ToastCompletionWrapper, let completion = wrapper.completion { + completion(fromTap) + } + + if let nextToast = self.queue.firstObject as? UIView, let duration = objc_getAssociatedObject(nextToast, &ToastKeys.duration) as? NSNumber, let point = objc_getAssociatedObject(nextToast, &ToastKeys.point) as? NSValue { + self.queue.removeObject(at: 0) + self.showToast(nextToast, duration: duration.doubleValue, point: point.cgPointValue) + } + } + } + + // MARK: - Events + + @objc + private func handleToastTapped(_ recognizer: UITapGestureRecognizer) { + guard let toast = recognizer.view else { return } + hideToast(toast, fromTap: true) + } + + @objc + private func toastTimerDidFinish(_ timer: Timer) { + guard let toast = timer.userInfo as? UIView else { return } + hideToast(toast) + } + + // MARK: - Toast Construction + + /** + Creates a new toast view with any combination of message, title, and image. + The look and feel is configured via the style. Unlike the `makeToast` methods, + this method does not present the toast view automatically. One of the `showToast` + methods must be used to present the resulting view. + + @warning if message, title, and image are all nil, this method will throw + `ToastError.missingParameters` + + @param message The message to be displayed + @param title The title + @param image The image + @param style The style. The shared style will be used when nil + @throws `ToastError.missingParameters` when message, title, and image are all nil + @return The newly created toast view + */ + func toastViewForMessage(_ message: String?, title: String?, image: UIImage?, style: ToastStyle) throws -> UIView { + // sanity + guard message != nil || title != nil || image != nil else { + throw ToastError.missingParameters + } + + var messageLabel: UILabel? + var titleLabel: UILabel? + var imageView: UIImageView? + + let wrapperView = UIView() + wrapperView.backgroundColor = style.backgroundColor + wrapperView.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin] + wrapperView.layer.cornerRadius = style.cornerRadius + + if style.displayShadow { + wrapperView.layer.shadowColor = UIColor.black.cgColor + wrapperView.layer.shadowOpacity = style.shadowOpacity + wrapperView.layer.shadowRadius = style.shadowRadius + wrapperView.layer.shadowOffset = style.shadowOffset + } + + if let image = image { + imageView = UIImageView(image: image) + imageView?.contentMode = .scaleAspectFit + imageView?.frame = CGRect(x: style.horizontalPadding, y: style.verticalPadding, width: style.imageSize.width, height: style.imageSize.height) + } + + var imageRect = CGRect.zero + + if let imageView = imageView { + imageRect.origin.x = style.horizontalPadding + imageRect.origin.y = style.verticalPadding + imageRect.size.width = imageView.bounds.size.width + imageRect.size.height = imageView.bounds.size.height + } + + if let title = title { + titleLabel = UILabel() + titleLabel?.numberOfLines = style.titleNumberOfLines + titleLabel?.font = style.titleFont + titleLabel?.textAlignment = style.titleAlignment + titleLabel?.lineBreakMode = .byTruncatingTail + titleLabel?.textColor = style.titleColor + titleLabel?.backgroundColor = UIColor.clear + titleLabel?.text = title; + + let maxTitleSize = CGSize(width: (self.bounds.size.width * style.maxWidthPercentage) - imageRect.size.width, height: self.bounds.size.height * style.maxHeightPercentage) + let titleSize = titleLabel?.sizeThatFits(maxTitleSize) + if let titleSize = titleSize { + titleLabel?.frame = CGRect(x: 0.0, y: 0.0, width: titleSize.width, height: titleSize.height) + } + } + + if let message = message { + messageLabel = UILabel() + messageLabel?.text = message + messageLabel?.numberOfLines = style.messageNumberOfLines + messageLabel?.font = style.messageFont + messageLabel?.textAlignment = style.messageAlignment + messageLabel?.lineBreakMode = .byTruncatingTail; + messageLabel?.textColor = style.messageColor + messageLabel?.backgroundColor = UIColor.clear + + let maxMessageSize = CGSize(width: (self.bounds.size.width * style.maxWidthPercentage) - imageRect.size.width, height: self.bounds.size.height * style.maxHeightPercentage) + let messageSize = messageLabel?.sizeThatFits(maxMessageSize) + if let messageSize = messageSize { + let actualWidth = min(messageSize.width, maxMessageSize.width) + let actualHeight = min(messageSize.height, maxMessageSize.height) + messageLabel?.frame = CGRect(x: 0.0, y: 0.0, width: actualWidth, height: actualHeight) + } + } + + var titleRect = CGRect.zero + + if let titleLabel = titleLabel { + titleRect.origin.x = imageRect.origin.x + imageRect.size.width + style.horizontalPadding + titleRect.origin.y = style.verticalPadding + titleRect.size.width = titleLabel.bounds.size.width + titleRect.size.height = titleLabel.bounds.size.height + } + + var messageRect = CGRect.zero + + if let messageLabel = messageLabel { + messageRect.origin.x = imageRect.origin.x + imageRect.size.width + style.horizontalPadding + messageRect.origin.y = titleRect.origin.y + titleRect.size.height + style.verticalPadding + messageRect.size.width = messageLabel.bounds.size.width + messageRect.size.height = messageLabel.bounds.size.height + } + + let longerWidth = max(titleRect.size.width, messageRect.size.width) + let longerX = max(titleRect.origin.x, messageRect.origin.x) + let wrapperWidth = max((imageRect.size.width + (style.horizontalPadding * 2.0)), (longerX + longerWidth + style.horizontalPadding)) + let wrapperHeight = max((messageRect.origin.y + messageRect.size.height + style.verticalPadding), (imageRect.size.height + (style.verticalPadding * 2.0))) + + wrapperView.frame = CGRect(x: 0.0, y: 0.0, width: wrapperWidth, height: wrapperHeight) + + if let titleLabel = titleLabel { + titleRect.size.width = longerWidth + titleLabel.frame = titleRect + wrapperView.addSubview(titleLabel) + } + + if let messageLabel = messageLabel { + messageRect.size.width = longerWidth + messageLabel.frame = messageRect + wrapperView.addSubview(messageLabel) + } + + if let imageView = imageView { + wrapperView.addSubview(imageView) + } + + return wrapperView + } + +} + +// MARK: - Toast Style + +/** + `ToastStyle` instances define the look and feel for toast views created via the + `makeToast` methods as well for toast views created directly with + `toastViewForMessage(message:title:image:style:)`. + + @warning `ToastStyle` offers relatively simple styling options for the default + toast view. If you require a toast view with more complex UI, it probably makes more + sense to create your own custom UIView subclass and present it with the `showToast` + methods. +*/ +public struct ToastStyle { + + public init() {} + + /** + The background color. Default is `.black` at 80% opacity. + */ + public var backgroundColor: UIColor = UIColor.black.withAlphaComponent(0.8) + + /** + The title color. Default is `UIColor.whiteColor()`. + */ + public var titleColor: UIColor = .white + + /** + The message color. Default is `.white`. + */ + public var messageColor: UIColor = .white + + /** + A percentage value from 0.0 to 1.0, representing the maximum width of the toast + view relative to it's superview. Default is 0.8 (80% of the superview's width). + */ + public var maxWidthPercentage: CGFloat = 0.8 { + didSet { + maxWidthPercentage = max(min(maxWidthPercentage, 1.0), 0.0) + } + } + + /** + A percentage value from 0.0 to 1.0, representing the maximum height of the toast + view relative to it's superview. Default is 0.8 (80% of the superview's height). + */ + public var maxHeightPercentage: CGFloat = 0.8 { + didSet { + maxHeightPercentage = max(min(maxHeightPercentage, 1.0), 0.0) + } + } + + /** + The spacing from the horizontal edge of the toast view to the content. When an image + is present, this is also used as the padding between the image and the text. + Default is 10.0. + + */ + public var horizontalPadding: CGFloat = 10.0 + + /** + The spacing from the vertical edge of the toast view to the content. When a title + is present, this is also used as the padding between the title and the message. + Default is 10.0. On iOS11+, this value is added added to the `safeAreaInset.top` + and `safeAreaInsets.bottom`. + */ + public var verticalPadding: CGFloat = 10.0 + + /** + The corner radius. Default is 10.0. + */ + public var cornerRadius: CGFloat = 10.0; + + /** + The title font. Default is `.boldSystemFont(16.0)`. + */ + public var titleFont: UIFont = .boldSystemFont(ofSize: 16.0) + + /** + The message font. Default is `.systemFont(ofSize: 16.0)`. + */ + public var messageFont: UIFont = .systemFont(ofSize: 16.0) + + /** + The title text alignment. Default is `NSTextAlignment.Left`. + */ + public var titleAlignment: NSTextAlignment = .left + + /** + The message text alignment. Default is `NSTextAlignment.Left`. + */ + public var messageAlignment: NSTextAlignment = .left + + /** + The maximum number of lines for the title. The default is 0 (no limit). + */ + public var titleNumberOfLines = 0 + + /** + The maximum number of lines for the message. The default is 0 (no limit). + */ + public var messageNumberOfLines = 0 + + /** + Enable or disable a shadow on the toast view. Default is `false`. + */ + public var displayShadow = false + + /** + The shadow color. Default is `.black`. + */ + public var shadowColor: UIColor = .black + + /** + A value from 0.0 to 1.0, representing the opacity of the shadow. + Default is 0.8 (80% opacity). + */ + public var shadowOpacity: Float = 0.8 { + didSet { + shadowOpacity = max(min(shadowOpacity, 1.0), 0.0) + } + } + + /** + The shadow radius. Default is 6.0. + */ + public var shadowRadius: CGFloat = 6.0 + + /** + The shadow offset. The default is 4 x 4. + */ + public var shadowOffset = CGSize(width: 4.0, height: 4.0) + + /** + The image size. The default is 80 x 80. + */ + public var imageSize = CGSize(width: 80.0, height: 80.0) + + /** + The size of the toast activity view when `makeToastActivity(position:)` is called. + Default is 100 x 100. + */ + public var activitySize = CGSize(width: 100.0, height: 100.0) + + /** + The fade in/out animation duration. Default is 0.2. + */ + public var fadeDuration: TimeInterval = 0.2 + + /** + Activity indicator color. Default is `.white`. + */ + public var activityIndicatorColor: UIColor = .white + + /** + Activity background color. Default is `.black` at 80% opacity. + */ + public var activityBackgroundColor: UIColor = UIColor.black.withAlphaComponent(0.8) + +} + +// MARK: - Toast Manager + +/** + `ToastManager` provides general configuration options for all toast + notifications. Backed by a singleton instance. +*/ +public class ToastManager { + + /** + The `ToastManager` singleton instance. + + */ + public static let shared = ToastManager() + + /** + The shared style. Used whenever toastViewForMessage(message:title:image:style:) is called + with with a nil style. + + */ + public var style = ToastStyle() + + /** + Enables or disables tap to dismiss on toast views. Default is `true`. + + */ + public var isTapToDismissEnabled = true + + /** + Enables or disables queueing behavior for toast views. When `true`, + toast views will appear one after the other. When `false`, multiple toast + views will appear at the same time (potentially overlapping depending + on their positions). This has no effect on the toast activity view, + which operates independently of normal toast views. Default is `false`. + + */ + public var isQueueEnabled = false + + /** + The default duration. Used for the `makeToast` and + `showToast` methods that don't require an explicit duration. + Default is 3.0. + + */ + public var duration: TimeInterval = 3.0 + + /** + Sets the default position. Used for the `makeToast` and + `showToast` methods that don't require an explicit position. + Default is `ToastPosition.Bottom`. + + */ + public var position: ToastPosition = .bottom + +} + +// MARK: - ToastPosition + +public enum ToastPosition { + case top + case center + case bottom + + fileprivate func centerPoint(forToast toast: UIView, inSuperview superview: UIView) -> CGPoint { + let topPadding: CGFloat = ToastManager.shared.style.verticalPadding + superview.csSafeAreaInsets.top + let bottomPadding: CGFloat = ToastManager.shared.style.verticalPadding + superview.csSafeAreaInsets.bottom + + switch self { + case .top: + return CGPoint(x: superview.bounds.size.width / 2.0, y: (toast.frame.size.height / 2.0) + topPadding) + case .center: + return CGPoint(x: superview.bounds.size.width / 2.0, y: superview.bounds.size.height / 2.0) + case .bottom: + return CGPoint(x: superview.bounds.size.width / 2.0, y: (superview.bounds.size.height - (toast.frame.size.height / 2.0)) - bottomPadding) + } + } +} + +// MARK: - Private UIView Extensions + +private extension UIView { + + var csSafeAreaInsets: UIEdgeInsets { + if #available(iOS 11.0, *) { + return self.safeAreaInsets + } else { + return .zero + } + } + +} diff --git a/SideDishApp/SideDishApp.xcodeproj/project.pbxproj b/SideDishApp/SideDishApp.xcodeproj/project.pbxproj index a7b4d8d97..032675f48 100644 --- a/SideDishApp/SideDishApp.xcodeproj/project.pbxproj +++ b/SideDishApp/SideDishApp.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 51; objects = { /* Begin PBXBuildFile section */ @@ -20,6 +20,10 @@ 1ECD5F70262F3F1C00DC56C0 /* MenuListUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ECD5F6F262F3F1C00DC56C0 /* MenuListUseCase.swift */; }; 1ECD5F73262F405100DC56C0 /* MenuListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ECD5F72262F405100DC56C0 /* MenuListViewModel.swift */; }; B0911E6F262EA29200D5EBEC /* DishCardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0911E6E262EA29200D5EBEC /* DishCardCell.swift */; }; + B0911EA026316B9A00D5EBEC /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0911E9F26316B9A00D5EBEC /* String+Extension.swift */; }; + B0911EA42631AF3400D5EBEC /* DiffableProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0911EA32631AF3400D5EBEC /* DiffableProvider.swift */; }; + B0911EA82632B7A100D5EBEC /* DishCollectionViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0911EA72632B7A000D5EBEC /* DishCollectionViewDelegate.swift */; }; + D8279798DA0A1BCEB97E7780 /* Pods_SideDishApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 96A87B12151B0D006007CD63 /* Pods_SideDishApp.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -30,15 +34,20 @@ 1E1DBAD8262DDDFC0050FE6C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 1E1DBADA262DDDFD0050FE6C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 1E1DBADD262DDDFD0050FE6C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 1E1DBADF262DDDFD0050FE6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1E1DBADF262DDDFD0050FE6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = ../Info.plist; sourceTree = ""; }; 1ECD5F61262F256000DC56C0 /* Endpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Endpoint.swift; sourceTree = ""; }; 1ECD5F65262F2E1E00DC56C0 /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = ""; }; 1ECD5F69262F3B6500DC56C0 /* DishNetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DishNetworkManager.swift; sourceTree = ""; }; 1ECD5F6C262F3C1700DC56C0 /* Dish.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dish.swift; sourceTree = ""; }; 1ECD5F6F262F3F1C00DC56C0 /* MenuListUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuListUseCase.swift; sourceTree = ""; }; 1ECD5F72262F405100DC56C0 /* MenuListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuListViewModel.swift; sourceTree = ""; }; - 1E1DBADF262DDDFD0050FE6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = ../Info.plist; sourceTree = ""; }; + 4942C5A177086C5C99933038 /* Pods-SideDishApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideDishApp.debug.xcconfig"; path = "Target Support Files/Pods-SideDishApp/Pods-SideDishApp.debug.xcconfig"; sourceTree = ""; }; + 605A37FD869863C7E023EE85 /* Pods-SideDishApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideDishApp.release.xcconfig"; path = "Target Support Files/Pods-SideDishApp/Pods-SideDishApp.release.xcconfig"; sourceTree = ""; }; + 96A87B12151B0D006007CD63 /* Pods_SideDishApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SideDishApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B0911E6E262EA29200D5EBEC /* DishCardCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DishCardCell.swift; sourceTree = ""; }; + B0911E9F26316B9A00D5EBEC /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; + B0911EA32631AF3400D5EBEC /* DiffableProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiffableProvider.swift; sourceTree = ""; }; + B0911EA72632B7A000D5EBEC /* DishCollectionViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DishCollectionViewDelegate.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -46,17 +55,28 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D8279798DA0A1BCEB97E7780 /* Pods_SideDishApp.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 134494D3AD3A3BAD38EFF6AF /* Frameworks */ = { + isa = PBXGroup; + children = ( + 96A87B12151B0D006007CD63 /* Pods_SideDishApp.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 1E1DBAC5262DDDFC0050FE6C = { isa = PBXGroup; children = ( 1E1DBAD0262DDDFC0050FE6C /* SideDishApp */, 1E1DBACF262DDDFC0050FE6C /* Products */, + 25F4FE78497FA432687D2A6F /* Pods */, + 134494D3AD3A3BAD38EFF6AF /* Frameworks */, ); sourceTree = ""; }; @@ -71,6 +91,7 @@ 1E1DBAD0262DDDFC0050FE6C /* SideDishApp */ = { isa = PBXGroup; children = ( + B0911E9E26316B8700D5EBEC /* Extension */, 1E1DBAF2262DDEE50050FE6C /* Application */, 1E1DBAEF262DDE990050FE6C /* Domain */, 1E1DBAE9262DDE0C0050FE6C /* Presentation */, @@ -145,6 +166,8 @@ isa = PBXGroup; children = ( 1E1DBAD5262DDDFC0050FE6C /* ViewController.swift */, + B0911EA32631AF3400D5EBEC /* DiffableProvider.swift */, + B0911EA72632B7A000D5EBEC /* DishCollectionViewDelegate.swift */, ); path = ViewController; sourceTree = ""; @@ -201,6 +224,23 @@ path = SupportingFiles; sourceTree = ""; }; + 25F4FE78497FA432687D2A6F /* Pods */ = { + isa = PBXGroup; + children = ( + 4942C5A177086C5C99933038 /* Pods-SideDishApp.debug.xcconfig */, + 605A37FD869863C7E023EE85 /* Pods-SideDishApp.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + B0911E9E26316B8700D5EBEC /* Extension */ = { + isa = PBXGroup; + children = ( + B0911E9F26316B9A00D5EBEC /* String+Extension.swift */, + ); + path = Extension; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -208,9 +248,11 @@ isa = PBXNativeTarget; buildConfigurationList = 1E1DBAE2262DDDFD0050FE6C /* Build configuration list for PBXNativeTarget "SideDishApp" */; buildPhases = ( + 4E97AE4DAE4A4279E9E62FA9 /* [CP] Check Pods Manifest.lock */, 1E1DBACA262DDDFC0050FE6C /* Sources */, 1E1DBACB262DDDFC0050FE6C /* Frameworks */, 1E1DBACC262DDDFC0050FE6C /* Resources */, + AA88DE456D8DDF14583AADB8 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -266,19 +308,64 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 4E97AE4DAE4A4279E9E62FA9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-SideDishApp-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + AA88DE456D8DDF14583AADB8 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SideDishApp/Pods-SideDishApp-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 1E1DBACA262DDDFC0050FE6C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1ECD5F6D262F3C1700DC56C0 /* Dish.swift in Sources */, + B0911EA026316B9A00D5EBEC /* String+Extension.swift in Sources */, 1E1DBAD6262DDDFC0050FE6C /* ViewController.swift in Sources */, 1ECD5F70262F3F1C00DC56C0 /* MenuListUseCase.swift in Sources */, 1ECD5F6A262F3B6500DC56C0 /* DishNetworkManager.swift in Sources */, 1E1DBAD2262DDDFC0050FE6C /* AppDelegate.swift in Sources */, 1ECD5F66262F2E1E00DC56C0 /* NetworkManager.swift in Sources */, 1ECD5F62262F256000DC56C0 /* Endpoint.swift in Sources */, + B0911EA42631AF3400D5EBEC /* DiffableProvider.swift in Sources */, B0911E6F262EA29200D5EBEC /* DishCardCell.swift in Sources */, + B0911EA82632B7A100D5EBEC /* DishCollectionViewDelegate.swift in Sources */, 1E1DBAD4262DDDFC0050FE6C /* SceneDelegate.swift in Sources */, 1ECD5F73262F405100DC56C0 /* MenuListViewModel.swift in Sources */, ); @@ -424,6 +511,7 @@ }; 1E1DBAE3262DDDFD0050FE6C /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 4942C5A177086C5C99933038 /* Pods-SideDishApp.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -442,6 +530,7 @@ }; 1E1DBAE4262DDDFD0050FE6C /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 605A37FD869863C7E023EE85 /* Pods-SideDishApp.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; diff --git a/SideDishApp/SideDishApp.xcodeproj/project.xcworkspace/xcuserdata/idahun.xcuserdatad/UserInterfaceState.xcuserstate b/SideDishApp/SideDishApp.xcodeproj/project.xcworkspace/xcuserdata/idahun.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 000000000..435135a4d Binary files /dev/null and b/SideDishApp/SideDishApp.xcodeproj/project.xcworkspace/xcuserdata/idahun.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/SideDishApp/SideDishApp.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/xcschememanagement.plist b/SideDishApp/SideDishApp.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/xcschememanagement.plist index 3ca11deb8..edf0a7777 100644 --- a/SideDishApp/SideDishApp.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/SideDishApp/SideDishApp.xcodeproj/xcuserdata/idahun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ SideDishApp.xcscheme_^#shared#^_ orderHint - 0 + 2 diff --git a/SideDishApp/SideDishApp.xcworkspace/contents.xcworkspacedata b/SideDishApp/SideDishApp.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..2801dc533 --- /dev/null +++ b/SideDishApp/SideDishApp.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/SideDishApp/SideDishApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SideDishApp/SideDishApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/SideDishApp/SideDishApp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SideDishApp/SideDishApp/Domain/Entity/Dish.swift b/SideDishApp/SideDishApp/Domain/Entity/Dish.swift index bbad6e680..3ff6f6e59 100644 --- a/SideDishApp/SideDishApp/Domain/Entity/Dish.swift +++ b/SideDishApp/SideDishApp/Domain/Entity/Dish.swift @@ -8,14 +8,14 @@ import Foundation // MARK: - Dishes -struct Dishes: Codable { +struct Dishes: Codable, Hashable { private let category: String private(set) var name: String private(set) var dishes: [Dish] } // MARK: - Dish -struct Dish: Codable { +struct Dish: Codable, Hashable { private let dishId: String private(set) var image: String private let alt: String @@ -23,6 +23,6 @@ struct Dish: Codable { private(set) var title: String private(set) var description: String private(set) var normalPrice: String - private(set) var sellingPrice: String? - private(set) var badge: String? + private(set) var sellingPrice: String + private(set) var badge: String } diff --git a/SideDishApp/SideDishApp/Extension/String+Extension.swift b/SideDishApp/SideDishApp/Extension/String+Extension.swift new file mode 100644 index 000000000..78e2e3816 --- /dev/null +++ b/SideDishApp/SideDishApp/Extension/String+Extension.swift @@ -0,0 +1,42 @@ +// +// String+Extension.swift +// SideDishApp +// +// Created by 이다훈 on 2021/04/22. +// + +import UIKit + +extension String { + + func styleAsCharge(with stroke: String, with bold: String) -> NSMutableAttributedString { + let attributedString = NSMutableAttributedString(string: self) + + attributedString.addAttribute(.strikethroughStyle, + value: NSUnderlineStyle.single.rawValue, + range: (self as NSString).range(of: "\(stroke)") + ) + + attributedString.addAttribute(.foregroundColor, + value: UIColor.systemGray2, + range: (self as NSString).range(of: "\(stroke)") + ) + + attributedString.addAttribute(.font, + value: UIFont.systemFont(ofSize: 14, weight: .bold), + range: (self as NSString).range(of: "\(bold)") + ) + + return attributedString + } + + static func insertComma(with string: String) -> String { + var targetString = string + let count = targetString.count / 3 + for i in 0.. - + - + - + @@ -45,7 +45,7 @@ - - @@ -91,14 +90,18 @@ + + + + - - + + diff --git a/SideDishApp/SideDishApp/Presentation/UI/View/DishCardCell.swift b/SideDishApp/SideDishApp/Presentation/UI/View/DishCardCell.swift index 1b77ff661..4c8bce47a 100644 --- a/SideDishApp/SideDishApp/Presentation/UI/View/DishCardCell.swift +++ b/SideDishApp/SideDishApp/Presentation/UI/View/DishCardCell.swift @@ -7,7 +7,8 @@ import UIKit -class DishCardCell : UICollectionViewCell { @IBOutlet weak var dishImage: UIImageView! +class DishCardCell : UICollectionViewCell { + @IBOutlet weak var dishImage: UIImageView! @IBOutlet weak var title: UILabel! @IBOutlet weak var body: UILabel! @IBOutlet weak var charge: UILabel! diff --git a/SideDishApp/SideDishApp/Presentation/UI/ViewController/DiffableProvider.swift b/SideDishApp/SideDishApp/Presentation/UI/ViewController/DiffableProvider.swift new file mode 100644 index 000000000..a48553e04 --- /dev/null +++ b/SideDishApp/SideDishApp/Presentation/UI/ViewController/DiffableProvider.swift @@ -0,0 +1,171 @@ +// +// DiffableProvider.swift +// SideDishApp +// +// Created by 이다훈 on 2021/04/22. +// + +import UIKit +import Toast_Swift + +class DiffableProvider { + + private var toasterCloser = Dictionary Void>() + + private let colorDictionary = ["이벤트특가" : UIColor.init(displayP3Red: 130/255, green: 211/255, blue: 45/255, alpha: 1), "론칭특가" : UIColor.init(displayP3Red: 134/255, green: 198/255, blue: 255/255, alpha: 1)] + + func configureDataSource(collectionView : UICollectionView) -> UICollectionViewDiffableDataSource { + let dataSource = UICollectionViewDiffableDataSource (collectionView: collectionView, cellProvider: { collectionView, indexPath, dishData in + + let cell = self.configureCell(collectionView: collectionView, indexPath: indexPath, dishData: dishData) + + return cell + }) + + dataSource.supplementaryViewProvider = { [unowned self] + (collectionView, elementKind, indexPath) -> UICollectionReusableView? in + + return collectionView.dequeueConfiguredReusableSupplementary( + using: configureHeader(dataSource: dataSource), for: indexPath) + } + + return dataSource + } + + private func configureCell(collectionView: UICollectionView, indexPath: IndexPath, dishData: Dish) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: DishCardCell.reuseIdentifier, for: indexPath) as? DishCardCell else { + return UICollectionViewCell() + } + + DispatchQueue.main.async { + cell.dishImage.layer.cornerRadius = 15 + cell.dishImage.image = self.createImage(url: dishData.image) + } + cell.title.text = "\(dishData.title)" + cell.body.text = "\(dishData.description)" + + cell.charge.attributedText = convertCharge(normal: dishData.normalPrice, selling: dishData.sellingPrice) + + removeResidualBadges(stackView: cell.eventStackView) + if let badgeArray = createBadges(badgeString: dishData.badge) { + for badge in badgeArray { + cell.eventStackView.addArrangedSubview(badge) + } + } + + return cell + } + + private func configureHeader(dataSource: UICollectionViewDiffableDataSource) -> UICollectionView.SupplementaryRegistration + { + let headerRegistration = UICollectionView.SupplementaryRegistration + (elementKind: UICollectionView.elementKindSectionHeader) { + [unowned self] (headerView, elementKind, indexPath) in + + let headerItem = dataSource.snapshot().sectionIdentifiers[indexPath.section] + + var configuration = headerView.defaultContentConfiguration() + configuration.text = headerItem.name + + configuration.textProperties.font = .boldSystemFont(ofSize: 22) + configuration.textProperties.color = .black + + headerView.backgroundColor = .white + + self.toasterCloser[headerView.hash] = { + guard let mainView = UIApplication.shared.windows[0].rootViewController?.view else { + return + } + let message = "상품 \(headerItem.dishes.count)개 있어요!" + + mainView.hideAllToasts() + mainView.makeToast(message, duration: 1.0, point: CGPoint(x: mainView.center.x , y: mainView.center.y / 2), title: nil, image: nil, style: ToastManager.shared.style, completion: nil) + } + + let tap = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture(recognizer:))) + headerView.addGestureRecognizer(tap) + + // Apply the configuration to header view + headerView.contentConfiguration = configuration + } + return headerRegistration + } + + private func removeResidualBadges(stackView : UIStackView) { + for subView in stackView.subviews { + stackView.removeArrangedSubview(subView) + subView.removeFromSuperview() + } + } + + private func createBadges(badgeString: String) -> [UILabel]? { + if badgeString == "" { + return nil + } + + let stringArray = badgeString.components(separatedBy: ",") + var returnLabels = [UILabel]() + + for string in stringArray { + returnLabels.append(self.createEventLabel(text: string)) + } + + return returnLabels + } + + private func createImage(url: String) -> UIImage { + guard let imageURL = URL(string: url), + let imageData = try? Data(contentsOf: imageURL), + let image = UIImage(data: imageData) else + { + return UIImage() + } + return image + } + + private func createEventLabel(text : String) -> UILabel { + + var label : UILabel { + let newLabel = UILabel() + newLabel.text = " \(text) " + newLabel.clipsToBounds = true + newLabel.layer.cornerRadius = 5 + newLabel.backgroundColor = colorDictionary[text] + newLabel.textColor = UIColor.white + newLabel.font = UIFont.systemFont(ofSize: 12, weight: .bold) + + return newLabel + } + + return label + } + + private func convertCharge(normal: String, selling: String) -> NSMutableAttributedString { + let normalCharge = "\(String.insertComma(with: normal))원" + let sellingCharge = "\(String.insertComma(with: selling))원" + var attributedText : NSMutableAttributedString + + if selling != "" { + let wholeString = normalCharge + " " + sellingCharge + + attributedText = wholeString.styleAsCharge(with: normalCharge, with: sellingCharge) + } else { + attributedText = normalCharge.styleAsCharge(with: "", with: normalCharge) + } + return attributedText + } + + @objc private func handleTapGesture(recognizer: UITapGestureRecognizer) { + guard let targetHeader = recognizer.view else { + return + } + + guard let toaster = toasterCloser.first(where: { + $0.key == targetHeader.hash + }) else { + return + } + toaster.value() + } + +} diff --git a/SideDishApp/SideDishApp/Presentation/UI/ViewController/DishCollectionViewDelegate.swift b/SideDishApp/SideDishApp/Presentation/UI/ViewController/DishCollectionViewDelegate.swift new file mode 100644 index 000000000..c45e4bdba --- /dev/null +++ b/SideDishApp/SideDishApp/Presentation/UI/ViewController/DishCollectionViewDelegate.swift @@ -0,0 +1,14 @@ +// +// DishCollectionViewDelegate.swift +// SideDishApp +// +// Created by 이다훈 on 2021/04/23. +// + +import UIKit + +class DishCollectionViewDelegate : NSObject, UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return CGSize.init(width: collectionView.bounds.width, height: 130) + } +} diff --git a/SideDishApp/SideDishApp/Presentation/UI/ViewController/ViewController.swift b/SideDishApp/SideDishApp/Presentation/UI/ViewController/ViewController.swift index d27972bf7..24e34d8a6 100644 --- a/SideDishApp/SideDishApp/Presentation/UI/ViewController/ViewController.swift +++ b/SideDishApp/SideDishApp/Presentation/UI/ViewController/ViewController.swift @@ -6,6 +6,7 @@ // import UIKit +import Toast_Swift import Combine class ViewController: UIViewController { @@ -14,31 +15,18 @@ class ViewController: UIViewController { private let menuListViewModel = MenuListViewModel() private var subscriptions = Set() - var datasource : UICollectionViewDiffableDataSource! - let colorDictionary = ["이벤트특가" : UIColor.systemGreen, "런칭특가" : UIColor.systemBlue] + + let dishCollectionViewDelegate = DishCollectionViewDelegate() + var dataSource : UICollectionViewDiffableDataSource! + var snapshot = NSDiffableDataSourceSnapshot() override func viewDidLoad() { super.viewDidLoad() + dishCollectionView.delegate = dishCollectionViewDelegate + dataSource = DiffableProvider().configureDataSource(collectionView: dishCollectionView) bind() menuListViewModel.requestDishes() - datasource = configureDataSource() - - let testCard = DishCardCell.init() - let testCard1 = DishCardCell.init() - let testCard2 = DishCardCell.init() - - var snapshot = NSDiffableDataSourceSnapshot() - snapshot.appendSections([section.main]) - snapshot.appendItems([testCard], toSection: section.main) - snapshot.appendSections([section.soup]) - snapshot.appendItems([testCard1], toSection: section.soup) - snapshot.appendSections([section.side]) - snapshot.appendItems([testCard2], toSection: section.side) -// for section in section.allCases { -// snapshot.appendItems([testCard], toSection: section) -// } - - datasource.apply(snapshot) + } func bind() { @@ -46,8 +34,16 @@ class ViewController: UIViewController { .receive(on: DispatchQueue.main) .sink(receiveCompletion: { _ in //error - }, receiveValue: { _ in - print("메인 화면처리 해야함") + }, receiveValue: { mainDishes in + let mainDishesArray = mainDishes as Array + + guard let mainDishes = mainDishesArray.first else { + return + } + self.snapshot.appendSections(mainDishesArray) + self.snapshot.appendItems(mainDishes.dishes, toSection: mainDishes) + self.dataSource.apply(self.snapshot) + }) .store(in: &subscriptions) @@ -55,8 +51,15 @@ class ViewController: UIViewController { .receive(on: DispatchQueue.main) .sink(receiveCompletion: { _ in //error - }, receiveValue: { _ in - print("수프 화면처리 해야함") + }, receiveValue: { soupDishes in + let soupDishesArray = soupDishes as Array + + guard let soupDishes = soupDishesArray.first else { + return + } + self.snapshot.appendSections(soupDishesArray) + self.snapshot.appendItems(soupDishes.dishes, toSection: soupDishes) + self.dataSource.apply(self.snapshot) }) .store(in: &subscriptions) @@ -64,54 +67,17 @@ class ViewController: UIViewController { .receive(on: DispatchQueue.main) .sink(receiveCompletion: { _ in //error - }, receiveValue: { _ in - print("사이드 화면처리 해야함 ") + }, receiveValue: { sideDishes in + let sideDishesArray = sideDishes as Array + + guard let sideDishes = sideDishesArray.first else { + return + } + self.snapshot.appendSections(sideDishesArray) + self.snapshot.appendItems(sideDishes.dishes, toSection: sideDishes) + self.dataSource.apply(self.snapshot) }) .store(in: &subscriptions) } - func configureDataSource() -> UICollectionViewDiffableDataSource { - let dataSource = UICollectionViewDiffableDataSource (collectionView: dishCollectionView, cellProvider: { collectionView,indexPath,customCell in - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: DishCardCell.reuseIdentifier, for: indexPath) as? DishCardCell else { - return UICollectionViewCell() - } - sleep(2) - cell.title.text = "\(self.menuListViewModel.main[0].dishes[indexPath.row].title)" - - cell.title.numberOfLines = 0 - cell.body.text = "\(self.menuListViewModel.main[0].dishes[indexPath.row].description)" - - cell.eventStackView.spacing = 4 - cell.eventStackView.addArrangedSubview(self.createEventLabel(text: "이벤트특가")) - cell.eventStackView.addArrangedSubview(self.createEventLabel(text: "런칭특가")) - - return cell - }) - - return dataSource - } - - func createEventLabel(text : String) -> UILabel { - - var label : UILabel { - let newLabel = UILabel() - newLabel.text = " \(text) " - newLabel.clipsToBounds = true - newLabel.layer.cornerRadius = 5 - newLabel.backgroundColor = colorDictionary[text] - newLabel.textColor = UIColor.white - newLabel.font = UIFont.systemFont(ofSize: 12, weight: .bold) - - return newLabel - } - - return label - } - -} - -enum section : String, CaseIterable { - case main = "main" - case soup = "soup" - case side = "side" } diff --git a/SideDishApp/SideDishApp/Presentation/ViewModel/MenuListViewModel.swift b/SideDishApp/SideDishApp/Presentation/ViewModel/MenuListViewModel.swift index aefad7812..f0122397b 100644 --- a/SideDishApp/SideDishApp/Presentation/ViewModel/MenuListViewModel.swift +++ b/SideDishApp/SideDishApp/Presentation/ViewModel/MenuListViewModel.swift @@ -59,7 +59,7 @@ class MenuListViewModel { func requestDishes() { fetchDishes(dish: "main") - //fetchDishes(dish: "soup") - //fetchDishes(dish: "side") + fetchDishes(dish: "soup") + fetchDishes(dish: "side") } }