From 44b34bb4cba0bc94ae5d973cc673734891e9b72b Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 3 Jul 2024 12:49:29 +0200 Subject: [PATCH 01/85] Initial Commit --- demo-store-ios.xcodeproj/project.pbxproj | 587 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/xcschememanagement.plist | 14 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + demo-store-ios/Assets.xcassets/Contents.json | 6 + demo-store-ios/ContentView.swift | 24 + .../Preview Assets.xcassets/Contents.json | 6 + demo-store-ios/demo_store_iosApp.swift | 17 + demo-store-iosTests/demo_store_iosTests.swift | 36 ++ .../demo_store_iosUITests.swift | 41 ++ .../demo_store_iosUITestsLaunchTests.swift | 32 + 13 files changed, 802 insertions(+) create mode 100644 demo-store-ios.xcodeproj/project.pbxproj create mode 100644 demo-store-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 demo-store-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 demo-store-ios/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Contents.json create mode 100644 demo-store-ios/ContentView.swift create mode 100644 demo-store-ios/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 demo-store-ios/demo_store_iosApp.swift create mode 100644 demo-store-iosTests/demo_store_iosTests.swift create mode 100644 demo-store-iosUITests/demo_store_iosUITests.swift create mode 100644 demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj new file mode 100644 index 0000000..351ff56 --- /dev/null +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -0,0 +1,587 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 75B935572C3564360063E814 /* demo_store_iosApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* demo_store_iosApp.swift */; }; + 75B935592C3564360063E814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.swift */; }; + 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; + 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355D2C3564370063E814 /* Preview Assets.xcassets */; }; + 75B935682C3564370063E814 /* demo_store_iosTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935672C3564370063E814 /* demo_store_iosTests.swift */; }; + 75B935722C3564370063E814 /* demo_store_iosUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935712C3564370063E814 /* demo_store_iosUITests.swift */; }; + 75B935742C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935732C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 75B935642C3564370063E814 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75B9354B2C3564360063E814 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 75B935522C3564360063E814; + remoteInfo = "demo-store-ios"; + }; + 75B9356E2C3564370063E814 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75B9354B2C3564360063E814 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 75B935522C3564360063E814; + remoteInfo = "demo-store-ios"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 75B935562C3564360063E814 /* demo_store_iosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosApp.swift; sourceTree = ""; }; + 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 75B9355A2C3564370063E814 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 75B9355D2C3564370063E814 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 75B935632C3564370063E814 /* demo-store-iosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "demo-store-iosTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 75B935672C3564370063E814 /* demo_store_iosTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosTests.swift; sourceTree = ""; }; + 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "demo-store-iosUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 75B935712C3564370063E814 /* demo_store_iosUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosUITests.swift; sourceTree = ""; }; + 75B935732C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosUITestsLaunchTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 75B935502C3564360063E814 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75B935602C3564370063E814 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75B9356A2C3564370063E814 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 75B9354A2C3564360063E814 = { + isa = PBXGroup; + children = ( + 75B935552C3564360063E814 /* demo-store-ios */, + 75B935662C3564370063E814 /* demo-store-iosTests */, + 75B935702C3564370063E814 /* demo-store-iosUITests */, + 75B935542C3564360063E814 /* Products */, + ); + sourceTree = ""; + }; + 75B935542C3564360063E814 /* Products */ = { + isa = PBXGroup; + children = ( + 75B935532C3564360063E814 /* demo-store-ios.app */, + 75B935632C3564370063E814 /* demo-store-iosTests.xctest */, + 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 75B935552C3564360063E814 /* demo-store-ios */ = { + isa = PBXGroup; + children = ( + 75B935562C3564360063E814 /* demo_store_iosApp.swift */, + 75B935582C3564360063E814 /* ContentView.swift */, + 75B9355A2C3564370063E814 /* Assets.xcassets */, + 75B9355C2C3564370063E814 /* Preview Content */, + ); + path = "demo-store-ios"; + sourceTree = ""; + }; + 75B9355C2C3564370063E814 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 75B9355D2C3564370063E814 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 75B935662C3564370063E814 /* demo-store-iosTests */ = { + isa = PBXGroup; + children = ( + 75B935672C3564370063E814 /* demo_store_iosTests.swift */, + ); + path = "demo-store-iosTests"; + sourceTree = ""; + }; + 75B935702C3564370063E814 /* demo-store-iosUITests */ = { + isa = PBXGroup; + children = ( + 75B935712C3564370063E814 /* demo_store_iosUITests.swift */, + 75B935732C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift */, + ); + path = "demo-store-iosUITests"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 75B935522C3564360063E814 /* demo-store-ios */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75B935772C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-ios" */; + buildPhases = ( + 75B9354F2C3564360063E814 /* Sources */, + 75B935502C3564360063E814 /* Frameworks */, + 75B935512C3564360063E814 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "demo-store-ios"; + productName = "demo-store-ios"; + productReference = 75B935532C3564360063E814 /* demo-store-ios.app */; + productType = "com.apple.product-type.application"; + }; + 75B935622C3564370063E814 /* demo-store-iosTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75B9357A2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosTests" */; + buildPhases = ( + 75B9355F2C3564370063E814 /* Sources */, + 75B935602C3564370063E814 /* Frameworks */, + 75B935612C3564370063E814 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 75B935652C3564370063E814 /* PBXTargetDependency */, + ); + name = "demo-store-iosTests"; + productName = "demo-store-iosTests"; + productReference = 75B935632C3564370063E814 /* demo-store-iosTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 75B9356C2C3564370063E814 /* demo-store-iosUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75B9357D2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosUITests" */; + buildPhases = ( + 75B935692C3564370063E814 /* Sources */, + 75B9356A2C3564370063E814 /* Frameworks */, + 75B9356B2C3564370063E814 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 75B9356F2C3564370063E814 /* PBXTargetDependency */, + ); + name = "demo-store-iosUITests"; + productName = "demo-store-iosUITests"; + productReference = 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 75B9354B2C3564360063E814 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1540; + LastUpgradeCheck = 1540; + TargetAttributes = { + 75B935522C3564360063E814 = { + CreatedOnToolsVersion = 15.4; + }; + 75B935622C3564370063E814 = { + CreatedOnToolsVersion = 15.4; + TestTargetID = 75B935522C3564360063E814; + }; + 75B9356C2C3564370063E814 = { + CreatedOnToolsVersion = 15.4; + TestTargetID = 75B935522C3564360063E814; + }; + }; + }; + buildConfigurationList = 75B9354E2C3564360063E814 /* Build configuration list for PBXProject "demo-store-ios" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 75B9354A2C3564360063E814; + productRefGroup = 75B935542C3564360063E814 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 75B935522C3564360063E814 /* demo-store-ios */, + 75B935622C3564370063E814 /* demo-store-iosTests */, + 75B9356C2C3564370063E814 /* demo-store-iosUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 75B935512C3564360063E814 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */, + 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75B935612C3564370063E814 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75B9356B2C3564370063E814 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 75B9354F2C3564360063E814 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75B935592C3564360063E814 /* ContentView.swift in Sources */, + 75B935572C3564360063E814 /* demo_store_iosApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75B9355F2C3564370063E814 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75B935682C3564370063E814 /* demo_store_iosTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75B935692C3564370063E814 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75B935722C3564370063E814 /* demo_store_iosUITests.swift in Sources */, + 75B935742C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 75B935652C3564370063E814 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 75B935522C3564360063E814 /* demo-store-ios */; + targetProxy = 75B935642C3564370063E814 /* PBXContainerItemProxy */; + }; + 75B9356F2C3564370063E814 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 75B935522C3564360063E814 /* demo-store-ios */; + targetProxy = 75B9356E2C3564370063E814 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 75B935752C3564370063E814 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 75B935762C3564370063E814 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 75B935782C3564370063E814 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"demo-store-ios/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-ios"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 75B935792C3564370063E814 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"demo-store-ios/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-ios"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 75B9357B2C3564370063E814 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-iosTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/demo-store-ios.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/demo-store-ios"; + }; + name = Debug; + }; + 75B9357C2C3564370063E814 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-iosTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/demo-store-ios.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/demo-store-ios"; + }; + name = Release; + }; + 75B9357E2C3564370063E814 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-iosUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "demo-store-ios"; + }; + name = Debug; + }; + 75B9357F2C3564370063E814 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-iosUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "demo-store-ios"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 75B9354E2C3564360063E814 /* Build configuration list for PBXProject "demo-store-ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75B935752C3564370063E814 /* Debug */, + 75B935762C3564370063E814 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75B935772C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75B935782C3564370063E814 /* Debug */, + 75B935792C3564370063E814 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75B9357A2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75B9357B2C3564370063E814 /* Debug */, + 75B9357C2C3564370063E814 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75B9357D2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75B9357E2C3564370063E814 /* Debug */, + 75B9357F2C3564370063E814 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 75B9354B2C3564360063E814 /* Project object */; +} diff --git a/demo-store-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/demo-store-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/demo-store-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/demo-store-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demo-store-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/demo-store-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..a82731e --- /dev/null +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + demo-store-ios.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/demo-store-ios/Assets.xcassets/AccentColor.colorset/Contents.json b/demo-store-ios/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/demo-store-ios/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Contents.json b/demo-store-ios/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/ContentView.swift b/demo-store-ios/ContentView.swift new file mode 100644 index 0000000..93d0d12 --- /dev/null +++ b/demo-store-ios/ContentView.swift @@ -0,0 +1,24 @@ +// +// ContentView.swift +// demo-store-ios +// +// Created by Daniel Green on 2024-07-03. +// + +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} + +#Preview { + ContentView() +} diff --git a/demo-store-ios/Preview Content/Preview Assets.xcassets/Contents.json b/demo-store-ios/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/demo-store-ios/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/demo_store_iosApp.swift b/demo-store-ios/demo_store_iosApp.swift new file mode 100644 index 0000000..898dcea --- /dev/null +++ b/demo-store-ios/demo_store_iosApp.swift @@ -0,0 +1,17 @@ +// +// demo_store_iosApp.swift +// demo-store-ios +// +// Created by Daniel Green on 2024-07-03. +// + +import SwiftUI + +@main +struct demo_store_iosApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/demo-store-iosTests/demo_store_iosTests.swift b/demo-store-iosTests/demo_store_iosTests.swift new file mode 100644 index 0000000..479c04a --- /dev/null +++ b/demo-store-iosTests/demo_store_iosTests.swift @@ -0,0 +1,36 @@ +// +// demo_store_iosTests.swift +// demo-store-iosTests +// +// Created by Daniel Green on 2024-07-03. +// + +import XCTest +@testable import demo_store_ios + +final class demo_store_iosTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/demo-store-iosUITests/demo_store_iosUITests.swift b/demo-store-iosUITests/demo_store_iosUITests.swift new file mode 100644 index 0000000..dc5091a --- /dev/null +++ b/demo-store-iosUITests/demo_store_iosUITests.swift @@ -0,0 +1,41 @@ +// +// demo_store_iosUITests.swift +// demo-store-iosUITests +// +// Created by Daniel Green on 2024-07-03. +// + +import XCTest + +final class demo_store_iosUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } + } +} diff --git a/demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift b/demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift new file mode 100644 index 0000000..e5e9d85 --- /dev/null +++ b/demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift @@ -0,0 +1,32 @@ +// +// demo_store_iosUITestsLaunchTests.swift +// demo-store-iosUITests +// +// Created by Daniel Green on 2024-07-03. +// + +import XCTest + +final class demo_store_iosUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +} From 9211412d64b1a5c7289bccf2fb6d607243eab2f7 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 3 Jul 2024 12:53:34 +0200 Subject: [PATCH 02/85] feat/ Initial commit --- .idea/.gitignore | 3 +++ .idea/demo-store-ios.iml | 9 +++++++++ .idea/misc.xml | 10 ++++++++++ .idea/modules.xml | 8 ++++++++ .idea/vcs.xml | 6 ++++++ demo-store-ios/ContentView.swift | 6 ------ demo-store-ios/demo_store_iosApp.swift | 6 ------ demo-store-iosTests/demo_store_iosTests.swift | 6 ------ demo-store-iosUITests/demo_store_iosUITests.swift | 6 ------ .../demo_store_iosUITestsLaunchTests.swift | 6 ------ 10 files changed, 36 insertions(+), 30 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/demo-store-ios.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/demo-store-ios.iml b/.idea/demo-store-ios.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/demo-store-ios.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..6889439 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..eeb7ec2 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/demo-store-ios/ContentView.swift b/demo-store-ios/ContentView.swift index 93d0d12..4e03bdb 100644 --- a/demo-store-ios/ContentView.swift +++ b/demo-store-ios/ContentView.swift @@ -1,9 +1,3 @@ -// -// ContentView.swift -// demo-store-ios -// -// Created by Daniel Green on 2024-07-03. -// import SwiftUI diff --git a/demo-store-ios/demo_store_iosApp.swift b/demo-store-ios/demo_store_iosApp.swift index 898dcea..f7d3fcb 100644 --- a/demo-store-ios/demo_store_iosApp.swift +++ b/demo-store-ios/demo_store_iosApp.swift @@ -1,9 +1,3 @@ -// -// demo_store_iosApp.swift -// demo-store-ios -// -// Created by Daniel Green on 2024-07-03. -// import SwiftUI diff --git a/demo-store-iosTests/demo_store_iosTests.swift b/demo-store-iosTests/demo_store_iosTests.swift index 479c04a..fd9d470 100644 --- a/demo-store-iosTests/demo_store_iosTests.swift +++ b/demo-store-iosTests/demo_store_iosTests.swift @@ -1,9 +1,3 @@ -// -// demo_store_iosTests.swift -// demo-store-iosTests -// -// Created by Daniel Green on 2024-07-03. -// import XCTest @testable import demo_store_ios diff --git a/demo-store-iosUITests/demo_store_iosUITests.swift b/demo-store-iosUITests/demo_store_iosUITests.swift index dc5091a..1809ffd 100644 --- a/demo-store-iosUITests/demo_store_iosUITests.swift +++ b/demo-store-iosUITests/demo_store_iosUITests.swift @@ -1,9 +1,3 @@ -// -// demo_store_iosUITests.swift -// demo-store-iosUITests -// -// Created by Daniel Green on 2024-07-03. -// import XCTest diff --git a/demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift b/demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift index e5e9d85..8a5b0a0 100644 --- a/demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift +++ b/demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift @@ -1,9 +1,3 @@ -// -// demo_store_iosUITestsLaunchTests.swift -// demo-store-iosUITests -// -// Created by Daniel Green on 2024-07-03. -// import XCTest From b35a3305bab6df3cb4b975607ec1f54193245f50 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 3 Jul 2024 13:27:26 +0200 Subject: [PATCH 03/85] feat: Add podfile, remove IDE creating comments --- .gitignore | 90 +++++++++++++ .idea/misc.xml | 1 - Podfile | 18 +++ Podfile.lock | 3 + demo-store-ios.xcodeproj/project.pbxproj | 119 ++++++++++++++++++ .../xcschemes/xcschememanagement.plist | 2 +- .../contents.xcworkspacedata | 10 ++ 7 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 Podfile create mode 100644 Podfile.lock create mode 100644 demo-store-ios.xcworkspace/contents.xcworkspacedata diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba1ff08 --- /dev/null +++ b/.gitignore @@ -0,0 +1,90 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +# *.xcodeproj +# +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +# .swiftpm + +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build/ + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 6889439..14f23db 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..6b6b536 --- /dev/null +++ b/Podfile @@ -0,0 +1,18 @@ + platform :ios, '12.0' + +target 'demo-store-ios' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for demo-store-ios + + target 'demo-store-iosTests' do + inherit! :search_paths + # Pods for testing + end + + target 'demo-store-iosUITests' do + # Pods for testing + end + +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..a5b629c --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,3 @@ +PODFILE CHECKSUM: 4a24176b9e5f3fc81f6e2bab6f8db84fbe9acb1d + +COCOAPODS: 1.15.2 diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 351ff56..2f0b40e 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -14,6 +14,9 @@ 75B935682C3564370063E814 /* demo_store_iosTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935672C3564370063E814 /* demo_store_iosTests.swift */; }; 75B935722C3564370063E814 /* demo_store_iosUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935712C3564370063E814 /* demo_store_iosUITests.swift */; }; 75B935742C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935732C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift */; }; + D78A79C526F8BC172C2E09DA /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; + E595009B8CDAA1ED437EACF0 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */; }; + FF4CD03BDB28EF3ACB920BA6 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -34,6 +37,10 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 18B7CB949CB70787994FC425 /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; + 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7441D18EA106D3DD3F55F71E /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935562C3564360063E814 /* demo_store_iosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosApp.swift; sourceTree = ""; }; 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -44,6 +51,11 @@ 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "demo-store-iosUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935712C3564370063E814 /* demo_store_iosUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosUITests.swift; sourceTree = ""; }; 75B935732C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosUITestsLaunchTests.swift; sourceTree = ""; }; + 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; + CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; + E53FD615F0125C2729676AE8 /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; + F859F4F7880823262AFE04A6 /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -51,6 +63,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + E595009B8CDAA1ED437EACF0 /* Pods_demo_store_ios.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -58,6 +71,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + FF4CD03BDB28EF3ACB920BA6 /* Pods_demo_store_iosTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -65,12 +79,23 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D78A79C526F8BC172C2E09DA /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 555D3BD6CEC2A2DE26F6F90B /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */, + 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */, + 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( @@ -78,6 +103,8 @@ 75B935662C3564370063E814 /* demo-store-iosTests */, 75B935702C3564370063E814 /* demo-store-iosUITests */, 75B935542C3564360063E814 /* Products */, + 8FED5CC7CDC6607CEFB8FDC9 /* Pods */, + 555D3BD6CEC2A2DE26F6F90B /* Frameworks */, ); sourceTree = ""; }; @@ -127,6 +154,20 @@ path = "demo-store-iosUITests"; sourceTree = ""; }; + 8FED5CC7CDC6607CEFB8FDC9 /* Pods */ = { + isa = PBXGroup; + children = ( + 18B7CB949CB70787994FC425 /* Pods-demo-store-ios.debug.xcconfig */, + F859F4F7880823262AFE04A6 /* Pods-demo-store-ios.release.xcconfig */, + 7441D18EA106D3DD3F55F71E /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, + CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, + E53FD615F0125C2729676AE8 /* Pods-demo-store-iosTests.debug.xcconfig */, + 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -134,6 +175,7 @@ isa = PBXNativeTarget; buildConfigurationList = 75B935772C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-ios" */; buildPhases = ( + 143A2DE2E2486406D53AE310 /* [CP] Check Pods Manifest.lock */, 75B9354F2C3564360063E814 /* Sources */, 75B935502C3564360063E814 /* Frameworks */, 75B935512C3564360063E814 /* Resources */, @@ -151,6 +193,7 @@ isa = PBXNativeTarget; buildConfigurationList = 75B9357A2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosTests" */; buildPhases = ( + D54062FE68FA5656A533574F /* [CP] Check Pods Manifest.lock */, 75B9355F2C3564370063E814 /* Sources */, 75B935602C3564370063E814 /* Frameworks */, 75B935612C3564370063E814 /* Resources */, @@ -169,6 +212,7 @@ isa = PBXNativeTarget; buildConfigurationList = 75B9357D2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosUITests" */; buildPhases = ( + F2F4E1FC1AC641B44DE1FCB8 /* [CP] Check Pods Manifest.lock */, 75B935692C3564370063E814 /* Sources */, 75B9356A2C3564370063E814 /* Frameworks */, 75B9356B2C3564370063E814 /* Resources */, @@ -252,6 +296,75 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 143A2DE2E2486406D53AE310 /* [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-demo-store-ios-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; + }; + D54062FE68FA5656A533574F /* [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-demo-store-iosTests-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; + }; + F2F4E1FC1AC641B44DE1FCB8 /* [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-demo-store-ios-demo-store-iosUITests-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; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 75B9354F2C3564360063E814 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -416,6 +529,7 @@ }; 75B935782C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 18B7CB949CB70787994FC425 /* Pods-demo-store-ios.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -444,6 +558,7 @@ }; 75B935792C3564370063E814 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = F859F4F7880823262AFE04A6 /* Pods-demo-store-ios.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -472,6 +587,7 @@ }; 75B9357B2C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E53FD615F0125C2729676AE8 /* Pods-demo-store-iosTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; @@ -491,6 +607,7 @@ }; 75B9357C2C3564370063E814 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; @@ -510,6 +627,7 @@ }; 75B9357E2C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7441D18EA106D3DD3F55F71E /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -527,6 +645,7 @@ }; 75B9357F2C3564370063E814 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist index a82731e..bf1df1a 100644 --- a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ demo-store-ios.xcscheme_^#shared#^_ orderHint - 0 + 3 diff --git a/demo-store-ios.xcworkspace/contents.xcworkspacedata b/demo-store-ios.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a41d896 --- /dev/null +++ b/demo-store-ios.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + From 7c173ae6a01cb37be713534d95722cab54e96fc9 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 3 Jul 2024 13:47:51 +0200 Subject: [PATCH 04/85] fix: Rename entry points classes and files --- Podfile.lock | 2 +- demo-store-ios.xcodeproj/project.pbxproj | 33 +++++++++---------- ..._store_iosApp.swift => DemoStoreApp.swift} | 2 +- ...re_iosTests.swift => DemoStoreTests.swift} | 2 +- ...osUITests.swift => DemoStoreUITests.swift} | 2 +- ...wift => DemoStoreUITestsLaunchTests.swift} | 2 +- 6 files changed, 21 insertions(+), 22 deletions(-) rename demo-store-ios/{demo_store_iosApp.swift => DemoStoreApp.swift} (78%) rename demo-store-iosTests/{demo_store_iosTests.swift => DemoStoreTests.swift} (95%) rename demo-store-iosUITests/{demo_store_iosUITests.swift => DemoStoreUITests.swift} (96%) rename demo-store-iosUITests/{demo_store_iosUITestsLaunchTests.swift => DemoStoreUITestsLaunchTests.swift} (91%) diff --git a/Podfile.lock b/Podfile.lock index a5b629c..34b0f0c 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,3 +1,3 @@ -PODFILE CHECKSUM: 4a24176b9e5f3fc81f6e2bab6f8db84fbe9acb1d +PODFILE CHECKSUM: 149d4084f0a926e30c6011e52f5111014f15474e COCOAPODS: 1.15.2 diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 2f0b40e..ce1e99b 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -7,13 +7,13 @@ objects = { /* Begin PBXBuildFile section */ - 75B935572C3564360063E814 /* demo_store_iosApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* demo_store_iosApp.swift */; }; + 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* DemoStoreApp.swift */; }; 75B935592C3564360063E814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355D2C3564370063E814 /* Preview Assets.xcassets */; }; - 75B935682C3564370063E814 /* demo_store_iosTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935672C3564370063E814 /* demo_store_iosTests.swift */; }; - 75B935722C3564370063E814 /* demo_store_iosUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935712C3564370063E814 /* demo_store_iosUITests.swift */; }; - 75B935742C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935732C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift */; }; + 75B935682C3564370063E814 /* DemoStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935672C3564370063E814 /* DemoStoreTests.swift */; }; + 75B935722C3564370063E814 /* DemoStoreUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935712C3564370063E814 /* DemoStoreUITests.swift */; }; + 75B935742C3564370063E814 /* DemoStoreUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */; }; D78A79C526F8BC172C2E09DA /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; E595009B8CDAA1ED437EACF0 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */; }; FF4CD03BDB28EF3ACB920BA6 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */; }; @@ -42,15 +42,15 @@ 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7441D18EA106D3DD3F55F71E /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 75B935562C3564360063E814 /* demo_store_iosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosApp.swift; sourceTree = ""; }; + 75B935562C3564360063E814 /* DemoStoreApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.swift; sourceTree = ""; }; 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 75B9355A2C3564370063E814 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 75B9355D2C3564370063E814 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 75B935632C3564370063E814 /* demo-store-iosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "demo-store-iosTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 75B935672C3564370063E814 /* demo_store_iosTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosTests.swift; sourceTree = ""; }; + 75B935672C3564370063E814 /* DemoStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreTests.swift; sourceTree = ""; }; 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "demo-store-iosUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 75B935712C3564370063E814 /* demo_store_iosUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosUITests.swift; sourceTree = ""; }; - 75B935732C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = demo_store_iosUITestsLaunchTests.swift; sourceTree = ""; }; + 75B935712C3564370063E814 /* DemoStoreUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreUITests.swift; sourceTree = ""; }; + 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreUITestsLaunchTests.swift; sourceTree = ""; }; 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; @@ -121,7 +121,7 @@ 75B935552C3564360063E814 /* demo-store-ios */ = { isa = PBXGroup; children = ( - 75B935562C3564360063E814 /* demo_store_iosApp.swift */, + 75B935562C3564360063E814 /* DemoStoreApp.swift */, 75B935582C3564360063E814 /* ContentView.swift */, 75B9355A2C3564370063E814 /* Assets.xcassets */, 75B9355C2C3564370063E814 /* Preview Content */, @@ -140,7 +140,7 @@ 75B935662C3564370063E814 /* demo-store-iosTests */ = { isa = PBXGroup; children = ( - 75B935672C3564370063E814 /* demo_store_iosTests.swift */, + 75B935672C3564370063E814 /* DemoStoreTests.swift */, ); path = "demo-store-iosTests"; sourceTree = ""; @@ -148,8 +148,8 @@ 75B935702C3564370063E814 /* demo-store-iosUITests */ = { isa = PBXGroup; children = ( - 75B935712C3564370063E814 /* demo_store_iosUITests.swift */, - 75B935732C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift */, + 75B935712C3564370063E814 /* DemoStoreUITests.swift */, + 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */, ); path = "demo-store-iosUITests"; sourceTree = ""; @@ -164,7 +164,6 @@ E53FD615F0125C2729676AE8 /* Pods-demo-store-iosTests.debug.xcconfig */, 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -371,7 +370,7 @@ buildActionMask = 2147483647; files = ( 75B935592C3564360063E814 /* ContentView.swift in Sources */, - 75B935572C3564360063E814 /* demo_store_iosApp.swift in Sources */, + 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -379,7 +378,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75B935682C3564370063E814 /* demo_store_iosTests.swift in Sources */, + 75B935682C3564370063E814 /* DemoStoreTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -387,8 +386,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75B935722C3564370063E814 /* demo_store_iosUITests.swift in Sources */, - 75B935742C3564370063E814 /* demo_store_iosUITestsLaunchTests.swift in Sources */, + 75B935722C3564370063E814 /* DemoStoreUITests.swift in Sources */, + 75B935742C3564370063E814 /* DemoStoreUITestsLaunchTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/demo-store-ios/demo_store_iosApp.swift b/demo-store-ios/DemoStoreApp.swift similarity index 78% rename from demo-store-ios/demo_store_iosApp.swift rename to demo-store-ios/DemoStoreApp.swift index f7d3fcb..cedf601 100644 --- a/demo-store-ios/demo_store_iosApp.swift +++ b/demo-store-ios/DemoStoreApp.swift @@ -2,7 +2,7 @@ import SwiftUI @main -struct demo_store_iosApp: App { +struct DemoStoreApp: App { var body: some Scene { WindowGroup { ContentView() diff --git a/demo-store-iosTests/demo_store_iosTests.swift b/demo-store-iosTests/DemoStoreTests.swift similarity index 95% rename from demo-store-iosTests/demo_store_iosTests.swift rename to demo-store-iosTests/DemoStoreTests.swift index fd9d470..0fc8597 100644 --- a/demo-store-iosTests/demo_store_iosTests.swift +++ b/demo-store-iosTests/DemoStoreTests.swift @@ -2,7 +2,7 @@ import XCTest @testable import demo_store_ios -final class demo_store_iosTests: XCTestCase { +final class DemoStoreTests: XCTestCase { override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. diff --git a/demo-store-iosUITests/demo_store_iosUITests.swift b/demo-store-iosUITests/DemoStoreUITests.swift similarity index 96% rename from demo-store-iosUITests/demo_store_iosUITests.swift rename to demo-store-iosUITests/DemoStoreUITests.swift index 1809ffd..43ac13c 100644 --- a/demo-store-iosUITests/demo_store_iosUITests.swift +++ b/demo-store-iosUITests/DemoStoreUITests.swift @@ -1,7 +1,7 @@ import XCTest -final class demo_store_iosUITests: XCTestCase { +final class DemoStoreUITests: XCTestCase { override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. diff --git a/demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift b/demo-store-iosUITests/DemoStoreUITestsLaunchTests.swift similarity index 91% rename from demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift rename to demo-store-iosUITests/DemoStoreUITestsLaunchTests.swift index 8a5b0a0..d46d95c 100644 --- a/demo-store-iosUITests/demo_store_iosUITestsLaunchTests.swift +++ b/demo-store-iosUITests/DemoStoreUITestsLaunchTests.swift @@ -1,7 +1,7 @@ import XCTest -final class demo_store_iosUITestsLaunchTests: XCTestCase { +final class DemoStoreUITestsLaunchTests: XCTestCase { override class var runsForEachTargetApplicationUIConfiguration: Bool { true From c04a6ccc292a8df4e84a38546ce07818847b7c8e Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 3 Jul 2024 16:11:03 +0200 Subject: [PATCH 05/85] feat: Add splash screen and separate files --- .idea/.gitignore | 61 +- .idea/demo-ios.iml | 9 + Podfile | 6 +- Pods/Manifest.lock | 3 + Pods/Pods.xcodeproj/project.pbxproj | 755 ++++++++++++++++++ ...store-ios-demo-store-iosUITests-Info.plist | 26 + ...store-iosUITests-acknowledgements.markdown | 3 + ...mo-store-iosUITests-acknowledgements.plist | 29 + ...mo-store-ios-demo-store-iosUITests-dummy.m | 5 + ...store-ios-demo-store-iosUITests-umbrella.h | 16 + ...e-ios-demo-store-iosUITests.debug.xcconfig | 8 + ...-store-ios-demo-store-iosUITests.modulemap | 6 + ...ios-demo-store-iosUITests.release.xcconfig | 8 + .../Pods-demo-store-ios-Info.plist | 28 + ...s-demo-store-ios-acknowledgements.markdown | 3 + ...Pods-demo-store-ios-acknowledgements.plist | 29 + .../Pods-demo-store-ios-dummy.m | 5 + .../Pods-demo-store-ios-umbrella.h | 16 + .../Pods-demo-store-ios.debug.xcconfig | 8 + .../Pods-demo-store-ios.modulemap | 6 + .../Pods-demo-store-ios.release.xcconfig | 8 + .../Pods-demo-store-iosTests-Info.plist | 26 + ...o-store-iosTests-acknowledgements.markdown | 3 + ...demo-store-iosTests-acknowledgements.plist | 29 + .../Pods-demo-store-iosTests-dummy.m | 5 + .../Pods-demo-store-iosTests-umbrella.h | 16 + .../Pods-demo-store-iosTests.debug.xcconfig | 8 + .../Pods-demo-store-iosTests.modulemap | 6 + .../Pods-demo-store-iosTests.release.xcconfig | 8 + demo-store-ios.xcodeproj/project.pbxproj | 40 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../Assets.xcassets/Logo/Contents.json | 6 + .../Logo/SplashLogo.imageset/Contents.json | 23 + .../Logo/SplashLogo.imageset/Logo 1.pdf | Bin 0 -> 9719 bytes .../Logo/SplashLogo.imageset/Logo 2.pdf | Bin 0 -> 9719 bytes .../Logo/SplashLogo.imageset/Logo.pdf | Bin 0 -> 9719 bytes demo-store-ios/DemoStoreApp.swift | 16 +- .../features/splash/LaunchScreen.swift | 31 + .../features/splash/SplashScreenView.swift | 26 + demo-store-ios/utils/UiUtils.swift | 50 ++ 40 files changed, 1331 insertions(+), 8 deletions(-) create mode 100644 .idea/demo-ios.iml create mode 100644 Pods/Manifest.lock create mode 100644 Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-dummy.m create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-umbrella.h create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-dummy.m create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-umbrella.h create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig create mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist create mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.markdown create mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.plist create mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-dummy.m create mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-umbrella.h create mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig create mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap create mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig create mode 100644 demo-store-ios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 demo-store-ios/Assets.xcassets/Logo/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf create mode 100644 demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf create mode 100644 demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf create mode 100644 demo-store-ios/features/splash/LaunchScreen.swift create mode 100644 demo-store-ios/features/splash/SplashScreenView.swift create mode 100644 demo-store-ios/utils/UiUtils.swift diff --git a/.idea/.gitignore b/.idea/.gitignore index 26d3352..a8a965e 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -1,3 +1,58 @@ -# Default ignored files -/shelf/ -/workspace.xml +## User settings +xcuserdata/ + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +# *.xcodeproj +# +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +# .swiftpm + +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build/ + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output \ No newline at end of file diff --git a/.idea/demo-ios.iml b/.idea/demo-ios.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/demo-ios.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Podfile b/Podfile index 6b6b536..b37a78c 100644 --- a/Podfile +++ b/Podfile @@ -1,10 +1,10 @@ - platform :ios, '12.0' +platform :ios, '12.0' target 'demo-store-ios' do - # Comment the next line if you don't want to use dynamic frameworks use_frameworks! - # Pods for demo-store-ios + # Добавьте ваш SDK + pod 'REES46', :git => 'https://github.com/rees46/ios-sdk.git', :branch => 'master', :tag => '3.6.19' target 'demo-store-iosTests' do inherit! :search_paths diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..34b0f0c --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,3 @@ +PODFILE CHECKSUM: 149d4084f0a926e30c6011e52f5111014f15474e + +COCOAPODS: 1.15.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..4ca0012 --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,755 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 0EB01A16DB7BF09F43A06760CAAD7AF5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 2ED0D7AE2F2531563EBC0135C853AE8E /* Pods-demo-store-iosTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2820D7576E9D83DD79F820940F214CDF /* Pods-demo-store-iosTests-dummy.m */; }; + 4CF839B5325FB3ACF72D843CFF091251 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 79D2610CEAF017AD0332D7F90672483A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 7A60842F1082CDF4F04C7DE464416B35 /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 73948AC430BD554A737110C5CCBDF88A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */; }; + 834C14FE5447464523181F2F002D63FE /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 000794A532A447E20C7175D1D5724A31 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9E2500E6DDD2ADAF4D773649B7A360C9 /* Pods-demo-store-iosTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 77437148103FBD547B6ACA0E29028AF1 /* Pods-demo-store-iosTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF78F329D56E1C5D0A0B83A5D9E03EED /* Pods-demo-store-ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CF521C1E5BEF75F11F75D3EF1212D499 /* Pods-demo-store-ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DFFF30C2EB16C41D21FC724DC7E4AB43 /* Pods-demo-store-ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D87EF1D4E9B9A3D0F6FA34800AB6F48 /* Pods-demo-store-ios-dummy.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 5F88B7735B116F009987088762EC7F2F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 80CA65F514DD5B1DC5829F29295F6292; + remoteInfo = "Pods-demo-store-ios"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 000794A532A447E20C7175D1D5724A31 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-demo-store-iosUITests-umbrella.h"; sourceTree = ""; }; + 0D8535F146F9398315EBFC5555887E37 /* Pods-demo-store-ios-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-Info.plist"; sourceTree = ""; }; + 2820D7576E9D83DD79F820940F214CDF /* Pods-demo-store-iosTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-iosTests-dummy.m"; sourceTree = ""; }; + 3FA3CB90DCB86363A419F3791B7B3A34 /* Pods-demo-store-iosTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-iosTests.modulemap"; sourceTree = ""; }; + 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-iosTests"; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 541C246A0AE79A1CC820CFF87F6B0BC6 /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; + 5D87EF1D4E9B9A3D0F6FA34800AB6F48 /* Pods-demo-store-ios-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-dummy.m"; sourceTree = ""; }; + 5DB4BE39384F4CAFB6BEED58E43B9E6D /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; + 73010CC983E3809BECEE5348DA1BB8C6 /* 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; }; + 73948AC430BD554A737110C5CCBDF88A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-demo-store-iosUITests-dummy.m"; sourceTree = ""; }; + 77437148103FBD547B6ACA0E29028AF1 /* Pods-demo-store-iosTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-iosTests-umbrella.h"; sourceTree = ""; }; + 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios-demo-store-iosUITests"; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 99F2681231E62574920A23BBA1BE7657 /* Pods-demo-store-ios-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-acknowledgements.plist"; sourceTree = ""; }; + 9C56376A1E36CAF7BE077F7B9A6C7C80 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist"; 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; }; + 9DD417BED260D762F9613D0934D1C06E /* Pods-demo-store-iosTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-acknowledgements.plist"; sourceTree = ""; }; + A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios"; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A349F70763EBA29B153A9EBC74ACA5E0 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown"; sourceTree = ""; }; + B00A45F6B27A0C155BD06F52EEB2B9A9 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; + B89E1C307963068AD807FE658CCC41C0 /* Pods-demo-store-ios-demo-store-iosUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; sourceTree = ""; }; + BDA32C7D30CD5025FFCA4FF5F2BC8124 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; + CEF2605DB4960E5503E8622AD666F390 /* Pods-demo-store-ios-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-acknowledgements.markdown"; sourceTree = ""; }; + CF521C1E5BEF75F11F75D3EF1212D499 /* Pods-demo-store-ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-umbrella.h"; sourceTree = ""; }; + D0551A46E0902FC163468EEB71CF0D05 /* Pods-demo-store-iosTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-Info.plist"; sourceTree = ""; }; + D4883278E9C43B1A1B5122C838F2371F /* Pods-demo-store-ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios.modulemap"; sourceTree = ""; }; + D8A669AAE1BD38692EB0DF177A4A4785 /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; + DF8B984FD50CC786F6E8C7D8DA034152 /* Pods-demo-store-iosTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-iosTests-acknowledgements.markdown"; sourceTree = ""; }; + F82F204BB039897365274B7C21538809 /* Pods-demo-store-ios-demo-store-iosUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios-demo-store-iosUITests.modulemap"; sourceTree = ""; }; + FEB5355A1D321179D84CC5BD9162A74C /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 04D60E451996ABB241E7F11AA534C260 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4CF839B5325FB3ACF72D843CFF091251 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CA705C5F96DD6DF2E3692326AFB3DEC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0EB01A16DB7BF09F43A06760CAAD7AF5 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DECADAED0D9B70A5AB59DADE37D3AE1E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 79D2610CEAF017AD0332D7F90672483A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1965A49D3B7987D00E298B33CB853E40 /* Pods-demo-store-ios-demo-store-iosUITests */ = { + isa = PBXGroup; + children = ( + F82F204BB039897365274B7C21538809 /* Pods-demo-store-ios-demo-store-iosUITests.modulemap */, + A349F70763EBA29B153A9EBC74ACA5E0 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown */, + 9C56376A1E36CAF7BE077F7B9A6C7C80 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist */, + 73948AC430BD554A737110C5CCBDF88A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */, + B89E1C307963068AD807FE658CCC41C0 /* Pods-demo-store-ios-demo-store-iosUITests-Info.plist */, + 000794A532A447E20C7175D1D5724A31 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */, + BDA32C7D30CD5025FFCA4FF5F2BC8124 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, + B00A45F6B27A0C155BD06F52EEB2B9A9 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, + ); + name = "Pods-demo-store-ios-demo-store-iosUITests"; + path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests"; + sourceTree = ""; + }; + 2B621E016A855BABD9C774B381226343 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 49F08750EEC82D5A8FD4755D12F0317B /* Pods-demo-store-ios */, + 1965A49D3B7987D00E298B33CB853E40 /* Pods-demo-store-ios-demo-store-iosUITests */, + 560704A2DF8BCC7024EEABB465EADD07 /* Pods-demo-store-iosTests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 49F08750EEC82D5A8FD4755D12F0317B /* Pods-demo-store-ios */ = { + isa = PBXGroup; + children = ( + D4883278E9C43B1A1B5122C838F2371F /* Pods-demo-store-ios.modulemap */, + CEF2605DB4960E5503E8622AD666F390 /* Pods-demo-store-ios-acknowledgements.markdown */, + 99F2681231E62574920A23BBA1BE7657 /* Pods-demo-store-ios-acknowledgements.plist */, + 5D87EF1D4E9B9A3D0F6FA34800AB6F48 /* Pods-demo-store-ios-dummy.m */, + 0D8535F146F9398315EBFC5555887E37 /* Pods-demo-store-ios-Info.plist */, + CF521C1E5BEF75F11F75D3EF1212D499 /* Pods-demo-store-ios-umbrella.h */, + 5DB4BE39384F4CAFB6BEED58E43B9E6D /* Pods-demo-store-ios.debug.xcconfig */, + 541C246A0AE79A1CC820CFF87F6B0BC6 /* Pods-demo-store-ios.release.xcconfig */, + ); + name = "Pods-demo-store-ios"; + path = "Target Support Files/Pods-demo-store-ios"; + sourceTree = ""; + }; + 560704A2DF8BCC7024EEABB465EADD07 /* Pods-demo-store-iosTests */ = { + isa = PBXGroup; + children = ( + 3FA3CB90DCB86363A419F3791B7B3A34 /* Pods-demo-store-iosTests.modulemap */, + DF8B984FD50CC786F6E8C7D8DA034152 /* Pods-demo-store-iosTests-acknowledgements.markdown */, + 9DD417BED260D762F9613D0934D1C06E /* Pods-demo-store-iosTests-acknowledgements.plist */, + 2820D7576E9D83DD79F820940F214CDF /* Pods-demo-store-iosTests-dummy.m */, + D0551A46E0902FC163468EEB71CF0D05 /* Pods-demo-store-iosTests-Info.plist */, + 77437148103FBD547B6ACA0E29028AF1 /* Pods-demo-store-iosTests-umbrella.h */, + FEB5355A1D321179D84CC5BD9162A74C /* Pods-demo-store-iosTests.debug.xcconfig */, + D8A669AAE1BD38692EB0DF177A4A4785 /* Pods-demo-store-iosTests.release.xcconfig */, + ); + name = "Pods-demo-store-iosTests"; + path = "Target Support Files/Pods-demo-store-iosTests"; + sourceTree = ""; + }; + 578452D2E740E91742655AC8F1636D1F /* iOS */ = { + isa = PBXGroup; + children = ( + 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 7C450847E734658F86406652EBF5E935 /* Products */ = { + isa = PBXGroup; + children = ( + A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */, + 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */, + 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */, + ); + name = Products; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, + 7C450847E734658F86406652EBF5E935 /* Products */, + 2B621E016A855BABD9C774B381226343 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 578452D2E740E91742655AC8F1636D1F /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 14BED80D38E09DA024CC9AE31245984E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 834C14FE5447464523181F2F002D63FE /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F3C3E54D5D02879771EA6AB4336B3B1B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BF78F329D56E1C5D0A0B83A5D9E03EED /* Pods-demo-store-ios-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F4235FCF762434986C285FB10D47FD47 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9E2500E6DDD2ADAF4D773649B7A360C9 /* Pods-demo-store-iosTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 70C4579D73168EDE5BAEF9D0A675D6F0 /* Pods-demo-store-iosTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DDA0AEAEF33653027530506736479FDE /* Build configuration list for PBXNativeTarget "Pods-demo-store-iosTests" */; + buildPhases = ( + F4235FCF762434986C285FB10D47FD47 /* Headers */, + A60E7D11219A77AC97624EE5EFAE16C4 /* Sources */, + DECADAED0D9B70A5AB59DADE37D3AE1E /* Frameworks */, + AFB0664CADD4AA9EA1B4A13C1500B4D2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + AC6BA83CFA2AA6EE41038A9DF6494CBA /* PBXTargetDependency */, + ); + name = "Pods-demo-store-iosTests"; + productName = Pods_demo_store_iosTests; + productReference = 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */; + productType = "com.apple.product-type.framework"; + }; + 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */ = { + isa = PBXNativeTarget; + buildConfigurationList = E1355212E33F5FCDE58798608E20E3A7 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */; + buildPhases = ( + F3C3E54D5D02879771EA6AB4336B3B1B /* Headers */, + E75BC81316702BB1428FD2F73D61A707 /* Sources */, + CA705C5F96DD6DF2E3692326AFB3DEC7 /* Frameworks */, + 303053C93DA6D632B8EC0D383C155C7D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-demo-store-ios"; + productName = Pods_demo_store_ios; + productReference = A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */; + productType = "com.apple.product-type.framework"; + }; + AC237AA952DF10555F917C17037E3C89 /* Pods-demo-store-ios-demo-store-iosUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7AE97CA311119F2870BF61DDB9DF8BE8 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */; + buildPhases = ( + 14BED80D38E09DA024CC9AE31245984E /* Headers */, + 995E9E2AD023E6745964B0CAA40E668C /* Sources */, + 04D60E451996ABB241E7F11AA534C260 /* Frameworks */, + AC7F612FDE5A0B8961529F2D412EEAF6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-demo-store-ios-demo-store-iosUITests"; + productName = Pods_demo_store_ios_demo_store_iosUITests; + productReference = 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + Base, + en, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = 7C450847E734658F86406652EBF5E935 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */, + AC237AA952DF10555F917C17037E3C89 /* Pods-demo-store-ios-demo-store-iosUITests */, + 70C4579D73168EDE5BAEF9D0A675D6F0 /* Pods-demo-store-iosTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 303053C93DA6D632B8EC0D383C155C7D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AC7F612FDE5A0B8961529F2D412EEAF6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AFB0664CADD4AA9EA1B4A13C1500B4D2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 995E9E2AD023E6745964B0CAA40E668C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7A60842F1082CDF4F04C7DE464416B35 /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A60E7D11219A77AC97624EE5EFAE16C4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2ED0D7AE2F2531563EBC0135C853AE8E /* Pods-demo-store-iosTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E75BC81316702BB1428FD2F73D61A707 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DFFF30C2EB16C41D21FC724DC7E4AB43 /* Pods-demo-store-ios-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + AC6BA83CFA2AA6EE41038A9DF6494CBA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-demo-store-ios"; + target = 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */; + targetProxy = 5F88B7735B116F009987088762EC7F2F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 223F613DD12A97C370C9A8BBBA680196 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FEB5355A1D321179D84CC5BD9162A74C /* Pods-demo-store-iosTests.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-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.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; + }; + 2B9E26EAE2CD392AD762421F663075A1 /* 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 = 12.0; + 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; + }; + 63FAF33E1C55B71A5F5A8B3CC8749F99 /* 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 = 12.0; + 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; + }; + 844C608F2983144588E8075F58AE5D4D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B00A45F6B27A0C155BD06F52EEB2B9A9 /* Pods-demo-store-ios-demo-store-iosUITests.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-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.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; + }; + 96C094A76C8F5B5519FFA3DE71AB253D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5DB4BE39384F4CAFB6BEED58E43B9E6D /* Pods-demo-store-ios.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-demo-store-ios/Pods-demo-store-ios-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.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; + }; + 984D4CDE2B6BC4261868FDB953629006 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BDA32C7D30CD5025FFCA4FF5F2BC8124 /* Pods-demo-store-ios-demo-store-iosUITests.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-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.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; + }; + E3BBBD39BDCD883B13DB24B728D42B1C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 541C246A0AE79A1CC820CFF87F6B0BC6 /* Pods-demo-store-ios.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-demo-store-ios/Pods-demo-store-ios-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.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; + }; + EA7EA17ED62FCF720DF60909BD5D8380 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D8A669AAE1BD38692EB0DF177A4A4785 /* Pods-demo-store-iosTests.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-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.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; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2B9E26EAE2CD392AD762421F663075A1 /* Debug */, + 63FAF33E1C55B71A5F5A8B3CC8749F99 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7AE97CA311119F2870BF61DDB9DF8BE8 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 984D4CDE2B6BC4261868FDB953629006 /* Debug */, + 844C608F2983144588E8075F58AE5D4D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DDA0AEAEF33653027530506736479FDE /* Build configuration list for PBXNativeTarget "Pods-demo-store-iosTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 223F613DD12A97C370C9A8BBBA680196 /* Debug */, + EA7EA17ED62FCF720DF60909BD5D8380 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E1355212E33F5FCDE58798608E20E3A7 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 96C094A76C8F5B5519FFA3DE71AB253D /* Debug */, + E3BBBD39BDCD883B13DB24B728D42B1C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist new file mode 100644 index 0000000..19cf209 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + 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/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-dummy.m b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-dummy.m new file mode 100644 index 0000000..aadd3c1 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_demo_store_ios_demo_store_iosUITests : NSObject +@end +@implementation PodsDummy_Pods_demo_store_ios_demo_store_iosUITests +@end diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-umbrella.h b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-umbrella.h new file mode 100644 index 0000000..18bdf07 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-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_demo_store_ios_demo_store_iosUITestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_demo_store_ios_demo_store_iosUITestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig new file mode 100644 index 0000000..26f2c77 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig @@ -0,0 +1,8 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap new file mode 100644 index 0000000..6e84872 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_demo_store_ios_demo_store_iosUITests { + umbrella header "Pods-demo-store-ios-demo-store-iosUITests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig new file mode 100644 index 0000000..26f2c77 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig @@ -0,0 +1,8 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist new file mode 100644 index 0000000..3173534 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + 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/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-dummy.m b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-dummy.m new file mode 100644 index 0000000..abc3da4 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_demo_store_ios : NSObject +@end +@implementation PodsDummy_Pods_demo_store_ios +@end diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-umbrella.h b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-umbrella.h new file mode 100644 index 0000000..2c10e87 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-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_demo_store_iosVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_demo_store_iosVersionString[]; + diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig new file mode 100644 index 0000000..26f2c77 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig @@ -0,0 +1,8 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap new file mode 100644 index 0000000..b5ea3c6 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap @@ -0,0 +1,6 @@ +framework module Pods_demo_store_ios { + umbrella header "Pods-demo-store-ios-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig new file mode 100644 index 0000000..26f2c77 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig @@ -0,0 +1,8 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist new file mode 100644 index 0000000..19cf209 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + 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/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-dummy.m b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-dummy.m new file mode 100644 index 0000000..92c8b0c --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_demo_store_iosTests : NSObject +@end +@implementation PodsDummy_Pods_demo_store_iosTests +@end diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-umbrella.h b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-umbrella.h new file mode 100644 index 0000000..62666d8 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-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_demo_store_iosTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_demo_store_iosTestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig new file mode 100644 index 0000000..26f2c77 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig @@ -0,0 +1,8 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap new file mode 100644 index 0000000..62b1b09 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_demo_store_iosTests { + umbrella header "Pods-demo-store-iosTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig new file mode 100644 index 0000000..26f2c77 --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig @@ -0,0 +1,8 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +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/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index ce1e99b..c0726a9 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; + 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* DemoStoreApp.swift */; }; 75B935592C3564360063E814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; @@ -41,6 +43,8 @@ 18B7CB949CB70787994FC425 /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7441D18EA106D3DD3F55F71E /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; + 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; + 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935562C3564360063E814 /* DemoStoreApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.swift; sourceTree = ""; }; 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -96,6 +100,38 @@ name = Frameworks; sourceTree = ""; }; + 7559449C2C357E1800C274C9 /* features */ = { + isa = PBXGroup; + children = ( + 755944A22C35858C00C274C9 /* main */, + 7559449D2C357E4300C274C9 /* splash */, + ); + path = features; + sourceTree = ""; + }; + 7559449D2C357E4300C274C9 /* splash */ = { + isa = PBXGroup; + children = ( + 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */, + 755944A02C35822700C274C9 /* LaunchScreen.swift */, + ); + path = splash; + sourceTree = ""; + }; + 755944A22C35858C00C274C9 /* main */ = { + isa = PBXGroup; + children = ( + ); + path = main; + sourceTree = ""; + }; + 755944A32C35883F00C274C9 /* utils */ = { + isa = PBXGroup; + children = ( + ); + path = utils; + sourceTree = ""; + }; 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( @@ -121,6 +157,8 @@ 75B935552C3564360063E814 /* demo-store-ios */ = { isa = PBXGroup; children = ( + 755944A32C35883F00C274C9 /* utils */, + 7559449C2C357E1800C274C9 /* features */, 75B935562C3564360063E814 /* DemoStoreApp.swift */, 75B935582C3564360063E814 /* ContentView.swift */, 75B9355A2C3564370063E814 /* Assets.xcassets */, @@ -369,8 +407,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, 75B935592C3564360063E814 /* ContentView.swift in Sources */, 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, + 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/demo-store-ios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demo-store-ios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/demo-store-ios.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/demo-store-ios/Assets.xcassets/Logo/Contents.json b/demo-store-ios/Assets.xcassets/Logo/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Logo/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json b/demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json new file mode 100644 index 0000000..ee55714 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Logo.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Logo 1.pdf", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Logo 2.pdf", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf b/demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..697a0f043f2838814beece2743813fdd2e5f43ae GIT binary patch literal 9719 zcma)C2RxPS`%h)0kh~g%LuMIg57~R~P3brejy;YUveK(;*-B+6Gb1F)CfO;nA|t#d zBN2YjK}&D%|9?K8=XhNAbzj$YU)T4(p67GEHfk6&t*3=-7hzLkX z1#fRjv;si^p%zF?jM|0hjK|thg9VXD2nI$Hg9X6|1Q-q@-E4n=8zdZoz@UH|6dDSH zAVB62YHGZ_`R-)kj^u!vG<(Mr0!$j-76NvDcMt!~JqnFRfdLOBuW%F;1_lX`{9`cN zfuP_JIBMHJ@IM;!2md6iyZ#~H{Ug2$e_B5BH~&Z!3JTs`J`4gyYzOkw@-YZtP!NSc zBcQN9xF;F?ZTX}n?FfHzkN(X)3JHNBN%51ik3k|Zzb+pPL4kpV2%^DAGz9$z|0Juw zEg$n;_>+GK;Ae07At(r%WPudG-tr@mPzapl|3AyWZS}VVK>ihf5K^l50uYSYRt6$~ z!NC~FZVI3<5)_e8BpgbL4uu9I;NU-`VB73(Ie`2t1|h$L5RJw_NqHtE0Zqy^>E;^< z&|nBqBS3OtbS}sUP-Ps)POt81yE7x{)bhO3W;q8eaFtwN%$Q*A0m{r9(s$uQ$AR$QsDFNvp zLLE;>JkYdBN|2psa1Q2p7e_1(?~Jv##8Zoa!D1j0IXN*>9`=mw&M>pUSz(=bHNjvw zVq14tx>pARSOau+?EOIpx~+qN|Cb%ujt=y{bm0FFUx*zYng6nb+|l{Zb)k0Rf&G^q z^p2fh)0kL|jVibJr+e@Bp`gCnUH->$vS${%eJ3H`B2pg*3W zBv5I)nh{Br7b4XkM#2+-C~2UIB+R;OKhULNplxXH3~p)!{VAW~cU z!yp_)>KK0*1cOMM`459A&~^v=!zco@-H!h-iUe)9%0G;vLECNY_fgvi1P> zNxO}dz3ol&UGy(G5RxHSSO68X$KhQ-KvM#8OS&My1qCh`aKV8K0bEGnLID>VbYZWd z@6PoJ=0qzO5ag%a2+29v6Q!gaJV@q$JWIYmRQBHN8sDC#iX}P|NE0D{p7;?yWNv6n^H;L01T(b1Zn*w{j=wrDzUeS(oGCeSbd({t(9r9r@xrQ4olL}s= zwn(gYe-r=3d+44@fhUujdRW%_uvSL_?qs>0A?@etzHg#HJeckJ`smW&_r zcf4^3d1hRX3D1E$W%kE0%TJAH6^t|3ysvn8*FjlkhSDoBwEDy6=jv@wxV+ZZ2AkB` zGLH28)43v?Id)Kphn9cJF&w|J=&!!`B!>DSGUdb`33Oe$~FPc)%nWXLxkpwK|})N3kKm_|0FM zomQWE>g)Oj%X^7TnIUQwAM_jsS_<12y}I)a?@A7t%=7wu#-2aEB|021%nxO-@%sB= zJeEeb{8}&FgPhOvX=y<8&Eak_)gvxq{FjwWK3#UHEf@0HfYE*(a}eKLT@boL$X7hV zk2lQfuROB;0RszEzbIz zsy%$>6}{Kn3?I`VA=gH%c(_x+SWwrO9NW5*2UE4;ZGM4AKA&xhG-dq9GX`vKzWB_7<#D)sE7idN$_c)klsc(24X>5UK$k>9R@zSH+x3!b;dV;(7*`;hHRE?(IA`8zjyCT>mHjm==DUmPoJcd_MfsBFp&z%DB$Ckh!T zIyrf%?z?5r@#Wcoh>pi4ruYNOZH2Zx-JEYQP_Zo3nebS=$RqnUekUz#T_2ZRjLsz9 z!X(ir)I>%393MRk+T^|?QAKX@42a=I-3{sWaQ}S9>c>YoW`r}=Vm(zlg@tjQiG}$5 zkJmhW1u|n(tSVSnuXkvla&Nf$*}~UMc}=aZQZ2bKy{WYWR&_nuZdgt10_CYo3zY#( zZJsGh4RI``vokbj)MDXr*kyyBnY89`1oxDyOp$)nK1|Afoe}P+ggTgT+fCTf*_SC? zb(p(i&08=m2oaJdfmSk*mt}Xqu4aMm49yM&w^Oz%mEmveQ8eYGfrY{{f&^&mXAf+} z;@)Bt(_7gdl{Z(s6264X7#GyI$`wy{*z>)yKNY>rzG?{tUfnlF;X0m*dihbQ5_q$} zPALS?SMGOX<2>L*$uwn`sa8$r@*;8GKdmHXoihPk7#A0N9bv<}a(f?RA{|14{zjHG zGgeb~TtJ+G4b3w?g@O0=`^hOP1?06b!aCfasI7lis36OV4BZwjv(L+ZN8HH*)~$66mAc2j>^&K*sLJy|o$eB4Uh%+jbyF#KhJ=pyl{wd6gJ zyb8m3jX)S>u1A}T!xi33rv;;vN8Vgx5V<$IAIe2nMMs9bDiLg>;z)BLa{ts#;cKz zZ$p-f(HL)y-f5pbDZ>LHzR*?w)6tgW`nR-k|gvpX50k%RIS-s$q)LiY3)bD>e) zypko*<~rU7!QD{|h#Y!>`j@e>eEEqfyfRDYd~CwNXilesJKR~%z@{5Wd!^#i(?NP| z+1Jx*FQ7_JP+ru}l(l?E?n2kjiF4UUF^*&Ek`C?mzkbMf$}s(h}X-e*Y< z-uN;~uuzlJbsVCtiG7d`{UBn!rhB@T1?~KY`o*vrZdml|X2>Ck1DaVQP*GsK`ERcb|K|6f8 zm9A)`&qFwdo6KSQTty#6Y(#zuQ~3SKLxHK$IZdtuxRKhi0A?nWvM!Im?IxtEoopt3(PSI4nd4NlI|V-OwkPO?ibp~+ZY1RRJ?3YIT*TO6;5 zZK%i{;STIdliJ9;-NW{-P=S(%7@rm*Yu|dWb?{=pD9@X+Hg(&DsY*Qt zPKn+JR+ndM558Skx;>Fy&U!Y;U&F&))Ve&v?N0u+sdN#YrAcGDp-p&j*F@EFv+?rS zTH7_&H5T#1_>Lhj1%>A`Jmo`P)3^RIhfL-k&2Z8Rop)W(h8fkaEW~D}_|uFw!ZvxXSHfv0bkDEbUCFmm`MAZL z&CH>jm)tcgbTTWJWp2Eg?a{pO($J0Ne?&eVKA9Tp&G#@+++9Oa(`4zegq~?eN(YFE za4=?=Ih+0!r*mTT=|sbV)K`*UVi=?Dl}Rclt-Hm#*edr^3g4g~q~+*Kk&dyy!NpNT z?6nT=p3Z)5Q!B>^CovyjUDL z7?eF9ZaCmqBo?}LHAaf5R5>s}a+o8X*3Y$L~F_GXn+4 zi0A0^gx_X)du=j?qLncwvmnWpJtRKkmdJe5enX!0tC{8P$HrK=di&IZS=Y!4vdDSP zs%b^q>w2Zn`^z#Y7a9ySIIw9A+GbOgX*SYnW$9!)^^qxuIgo$YSGKlQv=K^CExh1?7oFwQv>!#eF5$QU$SlYPrH?E*4;L85Z5&D3pkr4#OjRq!?*p@ z+Jlu}Q|J3+bgl?LF(8i$R!0d2s4<4}N%<}B-_pqGusV+T5q0M=Ds3({CXy!jzp>Eplp*hLg!UMM`FOR%> z^VP$3N}7S5*ptcE{bgC>q{m|6smzC^i3QShurrq{S*z%!$C>3;D7b5xr=l(lP10w+ z)Lk3E-OIQ(Y``;FeY1I5^<)k5eQtu+XVG&HUOhdF?TKT6589bDG@M(?&b(N3HEqCM zJ5wuu$ZvSUJI}!KGk1lxpf_8m6LApLtVzyXo)JtDP{KR?+Tq6K3lWkLw?Di*FNH5kovsfR`mv_);D^*IQEg789n`KEnO{~#v zDR0hZk&IV+z%ui)UQSy|Wq49fzm$}~RDi2xEcRh(>6adYYv8tq`|4oFsKcAV5 z2zM*59Y!Iye7)Sy>|cs2Ud*sLP!+PQQN_^d67MO2QmvkVnq6aUY;-Q`OjP<>JbI>Y zUCb)p()DTHiWr>YK#}yTePQaAmGDiw!v!@1%cOoyZ1_ zEKOHLJob9!{ZUTrJh{eNKb4u$qU!LWH#mjmLRQzJ2svV@r*xS}mbfKZLzPv3{iAKuJ)cHT*Gom5$X@t&BR=BSC z2k38%!W>24kE>a=(8h(XYD5@`wq`#yMBNayHFNBS1gcCX%}7)RIzm^9@2f=bGa5;- zuFovW^W|$SnS;xw+F;1*G0&J4C1J;2rcqPD^fYKf$)4Y6$@WO9duh&0Cb4#ShKzG+ zblFB)R6FX9hE4K(_jC${?VWdHOj*;ak5rZwHcD@dx~hCu47w_iL^~UY9;9@LNkbg% zjFVb!Lwz)>c`%FGykpcV-8yUU$jIbZBC?#VS`bR1VsN2j=23#7&TC(DlbpzRD*M}) zJPw)EuBCv7`i;=o){tx^^!d>P1hBD8i2^iov^(v*D*dMrvg{0-l^Jkiy@4h(Ep>>f zMbTWLK26zS(=t52q!)&-Hn%P`5W>P9a`^Ctl#r?X!uJV1DLw|FF^}&u>#wd{dVOfI zfyeSv8cj^l{7_lbiW+8q{Km1A+X*+3`5X>7`+k!ivd`w#j}`BpI*^V`yQA~mM{P0Z zzWs_hyPM%FI*WrbGG>a2^%F)A<;(OfkK{Ar>ptCYdR*v_rYtFr5oCEOcGac6R1n%* zr4ds{U+WR?9+1PKkBJk-2vmAYEm>#l z?MEFGPnNwsQfDjgqkf(Fs}l34rzvqNDjbPj%&j3S9Ew`t28lz5%WUQKe8FrdWbkUr ze#i8vWH_qyGXoT1O1vg>ddtD$Jw5k>2vY+N!Tiz>*p6A{Yw~xeYgsr&i)Ip%--sxud2g) z&LM$or1glWo-5jKpqr=C&s)C$|Dx@reDB@YrEboq@cVhxYaq;hzniyZY`b&cOj>~$ zZ)reBnw|Q))-ms!-M$Dwc?hjWfmq|Q=f-w!8%D;BoeI%ua49NDi*hWPgSh%7n-ivq z5{a_uwAO~}oQ@^^y={)u{E}h9N(Xd|l1##KdUyj9N6@O!1>?zwXCdL@;H)pw)D5}e z&IJvMkLV6??&CW5bqUX%U}F;71Fc$7I-u12Ac0e-|6}Qgr#je!8x?SZK6kDx-q2_` zlFM-91gDHS(>s-pgP&+1XJMmI7yYZWsTzl5+Xjj~&P7)W^Lqv+I=XX7X(u50J@ZRN z&p(7PnVeup+PaK?3xf&nbI!5;;T@as%ICY=pl ze&V`^Jd(-RX*9zMxQ^Z;p!sQg$c#i?bv~|gaGM8?aX-BN`Y6ANa?uK;HqRj9(f&p= zZC%UDv^Rac?-@ic{5AN1or=pl_2%>V0&P0i)Z_Nh6LIJB7K(gF&9Zx38)LAEvh+Nn z_btwf`&h>wH4h5M2>jimx)FZ6rT2Ixz$DykRD~bsXt8xB4A1vPeFar~jLcEUF^o;T zSQx4C?r-E1<-#%lMZ%Sv242eN&7Kk1T$c~~c1ZkPKLo;sG2@yHUH-8ROsbvjV(yhC z+~T6?^kEKPyHgvrQA#0T)5Y}Vf|w+aN1BPY^ua_%aQf^lDsi149DC)Hn zG1$zAi+gBXfm73d?<_BmE$_edfjRlIcy-mnzO}gGu8ea%R?9k-T?NcMoA){Axotb^ zdKG7r(m3guHaSLSskt3MU&l|-8H|=yW{_*};&M!%WOu&J{`qt|EN4P4jg(I8Hgr4S{*om|bq zqOvtEesK7BhTi2@kRva#?8~mgCrdoEVg&SS6w9BCG6)D92RPigeKaa!IY&m(%h@Aj_)x5HF-vuCRay-%6ga06=K3(8#S8K57z}A z-E2%@b-hoWW%Q+fn4S}@Py0FDCVODkTBS(G zeVh1Td81J^_w*3s9x9=i%W z6gOgy7a>h!RUrs#AC0B&7Lffyo1-`6~>YGvjnumc`$%4n=&Cch$JE#xQ?v>O(sF zsZsXYh!Jt$^@t+>k@dy31v<8^&9&q$u>2?TD5cC@<^)r$1E48gmFei~Y&>eF9n=@$#S7171*V+yzLRy9kAo1GzPXeUl=fn;M|=^bjA{F@c<Y4&)B_9NVOxc?30?qihXGCu03;aJnYfKP3>bx^=Hil7m-`fk6&t*3=-7hzLkX z1#fRjv;si^p%zF?jM|0hjK|thg9VXD2nI$Hg9X6|1Q-q@-E4n=8zdZoz@UH|6dDSH zAVB62YHGZ_`R-)kj^u!vG<(Mr0!$j-76NvDcMt!~JqnFRfdLOBuW%F;1_lX`{9`cN zfuP_JIBMHJ@IM;!2md6iyZ#~H{Ug2$e_B5BH~&Z!3JTs`J`4gyYzOkw@-YZtP!NSc zBcQN9xF;F?ZTX}n?FfHzkN(X)3JHNBN%51ik3k|Zzb+pPL4kpV2%^DAGz9$z|0Juw zEg$n;_>+GK;Ae07At(r%WPudG-tr@mPzapl|3AyWZS}VVK>ihf5K^l50uYSYRt6$~ z!NC~FZVI3<5)_e8BpgbL4uu9I;NU-`VB73(Ie`2t1|h$L5RJw_NqHtE0Zqy^>E;^< z&|nBqBS3OtbS}sUP-Ps)POt81yE7x{)bhO3W;q8eaFtwN%$Q*A0m{r9(s$uQ$AR$QsDFNvp zLLE;>JkYdBN|2psa1Q2p7e_1(?~Jv##8Zoa!D1j0IXN*>9`=mw&M>pUSz(=bHNjvw zVq14tx>pARSOau+?EOIpx~+qN|Cb%ujt=y{bm0FFUx*zYng6nb+|l{Zb)k0Rf&G^q z^p2fh)0kL|jVibJr+e@Bp`gCnUH->$vS${%eJ3H`B2pg*3W zBv5I)nh{Br7b4XkM#2+-C~2UIB+R;OKhULNplxXH3~p)!{VAW~cU z!yp_)>KK0*1cOMM`459A&~^v=!zco@-H!h-iUe)9%0G;vLECNY_fgvi1P> zNxO}dz3ol&UGy(G5RxHSSO68X$KhQ-KvM#8OS&My1qCh`aKV8K0bEGnLID>VbYZWd z@6PoJ=0qzO5ag%a2+29v6Q!gaJV@q$JWIYmRQBHN8sDC#iX}P|NE0D{p7;?yWNv6n^H;L01T(b1Zn*w{j=wrDzUeS(oGCeSbd({t(9r9r@xrQ4olL}s= zwn(gYe-r=3d+44@fhUujdRW%_uvSL_?qs>0A?@etzHg#HJeckJ`smW&_r zcf4^3d1hRX3D1E$W%kE0%TJAH6^t|3ysvn8*FjlkhSDoBwEDy6=jv@wxV+ZZ2AkB` zGLH28)43v?Id)Kphn9cJF&w|J=&!!`B!>DSGUdb`33Oe$~FPc)%nWXLxkpwK|})N3kKm_|0FM zomQWE>g)Oj%X^7TnIUQwAM_jsS_<12y}I)a?@A7t%=7wu#-2aEB|021%nxO-@%sB= zJeEeb{8}&FgPhOvX=y<8&Eak_)gvxq{FjwWK3#UHEf@0HfYE*(a}eKLT@boL$X7hV zk2lQfuROB;0RszEzbIz zsy%$>6}{Kn3?I`VA=gH%c(_x+SWwrO9NW5*2UE4;ZGM4AKA&xhG-dq9GX`vKzWB_7<#D)sE7idN$_c)klsc(24X>5UK$k>9R@zSH+x3!b;dV;(7*`;hHRE?(IA`8zjyCT>mHjm==DUmPoJcd_MfsBFp&z%DB$Ckh!T zIyrf%?z?5r@#Wcoh>pi4ruYNOZH2Zx-JEYQP_Zo3nebS=$RqnUekUz#T_2ZRjLsz9 z!X(ir)I>%393MRk+T^|?QAKX@42a=I-3{sWaQ}S9>c>YoW`r}=Vm(zlg@tjQiG}$5 zkJmhW1u|n(tSVSnuXkvla&Nf$*}~UMc}=aZQZ2bKy{WYWR&_nuZdgt10_CYo3zY#( zZJsGh4RI``vokbj)MDXr*kyyBnY89`1oxDyOp$)nK1|Afoe}P+ggTgT+fCTf*_SC? zb(p(i&08=m2oaJdfmSk*mt}Xqu4aMm49yM&w^Oz%mEmveQ8eYGfrY{{f&^&mXAf+} z;@)Bt(_7gdl{Z(s6264X7#GyI$`wy{*z>)yKNY>rzG?{tUfnlF;X0m*dihbQ5_q$} zPALS?SMGOX<2>L*$uwn`sa8$r@*;8GKdmHXoihPk7#A0N9bv<}a(f?RA{|14{zjHG zGgeb~TtJ+G4b3w?g@O0=`^hOP1?06b!aCfasI7lis36OV4BZwjv(L+ZN8HH*)~$66mAc2j>^&K*sLJy|o$eB4Uh%+jbyF#KhJ=pyl{wd6gJ zyb8m3jX)S>u1A}T!xi33rv;;vN8Vgx5V<$IAIe2nMMs9bDiLg>;z)BLa{ts#;cKz zZ$p-f(HL)y-f5pbDZ>LHzR*?w)6tgW`nR-k|gvpX50k%RIS-s$q)LiY3)bD>e) zypko*<~rU7!QD{|h#Y!>`j@e>eEEqfyfRDYd~CwNXilesJKR~%z@{5Wd!^#i(?NP| z+1Jx*FQ7_JP+ru}l(l?E?n2kjiF4UUF^*&Ek`C?mzkbMf$}s(h}X-e*Y< z-uN;~uuzlJbsVCtiG7d`{UBn!rhB@T1?~KY`o*vrZdml|X2>Ck1DaVQP*GsK`ERcb|K|6f8 zm9A)`&qFwdo6KSQTty#6Y(#zuQ~3SKLxHK$IZdtuxRKhi0A?nWvM!Im?IxtEoopt3(PSI4nd4NlI|V-OwkPO?ibp~+ZY1RRJ?3YIT*TO6;5 zZK%i{;STIdliJ9;-NW{-P=S(%7@rm*Yu|dWb?{=pD9@X+Hg(&DsY*Qt zPKn+JR+ndM558Skx;>Fy&U!Y;U&F&))Ve&v?N0u+sdN#YrAcGDp-p&j*F@EFv+?rS zTH7_&H5T#1_>Lhj1%>A`Jmo`P)3^RIhfL-k&2Z8Rop)W(h8fkaEW~D}_|uFw!ZvxXSHfv0bkDEbUCFmm`MAZL z&CH>jm)tcgbTTWJWp2Eg?a{pO($J0Ne?&eVKA9Tp&G#@+++9Oa(`4zegq~?eN(YFE za4=?=Ih+0!r*mTT=|sbV)K`*UVi=?Dl}Rclt-Hm#*edr^3g4g~q~+*Kk&dyy!NpNT z?6nT=p3Z)5Q!B>^CovyjUDL z7?eF9ZaCmqBo?}LHAaf5R5>s}a+o8X*3Y$L~F_GXn+4 zi0A0^gx_X)du=j?qLncwvmnWpJtRKkmdJe5enX!0tC{8P$HrK=di&IZS=Y!4vdDSP zs%b^q>w2Zn`^z#Y7a9ySIIw9A+GbOgX*SYnW$9!)^^qxuIgo$YSGKlQv=K^CExh1?7oFwQv>!#eF5$QU$SlYPrH?E*4;L85Z5&D3pkr4#OjRq!?*p@ z+Jlu}Q|J3+bgl?LF(8i$R!0d2s4<4}N%<}B-_pqGusV+T5q0M=Ds3({CXy!jzp>Eplp*hLg!UMM`FOR%> z^VP$3N}7S5*ptcE{bgC>q{m|6smzC^i3QShurrq{S*z%!$C>3;D7b5xr=l(lP10w+ z)Lk3E-OIQ(Y``;FeY1I5^<)k5eQtu+XVG&HUOhdF?TKT6589bDG@M(?&b(N3HEqCM zJ5wuu$ZvSUJI}!KGk1lxpf_8m6LApLtVzyXo)JtDP{KR?+Tq6K3lWkLw?Di*FNH5kovsfR`mv_);D^*IQEg789n`KEnO{~#v zDR0hZk&IV+z%ui)UQSy|Wq49fzm$}~RDi2xEcRh(>6adYYv8tq`|4oFsKcAV5 z2zM*59Y!Iye7)Sy>|cs2Ud*sLP!+PQQN_^d67MO2QmvkVnq6aUY;-Q`OjP<>JbI>Y zUCb)p()DTHiWr>YK#}yTePQaAmGDiw!v!@1%cOoyZ1_ zEKOHLJob9!{ZUTrJh{eNKb4u$qU!LWH#mjmLRQzJ2svV@r*xS}mbfKZLzPv3{iAKuJ)cHT*Gom5$X@t&BR=BSC z2k38%!W>24kE>a=(8h(XYD5@`wq`#yMBNayHFNBS1gcCX%}7)RIzm^9@2f=bGa5;- zuFovW^W|$SnS;xw+F;1*G0&J4C1J;2rcqPD^fYKf$)4Y6$@WO9duh&0Cb4#ShKzG+ zblFB)R6FX9hE4K(_jC${?VWdHOj*;ak5rZwHcD@dx~hCu47w_iL^~UY9;9@LNkbg% zjFVb!Lwz)>c`%FGykpcV-8yUU$jIbZBC?#VS`bR1VsN2j=23#7&TC(DlbpzRD*M}) zJPw)EuBCv7`i;=o){tx^^!d>P1hBD8i2^iov^(v*D*dMrvg{0-l^Jkiy@4h(Ep>>f zMbTWLK26zS(=t52q!)&-Hn%P`5W>P9a`^Ctl#r?X!uJV1DLw|FF^}&u>#wd{dVOfI zfyeSv8cj^l{7_lbiW+8q{Km1A+X*+3`5X>7`+k!ivd`w#j}`BpI*^V`yQA~mM{P0Z zzWs_hyPM%FI*WrbGG>a2^%F)A<;(OfkK{Ar>ptCYdR*v_rYtFr5oCEOcGac6R1n%* zr4ds{U+WR?9+1PKkBJk-2vmAYEm>#l z?MEFGPnNwsQfDjgqkf(Fs}l34rzvqNDjbPj%&j3S9Ew`t28lz5%WUQKe8FrdWbkUr ze#i8vWH_qyGXoT1O1vg>ddtD$Jw5k>2vY+N!Tiz>*p6A{Yw~xeYgsr&i)Ip%--sxud2g) z&LM$or1glWo-5jKpqr=C&s)C$|Dx@reDB@YrEboq@cVhxYaq;hzniyZY`b&cOj>~$ zZ)reBnw|Q))-ms!-M$Dwc?hjWfmq|Q=f-w!8%D;BoeI%ua49NDi*hWPgSh%7n-ivq z5{a_uwAO~}oQ@^^y={)u{E}h9N(Xd|l1##KdUyj9N6@O!1>?zwXCdL@;H)pw)D5}e z&IJvMkLV6??&CW5bqUX%U}F;71Fc$7I-u12Ac0e-|6}Qgr#je!8x?SZK6kDx-q2_` zlFM-91gDHS(>s-pgP&+1XJMmI7yYZWsTzl5+Xjj~&P7)W^Lqv+I=XX7X(u50J@ZRN z&p(7PnVeup+PaK?3xf&nbI!5;;T@as%ICY=pl ze&V`^Jd(-RX*9zMxQ^Z;p!sQg$c#i?bv~|gaGM8?aX-BN`Y6ANa?uK;HqRj9(f&p= zZC%UDv^Rac?-@ic{5AN1or=pl_2%>V0&P0i)Z_Nh6LIJB7K(gF&9Zx38)LAEvh+Nn z_btwf`&h>wH4h5M2>jimx)FZ6rT2Ixz$DykRD~bsXt8xB4A1vPeFar~jLcEUF^o;T zSQx4C?r-E1<-#%lMZ%Sv242eN&7Kk1T$c~~c1ZkPKLo;sG2@yHUH-8ROsbvjV(yhC z+~T6?^kEKPyHgvrQA#0T)5Y}Vf|w+aN1BPY^ua_%aQf^lDsi149DC)Hn zG1$zAi+gBXfm73d?<_BmE$_edfjRlIcy-mnzO}gGu8ea%R?9k-T?NcMoA){Axotb^ zdKG7r(m3guHaSLSskt3MU&l|-8H|=yW{_*};&M!%WOu&J{`qt|EN4P4jg(I8Hgr4S{*om|bq zqOvtEesK7BhTi2@kRva#?8~mgCrdoEVg&SS6w9BCG6)D92RPigeKaa!IY&m(%h@Aj_)x5HF-vuCRay-%6ga06=K3(8#S8K57z}A z-E2%@b-hoWW%Q+fn4S}@Py0FDCVODkTBS(G zeVh1Td81J^_w*3s9x9=i%W z6gOgy7a>h!RUrs#AC0B&7Lffyo1-`6~>YGvjnumc`$%4n=&Cch$JE#xQ?v>O(sF zsZsXYh!Jt$^@t+>k@dy31v<8^&9&q$u>2?TD5cC@<^)r$1E48gmFei~Y&>eF9n=@$#S7171*V+yzLRy9kAo1GzPXeUl=fn;M|=^bjA{F@c<Y4&)B_9NVOxc?30?qihXGCu03;aJnYfKP3>bx^=Hil7m-`fk6&t*3=-7hzLkX z1#fRjv;si^p%zF?jM|0hjK|thg9VXD2nI$Hg9X6|1Q-q@-E4n=8zdZoz@UH|6dDSH zAVB62YHGZ_`R-)kj^u!vG<(Mr0!$j-76NvDcMt!~JqnFRfdLOBuW%F;1_lX`{9`cN zfuP_JIBMHJ@IM;!2md6iyZ#~H{Ug2$e_B5BH~&Z!3JTs`J`4gyYzOkw@-YZtP!NSc zBcQN9xF;F?ZTX}n?FfHzkN(X)3JHNBN%51ik3k|Zzb+pPL4kpV2%^DAGz9$z|0Juw zEg$n;_>+GK;Ae07At(r%WPudG-tr@mPzapl|3AyWZS}VVK>ihf5K^l50uYSYRt6$~ z!NC~FZVI3<5)_e8BpgbL4uu9I;NU-`VB73(Ie`2t1|h$L5RJw_NqHtE0Zqy^>E;^< z&|nBqBS3OtbS}sUP-Ps)POt81yE7x{)bhO3W;q8eaFtwN%$Q*A0m{r9(s$uQ$AR$QsDFNvp zLLE;>JkYdBN|2psa1Q2p7e_1(?~Jv##8Zoa!D1j0IXN*>9`=mw&M>pUSz(=bHNjvw zVq14tx>pARSOau+?EOIpx~+qN|Cb%ujt=y{bm0FFUx*zYng6nb+|l{Zb)k0Rf&G^q z^p2fh)0kL|jVibJr+e@Bp`gCnUH->$vS${%eJ3H`B2pg*3W zBv5I)nh{Br7b4XkM#2+-C~2UIB+R;OKhULNplxXH3~p)!{VAW~cU z!yp_)>KK0*1cOMM`459A&~^v=!zco@-H!h-iUe)9%0G;vLECNY_fgvi1P> zNxO}dz3ol&UGy(G5RxHSSO68X$KhQ-KvM#8OS&My1qCh`aKV8K0bEGnLID>VbYZWd z@6PoJ=0qzO5ag%a2+29v6Q!gaJV@q$JWIYmRQBHN8sDC#iX}P|NE0D{p7;?yWNv6n^H;L01T(b1Zn*w{j=wrDzUeS(oGCeSbd({t(9r9r@xrQ4olL}s= zwn(gYe-r=3d+44@fhUujdRW%_uvSL_?qs>0A?@etzHg#HJeckJ`smW&_r zcf4^3d1hRX3D1E$W%kE0%TJAH6^t|3ysvn8*FjlkhSDoBwEDy6=jv@wxV+ZZ2AkB` zGLH28)43v?Id)Kphn9cJF&w|J=&!!`B!>DSGUdb`33Oe$~FPc)%nWXLxkpwK|})N3kKm_|0FM zomQWE>g)Oj%X^7TnIUQwAM_jsS_<12y}I)a?@A7t%=7wu#-2aEB|021%nxO-@%sB= zJeEeb{8}&FgPhOvX=y<8&Eak_)gvxq{FjwWK3#UHEf@0HfYE*(a}eKLT@boL$X7hV zk2lQfuROB;0RszEzbIz zsy%$>6}{Kn3?I`VA=gH%c(_x+SWwrO9NW5*2UE4;ZGM4AKA&xhG-dq9GX`vKzWB_7<#D)sE7idN$_c)klsc(24X>5UK$k>9R@zSH+x3!b;dV;(7*`;hHRE?(IA`8zjyCT>mHjm==DUmPoJcd_MfsBFp&z%DB$Ckh!T zIyrf%?z?5r@#Wcoh>pi4ruYNOZH2Zx-JEYQP_Zo3nebS=$RqnUekUz#T_2ZRjLsz9 z!X(ir)I>%393MRk+T^|?QAKX@42a=I-3{sWaQ}S9>c>YoW`r}=Vm(zlg@tjQiG}$5 zkJmhW1u|n(tSVSnuXkvla&Nf$*}~UMc}=aZQZ2bKy{WYWR&_nuZdgt10_CYo3zY#( zZJsGh4RI``vokbj)MDXr*kyyBnY89`1oxDyOp$)nK1|Afoe}P+ggTgT+fCTf*_SC? zb(p(i&08=m2oaJdfmSk*mt}Xqu4aMm49yM&w^Oz%mEmveQ8eYGfrY{{f&^&mXAf+} z;@)Bt(_7gdl{Z(s6264X7#GyI$`wy{*z>)yKNY>rzG?{tUfnlF;X0m*dihbQ5_q$} zPALS?SMGOX<2>L*$uwn`sa8$r@*;8GKdmHXoihPk7#A0N9bv<}a(f?RA{|14{zjHG zGgeb~TtJ+G4b3w?g@O0=`^hOP1?06b!aCfasI7lis36OV4BZwjv(L+ZN8HH*)~$66mAc2j>^&K*sLJy|o$eB4Uh%+jbyF#KhJ=pyl{wd6gJ zyb8m3jX)S>u1A}T!xi33rv;;vN8Vgx5V<$IAIe2nMMs9bDiLg>;z)BLa{ts#;cKz zZ$p-f(HL)y-f5pbDZ>LHzR*?w)6tgW`nR-k|gvpX50k%RIS-s$q)LiY3)bD>e) zypko*<~rU7!QD{|h#Y!>`j@e>eEEqfyfRDYd~CwNXilesJKR~%z@{5Wd!^#i(?NP| z+1Jx*FQ7_JP+ru}l(l?E?n2kjiF4UUF^*&Ek`C?mzkbMf$}s(h}X-e*Y< z-uN;~uuzlJbsVCtiG7d`{UBn!rhB@T1?~KY`o*vrZdml|X2>Ck1DaVQP*GsK`ERcb|K|6f8 zm9A)`&qFwdo6KSQTty#6Y(#zuQ~3SKLxHK$IZdtuxRKhi0A?nWvM!Im?IxtEoopt3(PSI4nd4NlI|V-OwkPO?ibp~+ZY1RRJ?3YIT*TO6;5 zZK%i{;STIdliJ9;-NW{-P=S(%7@rm*Yu|dWb?{=pD9@X+Hg(&DsY*Qt zPKn+JR+ndM558Skx;>Fy&U!Y;U&F&))Ve&v?N0u+sdN#YrAcGDp-p&j*F@EFv+?rS zTH7_&H5T#1_>Lhj1%>A`Jmo`P)3^RIhfL-k&2Z8Rop)W(h8fkaEW~D}_|uFw!ZvxXSHfv0bkDEbUCFmm`MAZL z&CH>jm)tcgbTTWJWp2Eg?a{pO($J0Ne?&eVKA9Tp&G#@+++9Oa(`4zegq~?eN(YFE za4=?=Ih+0!r*mTT=|sbV)K`*UVi=?Dl}Rclt-Hm#*edr^3g4g~q~+*Kk&dyy!NpNT z?6nT=p3Z)5Q!B>^CovyjUDL z7?eF9ZaCmqBo?}LHAaf5R5>s}a+o8X*3Y$L~F_GXn+4 zi0A0^gx_X)du=j?qLncwvmnWpJtRKkmdJe5enX!0tC{8P$HrK=di&IZS=Y!4vdDSP zs%b^q>w2Zn`^z#Y7a9ySIIw9A+GbOgX*SYnW$9!)^^qxuIgo$YSGKlQv=K^CExh1?7oFwQv>!#eF5$QU$SlYPrH?E*4;L85Z5&D3pkr4#OjRq!?*p@ z+Jlu}Q|J3+bgl?LF(8i$R!0d2s4<4}N%<}B-_pqGusV+T5q0M=Ds3({CXy!jzp>Eplp*hLg!UMM`FOR%> z^VP$3N}7S5*ptcE{bgC>q{m|6smzC^i3QShurrq{S*z%!$C>3;D7b5xr=l(lP10w+ z)Lk3E-OIQ(Y``;FeY1I5^<)k5eQtu+XVG&HUOhdF?TKT6589bDG@M(?&b(N3HEqCM zJ5wuu$ZvSUJI}!KGk1lxpf_8m6LApLtVzyXo)JtDP{KR?+Tq6K3lWkLw?Di*FNH5kovsfR`mv_);D^*IQEg789n`KEnO{~#v zDR0hZk&IV+z%ui)UQSy|Wq49fzm$}~RDi2xEcRh(>6adYYv8tq`|4oFsKcAV5 z2zM*59Y!Iye7)Sy>|cs2Ud*sLP!+PQQN_^d67MO2QmvkVnq6aUY;-Q`OjP<>JbI>Y zUCb)p()DTHiWr>YK#}yTePQaAmGDiw!v!@1%cOoyZ1_ zEKOHLJob9!{ZUTrJh{eNKb4u$qU!LWH#mjmLRQzJ2svV@r*xS}mbfKZLzPv3{iAKuJ)cHT*Gom5$X@t&BR=BSC z2k38%!W>24kE>a=(8h(XYD5@`wq`#yMBNayHFNBS1gcCX%}7)RIzm^9@2f=bGa5;- zuFovW^W|$SnS;xw+F;1*G0&J4C1J;2rcqPD^fYKf$)4Y6$@WO9duh&0Cb4#ShKzG+ zblFB)R6FX9hE4K(_jC${?VWdHOj*;ak5rZwHcD@dx~hCu47w_iL^~UY9;9@LNkbg% zjFVb!Lwz)>c`%FGykpcV-8yUU$jIbZBC?#VS`bR1VsN2j=23#7&TC(DlbpzRD*M}) zJPw)EuBCv7`i;=o){tx^^!d>P1hBD8i2^iov^(v*D*dMrvg{0-l^Jkiy@4h(Ep>>f zMbTWLK26zS(=t52q!)&-Hn%P`5W>P9a`^Ctl#r?X!uJV1DLw|FF^}&u>#wd{dVOfI zfyeSv8cj^l{7_lbiW+8q{Km1A+X*+3`5X>7`+k!ivd`w#j}`BpI*^V`yQA~mM{P0Z zzWs_hyPM%FI*WrbGG>a2^%F)A<;(OfkK{Ar>ptCYdR*v_rYtFr5oCEOcGac6R1n%* zr4ds{U+WR?9+1PKkBJk-2vmAYEm>#l z?MEFGPnNwsQfDjgqkf(Fs}l34rzvqNDjbPj%&j3S9Ew`t28lz5%WUQKe8FrdWbkUr ze#i8vWH_qyGXoT1O1vg>ddtD$Jw5k>2vY+N!Tiz>*p6A{Yw~xeYgsr&i)Ip%--sxud2g) z&LM$or1glWo-5jKpqr=C&s)C$|Dx@reDB@YrEboq@cVhxYaq;hzniyZY`b&cOj>~$ zZ)reBnw|Q))-ms!-M$Dwc?hjWfmq|Q=f-w!8%D;BoeI%ua49NDi*hWPgSh%7n-ivq z5{a_uwAO~}oQ@^^y={)u{E}h9N(Xd|l1##KdUyj9N6@O!1>?zwXCdL@;H)pw)D5}e z&IJvMkLV6??&CW5bqUX%U}F;71Fc$7I-u12Ac0e-|6}Qgr#je!8x?SZK6kDx-q2_` zlFM-91gDHS(>s-pgP&+1XJMmI7yYZWsTzl5+Xjj~&P7)W^Lqv+I=XX7X(u50J@ZRN z&p(7PnVeup+PaK?3xf&nbI!5;;T@as%ICY=pl ze&V`^Jd(-RX*9zMxQ^Z;p!sQg$c#i?bv~|gaGM8?aX-BN`Y6ANa?uK;HqRj9(f&p= zZC%UDv^Rac?-@ic{5AN1or=pl_2%>V0&P0i)Z_Nh6LIJB7K(gF&9Zx38)LAEvh+Nn z_btwf`&h>wH4h5M2>jimx)FZ6rT2Ixz$DykRD~bsXt8xB4A1vPeFar~jLcEUF^o;T zSQx4C?r-E1<-#%lMZ%Sv242eN&7Kk1T$c~~c1ZkPKLo;sG2@yHUH-8ROsbvjV(yhC z+~T6?^kEKPyHgvrQA#0T)5Y}Vf|w+aN1BPY^ua_%aQf^lDsi149DC)Hn zG1$zAi+gBXfm73d?<_BmE$_edfjRlIcy-mnzO}gGu8ea%R?9k-T?NcMoA){Axotb^ zdKG7r(m3guHaSLSskt3MU&l|-8H|=yW{_*};&M!%WOu&J{`qt|EN4P4jg(I8Hgr4S{*om|bq zqOvtEesK7BhTi2@kRva#?8~mgCrdoEVg&SS6w9BCG6)D92RPigeKaa!IY&m(%h@Aj_)x5HF-vuCRay-%6ga06=K3(8#S8K57z}A z-E2%@b-hoWW%Q+fn4S}@Py0FDCVODkTBS(G zeVh1Td81J^_w*3s9x9=i%W z6gOgy7a>h!RUrs#AC0B&7Lffyo1-`6~>YGvjnumc`$%4n=&Cch$JE#xQ?v>O(sF zsZsXYh!Jt$^@t+>k@dy31v<8^&9&q$u>2?TD5cC@<^)r$1E48gmFei~Y&>eF9n=@$#S7171*V+yzLRy9kAo1GzPXeUl=fn;M|=^bjA{F@c<Y4&)B_9NVOxc?30?qihXGCu03;aJnYfKP3>bx^=Hil7m-` UIViewController { + let viewController = UIViewController() + let splashScreenView = SplashScreenView() + + // Create UIHostingController with SplashScreenView + let hostingController = UIHostingController(rootView: splashScreenView) + + // Embedding the SwiftUI view in a UIViewController + viewController.addChild(hostingController) + viewController.view.addSubview(hostingController.view) + + // Set constraints to make SplashScreenView fill the entire screen + hostingController.view.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + hostingController.view.topAnchor.constraint(equalTo: viewController.view.topAnchor), + hostingController.view.bottomAnchor.constraint(equalTo: viewController.view.bottomAnchor), + hostingController.view.leadingAnchor.constraint(equalTo: viewController.view.leadingAnchor), + hostingController.view.trailingAnchor.constraint(equalTo: viewController.view.trailingAnchor) + ]) + hostingController.didMove(toParent: viewController) + + return viewController + } + + func updateUIViewController(_ uiViewController: UIViewController, context: Context) { + // No update needed here + } +} diff --git a/demo-store-ios/features/splash/SplashScreenView.swift b/demo-store-ios/features/splash/SplashScreenView.swift new file mode 100644 index 0000000..88f1370 --- /dev/null +++ b/demo-store-ios/features/splash/SplashScreenView.swift @@ -0,0 +1,26 @@ +import SwiftUI + +struct SplashScreenView: View { + var body: some View { + ZStack{ + Color.black + .ignoresSafeArea(.all) + + Image("SplashLogo") + .resizable() + .scaledToFit() + .frame(width:150, height: 150) + .foregroundColor(.white) + } + } +} + +struct SplashScreenView_Previews: PreviewProvider { + static var previews: some View { + SplashScreenView() + } +} + +#Preview { + SplashScreenView() +} diff --git a/demo-store-ios/utils/UiUtils.swift b/demo-store-ios/utils/UiUtils.swift new file mode 100644 index 0000000..61be874 --- /dev/null +++ b/demo-store-ios/utils/UiUtils.swift @@ -0,0 +1,50 @@ +import SwiftUI + +struct StatusBarStyleKey: PreferenceKey { + static var defaultValue: UIStatusBarStyle = .default + + static func reduce(value: inout UIStatusBarStyle, nextValue: () -> UIStatusBarStyle) { + value = nextValue() + } +} + +class HostingController: UIHostingController { + var statusBarStyle = UIStatusBarStyle.default + + //UIKit seems to observe changes on this, perhaps with KVO? + //In any case, I found changing `statusBarStyle` was sufficient + //and no other method calls were needed to force the status bar to update + override var preferredStatusBarStyle: UIStatusBarStyle { + statusBarStyle + } + + init(wrappedView: T) { +// This observer is necessary to break a dependency cycle - without it +// onPreferenceChange would need to use self but self can't be used until +// super.init is called, which can't be done until after onPreferenceChange is set up etc. + let observer = Observer() + + let observedView = AnyView(wrappedView.onPreferenceChange(StatusBarStyleKey.self) { style in + observer.value?.statusBarStyle = style + }) + + super.init(rootView: observedView) + observer.value = self + } + + private class Observer { + weak var value: HostingController? + init() {} + } + + @available(*, unavailable) required init?(coder aDecoder: NSCoder) { + // We aren't using storyboards, so this is unnecessary + fatalError("Unavailable") + } +} + +extension View { + func statusBar(style: UIStatusBarStyle) -> some View { + preference(key: StatusBarStyleKey.self, value: style) + } +} From d82ad957efe1881521ad1fba2213f3325edadbd4 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 3 Jul 2024 16:37:50 +0200 Subject: [PATCH 06/85] feat: Add supporting colors and themes --- demo-store-ios.xcodeproj/project.pbxproj | 4 ++-- demo-store-ios/ContentView.swift | 21 +++++++++++++------ .../features/splash/SplashScreenView.swift | 6 +----- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index c0726a9..f1897c3 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -499,7 +499,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -556,7 +556,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; diff --git a/demo-store-ios/ContentView.swift b/demo-store-ios/ContentView.swift index 4e03bdb..fb38f4b 100644 --- a/demo-store-ios/ContentView.swift +++ b/demo-store-ios/ContentView.swift @@ -1,18 +1,27 @@ - import SwiftUI struct ContentView: View { var body: some View { VStack { - Image(systemName: "globe") - .imageScale(.large) - .foregroundStyle(.tint) + if #available(iOS 15.0, *) { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + } else { + Image(systemName: "globe") + .imageScale(.large) + .foregroundColor(.blue) + } Text("Hello, world!") } .padding() } } -#Preview { - ContentView() +#if DEBUG +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } } +#endif diff --git a/demo-store-ios/features/splash/SplashScreenView.swift b/demo-store-ios/features/splash/SplashScreenView.swift index 88f1370..30fe397 100644 --- a/demo-store-ios/features/splash/SplashScreenView.swift +++ b/demo-store-ios/features/splash/SplashScreenView.swift @@ -4,7 +4,7 @@ struct SplashScreenView: View { var body: some View { ZStack{ Color.black - .ignoresSafeArea(.all) + .edgesIgnoringSafeArea(.all) Image("SplashLogo") .resizable() @@ -20,7 +20,3 @@ struct SplashScreenView_Previews: PreviewProvider { SplashScreenView() } } - -#Preview { - SplashScreenView() -} From 1ecabee65c8a1b02ddf8c0916d94d67a15b0e038 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 4 Jul 2024 14:58:39 +0200 Subject: [PATCH 07/85] feat: Add nav images & nav items with selecting --- demo-store-ios.xcodeproj/project.pbxproj | 42 ++++++++- .../Icons/CartTab.imageset/Contents.json | 23 +++++ .../Icons/CartTab.imageset/cart 1.pdf | Bin 0 -> 1223 bytes .../Icons/CartTab.imageset/cart 2.pdf | Bin 0 -> 1223 bytes .../Icons/CartTab.imageset/cart.pdf | Bin 0 -> 1223 bytes .../Icons/CatalogTab.imageset/Contents.json | 23 +++++ .../Icons/CatalogTab.imageset/folder 1.pdf | Bin 0 -> 1429 bytes .../Icons/CatalogTab.imageset/folder 2.pdf | Bin 0 -> 1429 bytes .../Icons/CatalogTab.imageset/folder.pdf | Bin 0 -> 1429 bytes .../Assets.xcassets/Icons/Contents.json | 6 ++ .../Icons/MainTab.imageset/Contents.json | 23 +++++ .../Icons/MainTab.imageset/home 1.pdf | Bin 0 -> 1074 bytes .../Icons/MainTab.imageset/home 2.pdf | Bin 0 -> 1074 bytes .../Icons/MainTab.imageset/home.pdf | Bin 0 -> 1074 bytes .../Icons/SettingsTab.imageset/Contents.json | 23 +++++ .../Icons/SettingsTab.imageset/cog 1.pdf | Bin 0 -> 3105 bytes .../Icons/SettingsTab.imageset/cog 2.pdf | Bin 0 -> 3105 bytes .../Icons/SettingsTab.imageset/cog.pdf | Bin 0 -> 3105 bytes demo-store-ios/ContentView.swift | 27 ------ .../features/cart/CartScreenView.swift | 15 ++++ .../features/catalog/CatalogScreenView.swift | 15 ++++ .../features/main/MainScreenView.swift | 15 ++++ .../settings/SettingsScreenView.swift | 15 ++++ .../features/splash/ContentView.swift | 83 ++++++++++++++++++ 24 files changed, 282 insertions(+), 28 deletions(-) create mode 100644 demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf delete mode 100644 demo-store-ios/ContentView.swift create mode 100644 demo-store-ios/features/cart/CartScreenView.swift create mode 100644 demo-store-ios/features/catalog/CatalogScreenView.swift create mode 100644 demo-store-ios/features/main/MainScreenView.swift create mode 100644 demo-store-ios/features/settings/SettingsScreenView.swift create mode 100644 demo-store-ios/features/splash/ContentView.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index f1897c3..79c06af 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -16,6 +16,10 @@ 75B935682C3564370063E814 /* DemoStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935672C3564370063E814 /* DemoStoreTests.swift */; }; 75B935722C3564370063E814 /* DemoStoreUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935712C3564370063E814 /* DemoStoreUITests.swift */; }; 75B935742C3564370063E814 /* DemoStoreUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */; }; + 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */; }; + 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */; }; + 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; + 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */; }; D78A79C526F8BC172C2E09DA /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; E595009B8CDAA1ED437EACF0 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */; }; FF4CD03BDB28EF3ACB920BA6 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */; }; @@ -55,6 +59,10 @@ 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "demo-store-iosUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935712C3564370063E814 /* DemoStoreUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreUITests.swift; sourceTree = ""; }; 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreUITestsLaunchTests.swift; sourceTree = ""; }; + 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainScreenView.swift; sourceTree = ""; }; + 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CatalogScreenView.swift; sourceTree = ""; }; + 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; + 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenView.swift; sourceTree = ""; }; 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; @@ -103,6 +111,9 @@ 7559449C2C357E1800C274C9 /* features */ = { isa = PBXGroup; children = ( + 75ECCD0E2C36BE1000D6D346 /* settings */, + 75ECCD0D2C36BE0600D6D346 /* cart */, + 75ECCD0C2C36BDFF00D6D346 /* catalog */, 755944A22C35858C00C274C9 /* main */, 7559449D2C357E4300C274C9 /* splash */, ); @@ -112,6 +123,7 @@ 7559449D2C357E4300C274C9 /* splash */ = { isa = PBXGroup; children = ( + 75B935582C3564360063E814 /* ContentView.swift */, 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */, 755944A02C35822700C274C9 /* LaunchScreen.swift */, ); @@ -121,6 +133,7 @@ 755944A22C35858C00C274C9 /* main */ = { isa = PBXGroup; children = ( + 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */, ); path = main; sourceTree = ""; @@ -160,7 +173,6 @@ 755944A32C35883F00C274C9 /* utils */, 7559449C2C357E1800C274C9 /* features */, 75B935562C3564360063E814 /* DemoStoreApp.swift */, - 75B935582C3564360063E814 /* ContentView.swift */, 75B9355A2C3564370063E814 /* Assets.xcassets */, 75B9355C2C3564370063E814 /* Preview Content */, ); @@ -192,6 +204,30 @@ path = "demo-store-iosUITests"; sourceTree = ""; }; + 75ECCD0C2C36BDFF00D6D346 /* catalog */ = { + isa = PBXGroup; + children = ( + 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */, + ); + path = catalog; + sourceTree = ""; + }; + 75ECCD0D2C36BE0600D6D346 /* cart */ = { + isa = PBXGroup; + children = ( + 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, + ); + path = cart; + sourceTree = ""; + }; + 75ECCD0E2C36BE1000D6D346 /* settings */ = { + isa = PBXGroup; + children = ( + 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */, + ); + path = settings; + sourceTree = ""; + }; 8FED5CC7CDC6607CEFB8FDC9 /* Pods */ = { isa = PBXGroup; children = ( @@ -407,10 +443,14 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, + 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */, + 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, 75B935592C3564360063E814 /* ContentView.swift in Sources */, 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, + 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/Contents.json b/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/Contents.json new file mode 100644 index 0000000..16ef31b --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "cart.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "cart 1.pdf", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "cart 2.pdf", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf b/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..247b8f70c14a1fed863bb2337fd61a9acb0abee6 GIT binary patch literal 1223 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f^qBQ(|I9=JZ;}AyVgvcb*xWT zJ=!6O*XB^5pvPse6+-9F&p$KMB1Y`(qR7g9AHQxt|Mz%%ynSE0{``B#`Qs1o{cknz z@OcN#^WvY+?ufqjt3T+VaA&Pl$fJ)EMM6jCD}Ty={IkL-sp64q+)uZjZ?{6tcJRFN zEIJuvekEwGz8nYZ!S0lm)6eAon0vD!fKztf+(oMvD^Ho?DY@*h_lA_M;%hlFdzVT? zc)Ki}Ht}Xwpc#)((jk_nTNM+Fw61Vmb8=7c2o2q2wTI=I%h@G46SxD!H9EOwc3*PH z@>!K}c8k9tFYU*}oyw3;=dbgHK z%xuxh!!BDA0)u>&ucxf_<$S7U8WFhgmRVU#m1%DCbjGbuF8*qASn56B^+WUpC4p@7 z5{tlVZ8ft*`r4G7OD=nzSl)S2N#uZT!OA36E|$xE-JiQ7Uze2pd4EUmq4hSMpu!Mm zcLST4h3hA{J6C-8Dmt$~hLeA3#KJ d2WM8L0$mR-RuYR!z}_)5Ffim&Rdw}u0|0|4t1AEi literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf b/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..247b8f70c14a1fed863bb2337fd61a9acb0abee6 GIT binary patch literal 1223 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f^qBQ(|I9=JZ;}AyVgvcb*xWT zJ=!6O*XB^5pvPse6+-9F&p$KMB1Y`(qR7g9AHQxt|Mz%%ynSE0{``B#`Qs1o{cknz z@OcN#^WvY+?ufqjt3T+VaA&Pl$fJ)EMM6jCD}Ty={IkL-sp64q+)uZjZ?{6tcJRFN zEIJuvekEwGz8nYZ!S0lm)6eAon0vD!fKztf+(oMvD^Ho?DY@*h_lA_M;%hlFdzVT? zc)Ki}Ht}Xwpc#)((jk_nTNM+Fw61Vmb8=7c2o2q2wTI=I%h@G46SxD!H9EOwc3*PH z@>!K}c8k9tFYU*}oyw3;=dbgHK z%xuxh!!BDA0)u>&ucxf_<$S7U8WFhgmRVU#m1%DCbjGbuF8*qASn56B^+WUpC4p@7 z5{tlVZ8ft*`r4G7OD=nzSl)S2N#uZT!OA36E|$xE-JiQ7Uze2pd4EUmq4hSMpu!Mm zcLST4h3hA{J6C-8Dmt$~hLeA3#KJ d2WM8L0$mR-RuYR!z}_)5Ffim&Rdw}u0|0|4t1AEi literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart.pdf b/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart.pdf new file mode 100644 index 0000000000000000000000000000000000000000..247b8f70c14a1fed863bb2337fd61a9acb0abee6 GIT binary patch literal 1223 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f^qBQ(|I9=JZ;}AyVgvcb*xWT zJ=!6O*XB^5pvPse6+-9F&p$KMB1Y`(qR7g9AHQxt|Mz%%ynSE0{``B#`Qs1o{cknz z@OcN#^WvY+?ufqjt3T+VaA&Pl$fJ)EMM6jCD}Ty={IkL-sp64q+)uZjZ?{6tcJRFN zEIJuvekEwGz8nYZ!S0lm)6eAon0vD!fKztf+(oMvD^Ho?DY@*h_lA_M;%hlFdzVT? zc)Ki}Ht}Xwpc#)((jk_nTNM+Fw61Vmb8=7c2o2q2wTI=I%h@G46SxD!H9EOwc3*PH z@>!K}c8k9tFYU*}oyw3;=dbgHK z%xuxh!!BDA0)u>&ucxf_<$S7U8WFhgmRVU#m1%DCbjGbuF8*qASn56B^+WUpC4p@7 z5{tlVZ8ft*`r4G7OD=nzSl)S2N#uZT!OA36E|$xE-JiQ7Uze2pd4EUmq4hSMpu!Mm zcLST4h3hA{J6C-8Dmt$~hLeA3#KJ d2WM8L0$mR-RuYR!z}_)5Ffim&Rdw}u0|0|4t1AEi literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json b/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json new file mode 100644 index 0000000..4022193 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "folder.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "folder 1.pdf", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "folder 2.pdf", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf b/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b8bb3d4b89b4eaa969f6e37b12679314afdc5d89 GIT binary patch literal 1429 zcmZuxO>fgc5WVlOm`kM=sq3Bnwp3N32}KAHA>~$aFv&IzN^G!QRQUDG`eW@B<`8Y( z&b)ausxwhqOSWy|nu zzX|KNH?X*y|JyX|Cqphe12G;h(<$9aZppj@JvwcUOmJ;tC`G?%&+)EpB2e^ha+t#UNH)JRlZ2`9CPm=_MU1i}OjJEv3LpF|w(^tmMUv8snx ztYn{AT%ln<#$}3o(=VCxd0H`@P+Gn0by-$z1NUEP70I$MzkdYCR>dw1z{jxN7dO>2 z+)u4e{Z(@O{HN2%v<^-6RBu89aoN`c-J&YnP*TRY=_9x*YQlhq*+H}SAVTS#$lmX_ zBo$%>YZ&t^swaxYfAlwm%$V#6Q!KDa38%srMOz%I-D&7^9Uhnf$NE)|zhI3~1_&Mu z>D7n^^iB+>NN2PO@{T^`Qz#eIof8O!dl`sG3qN|bb+JE$n#Jk8TT(mDo9Y-Y;C#Qm k=$n$QtEz=qaM$4MZvQ8c`tAWO>b5HfrEu)*?9Hd!zY#z&_5c6? literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf b/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b8bb3d4b89b4eaa969f6e37b12679314afdc5d89 GIT binary patch literal 1429 zcmZuxO>fgc5WVlOm`kM=sq3Bnwp3N32}KAHA>~$aFv&IzN^G!QRQUDG`eW@B<`8Y( z&b)ausxwhqOSWy|nu zzX|KNH?X*y|JyX|Cqphe12G;h(<$9aZppj@JvwcUOmJ;tC`G?%&+)EpB2e^ha+t#UNH)JRlZ2`9CPm=_MU1i}OjJEv3LpF|w(^tmMUv8snx ztYn{AT%ln<#$}3o(=VCxd0H`@P+Gn0by-$z1NUEP70I$MzkdYCR>dw1z{jxN7dO>2 z+)u4e{Z(@O{HN2%v<^-6RBu89aoN`c-J&YnP*TRY=_9x*YQlhq*+H}SAVTS#$lmX_ zBo$%>YZ&t^swaxYfAlwm%$V#6Q!KDa38%srMOz%I-D&7^9Uhnf$NE)|zhI3~1_&Mu z>D7n^^iB+>NN2PO@{T^`Qz#eIof8O!dl`sG3qN|bb+JE$n#Jk8TT(mDo9Y-Y;C#Qm k=$n$QtEz=qaM$4MZvQ8c`tAWO>b5HfrEu)*?9Hd!zY#z&_5c6? literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf b/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b8bb3d4b89b4eaa969f6e37b12679314afdc5d89 GIT binary patch literal 1429 zcmZuxO>fgc5WVlOm`kM=sq3Bnwp3N32}KAHA>~$aFv&IzN^G!QRQUDG`eW@B<`8Y( z&b)ausxwhqOSWy|nu zzX|KNH?X*y|JyX|Cqphe12G;h(<$9aZppj@JvwcUOmJ;tC`G?%&+)EpB2e^ha+t#UNH)JRlZ2`9CPm=_MU1i}OjJEv3LpF|w(^tmMUv8snx ztYn{AT%ln<#$}3o(=VCxd0H`@P+Gn0by-$z1NUEP70I$MzkdYCR>dw1z{jxN7dO>2 z+)u4e{Z(@O{HN2%v<^-6RBu89aoN`c-J&YnP*TRY=_9x*YQlhq*+H}SAVTS#$lmX_ zBo$%>YZ&t^swaxYfAlwm%$V#6Q!KDa38%srMOz%I-D&7^9Uhnf$NE)|zhI3~1_&Mu z>D7n^^iB+>NN2PO@{T^`Qz#eIof8O!dl`sG3qN|bb+JE$n#Jk8TT(mDo9Y-Y;C#Qm k=$n$QtEz=qaM$4MZvQ8c`tAWO>b5HfrEu)*?9Hd!zY#z&_5c6? literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/Contents.json b/demo-store-ios/Assets.xcassets/Icons/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/Contents.json b/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/Contents.json new file mode 100644 index 0000000..3789c62 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "home.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "home 1.pdf", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "home 2.pdf", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf b/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40a5acd201d9514701dbf253e9bd48993329b7c9 GIT binary patch literal 1074 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~g0Xbc*{m2tp4RVmTPe>^Muv(0DAr8qcYtZlAsKRU6foT|6f-cE-bC6943 zDGD<#xpq>)USR6M(vI_0+}BhE@=pj~JpW?r0m*f45gT`0^6aY*;LQ$ubTDA;gvGOU z+oGx$JWmXrP*CE1(BS;Lzjy95ZCnyHYnQQFN9?0DH+Fw^IesbebnoX~OX@ps-B!49 zPD3U3_<@^8Rj$8lvuEd-IlYDX&SSOaTyur#$26QbeAvJy#rJ(;qyOgPNf-8oNr{|$ z_4R<*(IY4By*IcuC*pcNHHiFV2OfVp^2q>mt z3Kc?1tso(ID%SVTOaVGo0px=q1(-d~`K3U;h8XTIhNN0pV3?tp1oB`p+(MAUARc#4 zEJ@7CPe;{SQIwj-WuRcr1@S(JR4_9&H8xcM3PXXRfdZJNkOvns2D%dj5JIL#K>wf# znV6#snHyo4Wp0TutE4C~Gbgo(3lw{vF2LZ>D9+DK)l|^POwoh{ihfXjeu)Ce!{7kc c56-Mg1-c%bg%gWPz}~SiHRe)Pb@g`x0M;gS%K!iX literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf b/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40a5acd201d9514701dbf253e9bd48993329b7c9 GIT binary patch literal 1074 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~g0Xbc*{m2tp4RVmTPe>^Muv(0DAr8qcYtZlAsKRU6foT|6f-cE-bC6943 zDGD<#xpq>)USR6M(vI_0+}BhE@=pj~JpW?r0m*f45gT`0^6aY*;LQ$ubTDA;gvGOU z+oGx$JWmXrP*CE1(BS;Lzjy95ZCnyHYnQQFN9?0DH+Fw^IesbebnoX~OX@ps-B!49 zPD3U3_<@^8Rj$8lvuEd-IlYDX&SSOaTyur#$26QbeAvJy#rJ(;qyOgPNf-8oNr{|$ z_4R<*(IY4By*IcuC*pcNHHiFV2OfVp^2q>mt z3Kc?1tso(ID%SVTOaVGo0px=q1(-d~`K3U;h8XTIhNN0pV3?tp1oB`p+(MAUARc#4 zEJ@7CPe;{SQIwj-WuRcr1@S(JR4_9&H8xcM3PXXRfdZJNkOvns2D%dj5JIL#K>wf# znV6#snHyo4Wp0TutE4C~Gbgo(3lw{vF2LZ>D9+DK)l|^POwoh{ihfXjeu)Ce!{7kc c56-Mg1-c%bg%gWPz}~SiHRe)Pb@g`x0M;gS%K!iX literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home.pdf b/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40a5acd201d9514701dbf253e9bd48993329b7c9 GIT binary patch literal 1074 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~g0Xbc*{m2tp4RVmTPe>^Muv(0DAr8qcYtZlAsKRU6foT|6f-cE-bC6943 zDGD<#xpq>)USR6M(vI_0+}BhE@=pj~JpW?r0m*f45gT`0^6aY*;LQ$ubTDA;gvGOU z+oGx$JWmXrP*CE1(BS;Lzjy95ZCnyHYnQQFN9?0DH+Fw^IesbebnoX~OX@ps-B!49 zPD3U3_<@^8Rj$8lvuEd-IlYDX&SSOaTyur#$26QbeAvJy#rJ(;qyOgPNf-8oNr{|$ z_4R<*(IY4By*IcuC*pcNHHiFV2OfVp^2q>mt z3Kc?1tso(ID%SVTOaVGo0px=q1(-d~`K3U;h8XTIhNN0pV3?tp1oB`p+(MAUARc#4 zEJ@7CPe;{SQIwj-WuRcr1@S(JR4_9&H8xcM3PXXRfdZJNkOvns2D%dj5JIL#K>wf# znV6#snHyo4Wp0TutE4C~Gbgo(3lw{vF2LZ>D9+DK)l|^POwoh{ihfXjeu)Ce!{7kc c56-Mg1-c%bg%gWPz}~SiHRe)Pb@g`x0M;gS%K!iX literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json b/demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json new file mode 100644 index 0000000..189bf5e --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "cog.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "cog 1.pdf", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "cog 2.pdf", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf b/demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1bf3233f0231c2ec996ae28c51ae09ebfb855391 GIT binary patch literal 3105 zcmZXWcRbbq7spHHl^y*k?v)hTu4`pp7a4_X+%odLblq;a*SI!GMIs~_Wh5CHksT#6 zvX!mtdnqIP;&P2E?$2#~*ZJe~c)wqd_ZhGA`R6Ha4l|HZkW~Qy6hQJIoYOS`2&AC_ z($WH;uvh3;fa2eEIRlIv9_0m+GjK!VQ81JHCl?|?WcCjm`)Bgh~3jMD3cL2(a;`mC*@)#f{9Ou4;U9S)QMx}Hbjt$4wQ?~Uq>%Z=O+ZGlc#@1~o&Op4{3q$u_elSuC{puUD zwiyu;G8NqYz`LAk0Mxz~GP=S%fB2joc{IL8R68Opz+mkBHC^j z+Bw)Mt)Jj{R;#RQdUx?yIhB7p<}GTCuo_;MzB}2feSLGav(<4AN1m2)#Wvldb=OJK zE>pLpch1PfS!GS^3gr|hF$iNQ4q^+Bd`Iiwkt?ajlyJQ^sZl>0=~#%}TURJ~yJ4?v^)2lgWEEcwt;?+K6vibVGVf}q6S?vbR`@hR3etY z*cNL-$!_k`2P&^Wq*8dgBuuIXz~vnrmj+zB9o7zxro4bjcn{4fne%vk040v{cA7Ng zm<}}L4;kBpd@h0vUa7xonP0$synIGsHK)hTLPx}XC#Ue@=o;h>Y-6rOwbmaN+x1CE@ZhMg!GL~#+X>Lj(VV0G#jdxxNaEQNoen{ts;Zi|`Altl zvjUK&0|MmP$?O#o3~}kJqI)j?C1TMmf^0gCoo6-QilR7;Kp3BYb_D7+J1||8-9EL{ zIOLETrB?*M38Fj(k3C99-5wTYM&2!VxL|#xv{M;^9S_4y2__X0j7$n8PCR~hHg>+5 z**3&xx|y3PgjH$n5E~2?W+rZEm(|vrnfG}K`uJ)0sNjGjO?M+G__HOc`#zM2v02wqzLiVrXx%i#wX%_;jkqE$@ys5vWJuGg z3s2!~D97}vZT%xh;%?!T+9MxG=}jAAMsA3D>gHZ2SPV)B%nvs_o|TTWVhbCPJrU{R zjJSW>S?O+kIk}?wc_Sh%Y1@n&E#RlH0Nsj!ZVf8zc<}E~J#n=OwXnf_1a>cl+Z5HMB?#nU6@x!iX{Z52)RGsursnheWN^8@U znu9(eSD-7}jR40()YT*0`8fj~tm~0T06(1-8u4i63s8g#1i%Evu&`5|xLR)aHndH3 z9m6H9tInj!Q11A>BN(@`V585*qaUy>&V}0;COyN5KjaH{?>IfLi#h>KS$xYMG|55^N@Fg{?1 zqR7Om3&Yp~3}}foQ=#gRhL6Gtim6?YTBTz^QGw? zbIylL5w2><=jH3){jX%5A*fh@_6k6o5h_VoWQ&1c1iCmS2}sFEUEVykgx-jgp~`CV z->Ql7;*y0T=I%P`5=kb)sO2mqSJ-qKks+_6=>^y1h3M)hky$2Et*NiFBjYc@x$@2) zb8(7v?5Y$z(0p;lV-fEnkn8~56O2#pQzuR=BKwt<)j~`wEt(1p-&ks|fKNHjcvyC@ z0~?i+`y)RME#HNNd2yFM3hc@7kpXgt+4#x!b9RLeItcW~xtQ_b#3Y#K6nyVaEY?IL z*`h>a(j*K}Rp&Sj?iDXL%-eh3DYzz%*uMCJ&@wf3em61YDU*SkAnlJ?HR40Es1Hyv zY|xtB!B!L2{D8B=lUb(IF!Yhl;wQOH9x?V@Mgeb*7;>>>M>*jex9lClpu4--X=G8Y zo)kQ?DT610nLK&MPklh8ufn?-KM5`S6^4V@d*Oo`}ON|?|cr9vwx*6ch{sF z)_z##@+q0*&o4oz*>zqCC&;CyGkWssS|^#RKSX!U=xnfG7@x^-PPGb_&{l~r@jt8)aXg&X{MXyw{>xGW@Q0fM* z6QUJuLx4`&wlFonZK?mQvG8VP9LNwYEW265GG^I{Fq5TiDc?-zO`*LEQu*lj^f0@L zh{f~QnW>T478i)49xMq3Bn@r^F#Kicll+_aMEZO^x|({cDzZMAYUM&EQk!OCHa(!P zHSJxz*AfWFY84(doQN19hI1Q7s}Z(@HT7ZO!UKvz@77J_%*vA6?o5)q~o`cA_TgOH+*ng+r8YWH`aiPV&7C94p{^;n}Cp7~Ij1*WtjPBlgnF zOL2!PhYUYjlKgwtQW7mO$0aXl;^REQ=r>zc_is2|Z_U8vm0F3e8>VrYsE-$8d16_D zYlqDy*4kUi48a8Z+ipE-(UZLv<0NLLRms(AcY>|Nm!Rr;LQ|-<@Os4;gl_!j(URrb zLt;j}Z&UT!Q=r3{Xf9nsr32W)yygtv|JG{LA6{iE?`Elh1#pIIPK$4JUM9HwG*Nj~ z*fTu0LZVFw2GhU8ZK>SXavf@2=d01qgi&hbUdvtNgvE2}@!Wc1f zku^T@QHgHQ`*%b7 zU_XrOA@N8z9QvQB{$3~-fILVA@WVd+3sQzaz!1>B{4*5fLEldx>~9IYKPNqYONtQ4 zeHCl?|?WcCjm`)Bgh~3jMD3cL2(a;`mC*@)#f{9Ou4;U9S)QMx}Hbjt$4wQ?~Uq>%Z=O+ZGlc#@1~o&Op4{3q$u_elSuC{puUD zwiyu;G8NqYz`LAk0Mxz~GP=S%fB2joc{IL8R68Opz+mkBHC^j z+Bw)Mt)Jj{R;#RQdUx?yIhB7p<}GTCuo_;MzB}2feSLGav(<4AN1m2)#Wvldb=OJK zE>pLpch1PfS!GS^3gr|hF$iNQ4q^+Bd`Iiwkt?ajlyJQ^sZl>0=~#%}TURJ~yJ4?v^)2lgWEEcwt;?+K6vibVGVf}q6S?vbR`@hR3etY z*cNL-$!_k`2P&^Wq*8dgBuuIXz~vnrmj+zB9o7zxro4bjcn{4fne%vk040v{cA7Ng zm<}}L4;kBpd@h0vUa7xonP0$synIGsHK)hTLPx}XC#Ue@=o;h>Y-6rOwbmaN+x1CE@ZhMg!GL~#+X>Lj(VV0G#jdxxNaEQNoen{ts;Zi|`Altl zvjUK&0|MmP$?O#o3~}kJqI)j?C1TMmf^0gCoo6-QilR7;Kp3BYb_D7+J1||8-9EL{ zIOLETrB?*M38Fj(k3C99-5wTYM&2!VxL|#xv{M;^9S_4y2__X0j7$n8PCR~hHg>+5 z**3&xx|y3PgjH$n5E~2?W+rZEm(|vrnfG}K`uJ)0sNjGjO?M+G__HOc`#zM2v02wqzLiVrXx%i#wX%_;jkqE$@ys5vWJuGg z3s2!~D97}vZT%xh;%?!T+9MxG=}jAAMsA3D>gHZ2SPV)B%nvs_o|TTWVhbCPJrU{R zjJSW>S?O+kIk}?wc_Sh%Y1@n&E#RlH0Nsj!ZVf8zc<}E~J#n=OwXnf_1a>cl+Z5HMB?#nU6@x!iX{Z52)RGsursnheWN^8@U znu9(eSD-7}jR40()YT*0`8fj~tm~0T06(1-8u4i63s8g#1i%Evu&`5|xLR)aHndH3 z9m6H9tInj!Q11A>BN(@`V585*qaUy>&V}0;COyN5KjaH{?>IfLi#h>KS$xYMG|55^N@Fg{?1 zqR7Om3&Yp~3}}foQ=#gRhL6Gtim6?YTBTz^QGw? zbIylL5w2><=jH3){jX%5A*fh@_6k6o5h_VoWQ&1c1iCmS2}sFEUEVykgx-jgp~`CV z->Ql7;*y0T=I%P`5=kb)sO2mqSJ-qKks+_6=>^y1h3M)hky$2Et*NiFBjYc@x$@2) zb8(7v?5Y$z(0p;lV-fEnkn8~56O2#pQzuR=BKwt<)j~`wEt(1p-&ks|fKNHjcvyC@ z0~?i+`y)RME#HNNd2yFM3hc@7kpXgt+4#x!b9RLeItcW~xtQ_b#3Y#K6nyVaEY?IL z*`h>a(j*K}Rp&Sj?iDXL%-eh3DYzz%*uMCJ&@wf3em61YDU*SkAnlJ?HR40Es1Hyv zY|xtB!B!L2{D8B=lUb(IF!Yhl;wQOH9x?V@Mgeb*7;>>>M>*jex9lClpu4--X=G8Y zo)kQ?DT610nLK&MPklh8ufn?-KM5`S6^4V@d*Oo`}ON|?|cr9vwx*6ch{sF z)_z##@+q0*&o4oz*>zqCC&;CyGkWssS|^#RKSX!U=xnfG7@x^-PPGb_&{l~r@jt8)aXg&X{MXyw{>xGW@Q0fM* z6QUJuLx4`&wlFonZK?mQvG8VP9LNwYEW265GG^I{Fq5TiDc?-zO`*LEQu*lj^f0@L zh{f~QnW>T478i)49xMq3Bn@r^F#Kicll+_aMEZO^x|({cDzZMAYUM&EQk!OCHa(!P zHSJxz*AfWFY84(doQN19hI1Q7s}Z(@HT7ZO!UKvz@77J_%*vA6?o5)q~o`cA_TgOH+*ng+r8YWH`aiPV&7C94p{^;n}Cp7~Ij1*WtjPBlgnF zOL2!PhYUYjlKgwtQW7mO$0aXl;^REQ=r>zc_is2|Z_U8vm0F3e8>VrYsE-$8d16_D zYlqDy*4kUi48a8Z+ipE-(UZLv<0NLLRms(AcY>|Nm!Rr;LQ|-<@Os4;gl_!j(URrb zLt;j}Z&UT!Q=r3{Xf9nsr32W)yygtv|JG{LA6{iE?`Elh1#pIIPK$4JUM9HwG*Nj~ z*fTu0LZVFw2GhU8ZK>SXavf@2=d01qgi&hbUdvtNgvE2}@!Wc1f zku^T@QHgHQ`*%b7 zU_XrOA@N8z9QvQB{$3~-fILVA@WVd+3sQzaz!1>B{4*5fLEldx>~9IYKPNqYONtQ4 zeHCl?|?WcCjm`)Bgh~3jMD3cL2(a;`mC*@)#f{9Ou4;U9S)QMx}Hbjt$4wQ?~Uq>%Z=O+ZGlc#@1~o&Op4{3q$u_elSuC{puUD zwiyu;G8NqYz`LAk0Mxz~GP=S%fB2joc{IL8R68Opz+mkBHC^j z+Bw)Mt)Jj{R;#RQdUx?yIhB7p<}GTCuo_;MzB}2feSLGav(<4AN1m2)#Wvldb=OJK zE>pLpch1PfS!GS^3gr|hF$iNQ4q^+Bd`Iiwkt?ajlyJQ^sZl>0=~#%}TURJ~yJ4?v^)2lgWEEcwt;?+K6vibVGVf}q6S?vbR`@hR3etY z*cNL-$!_k`2P&^Wq*8dgBuuIXz~vnrmj+zB9o7zxro4bjcn{4fne%vk040v{cA7Ng zm<}}L4;kBpd@h0vUa7xonP0$synIGsHK)hTLPx}XC#Ue@=o;h>Y-6rOwbmaN+x1CE@ZhMg!GL~#+X>Lj(VV0G#jdxxNaEQNoen{ts;Zi|`Altl zvjUK&0|MmP$?O#o3~}kJqI)j?C1TMmf^0gCoo6-QilR7;Kp3BYb_D7+J1||8-9EL{ zIOLETrB?*M38Fj(k3C99-5wTYM&2!VxL|#xv{M;^9S_4y2__X0j7$n8PCR~hHg>+5 z**3&xx|y3PgjH$n5E~2?W+rZEm(|vrnfG}K`uJ)0sNjGjO?M+G__HOc`#zM2v02wqzLiVrXx%i#wX%_;jkqE$@ys5vWJuGg z3s2!~D97}vZT%xh;%?!T+9MxG=}jAAMsA3D>gHZ2SPV)B%nvs_o|TTWVhbCPJrU{R zjJSW>S?O+kIk}?wc_Sh%Y1@n&E#RlH0Nsj!ZVf8zc<}E~J#n=OwXnf_1a>cl+Z5HMB?#nU6@x!iX{Z52)RGsursnheWN^8@U znu9(eSD-7}jR40()YT*0`8fj~tm~0T06(1-8u4i63s8g#1i%Evu&`5|xLR)aHndH3 z9m6H9tInj!Q11A>BN(@`V585*qaUy>&V}0;COyN5KjaH{?>IfLi#h>KS$xYMG|55^N@Fg{?1 zqR7Om3&Yp~3}}foQ=#gRhL6Gtim6?YTBTz^QGw? zbIylL5w2><=jH3){jX%5A*fh@_6k6o5h_VoWQ&1c1iCmS2}sFEUEVykgx-jgp~`CV z->Ql7;*y0T=I%P`5=kb)sO2mqSJ-qKks+_6=>^y1h3M)hky$2Et*NiFBjYc@x$@2) zb8(7v?5Y$z(0p;lV-fEnkn8~56O2#pQzuR=BKwt<)j~`wEt(1p-&ks|fKNHjcvyC@ z0~?i+`y)RME#HNNd2yFM3hc@7kpXgt+4#x!b9RLeItcW~xtQ_b#3Y#K6nyVaEY?IL z*`h>a(j*K}Rp&Sj?iDXL%-eh3DYzz%*uMCJ&@wf3em61YDU*SkAnlJ?HR40Es1Hyv zY|xtB!B!L2{D8B=lUb(IF!Yhl;wQOH9x?V@Mgeb*7;>>>M>*jex9lClpu4--X=G8Y zo)kQ?DT610nLK&MPklh8ufn?-KM5`S6^4V@d*Oo`}ON|?|cr9vwx*6ch{sF z)_z##@+q0*&o4oz*>zqCC&;CyGkWssS|^#RKSX!U=xnfG7@x^-PPGb_&{l~r@jt8)aXg&X{MXyw{>xGW@Q0fM* z6QUJuLx4`&wlFonZK?mQvG8VP9LNwYEW265GG^I{Fq5TiDc?-zO`*LEQu*lj^f0@L zh{f~QnW>T478i)49xMq3Bn@r^F#Kicll+_aMEZO^x|({cDzZMAYUM&EQk!OCHa(!P zHSJxz*AfWFY84(doQN19hI1Q7s}Z(@HT7ZO!UKvz@77J_%*vA6?o5)q~o`cA_TgOH+*ng+r8YWH`aiPV&7C94p{^;n}Cp7~Ij1*WtjPBlgnF zOL2!PhYUYjlKgwtQW7mO$0aXl;^REQ=r>zc_is2|Z_U8vm0F3e8>VrYsE-$8d16_D zYlqDy*4kUi48a8Z+ipE-(UZLv<0NLLRms(AcY>|Nm!Rr;LQ|-<@Os4;gl_!j(URrb zLt;j}Z&UT!Q=r3{Xf9nsr32W)yygtv|JG{LA6{iE?`Elh1#pIIPK$4JUM9HwG*Nj~ z*fTu0LZVFw2GhU8ZK>SXavf@2=d01qgi&hbUdvtNgvE2}@!Wc1f zku^T@QHgHQ`*%b7 zU_XrOA@N8z9QvQB{$3~-fILVA@WVd+3sQzaz!1>B{4*5fLEldx>~9IYKPNqYONtQ4 ze Date: Thu, 4 Jul 2024 15:17:58 +0200 Subject: [PATCH 08/85] feat: Add string resources --- demo-store-ios.xcodeproj/project.pbxproj | 12 ++++++ .../features/cart/CartScreenView.swift | 4 +- .../features/catalog/CatalogScreenView.swift | 3 +- .../features/main/MainScreenView.swift | 4 +- .../settings/SettingsScreenView.swift | 4 +- resources/Localizable.xcstrings | 39 +++++++++++++++++++ 6 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 resources/Localizable.xcstrings diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 79c06af..bae3c83 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */; }; + 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */; }; D78A79C526F8BC172C2E09DA /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; E595009B8CDAA1ED437EACF0 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */; }; FF4CD03BDB28EF3ACB920BA6 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */; }; @@ -63,6 +64,7 @@ 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CatalogScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenView.swift; sourceTree = ""; }; + 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; @@ -148,6 +150,7 @@ 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( + 75ECCD152C36D6B400D6D346 /* resources */, 75B935552C3564360063E814 /* demo-store-ios */, 75B935662C3564370063E814 /* demo-store-iosTests */, 75B935702C3564370063E814 /* demo-store-iosUITests */, @@ -228,6 +231,14 @@ path = settings; sourceTree = ""; }; + 75ECCD152C36D6B400D6D346 /* resources */ = { + isa = PBXGroup; + children = ( + 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */, + ); + path = resources; + sourceTree = ""; + }; 8FED5CC7CDC6607CEFB8FDC9 /* Pods */ = { isa = PBXGroup; children = ( @@ -350,6 +361,7 @@ files = ( 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */, 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */, + 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/demo-store-ios/features/cart/CartScreenView.swift b/demo-store-ios/features/cart/CartScreenView.swift index e149f8f..cc34e0b 100644 --- a/demo-store-ios/features/cart/CartScreenView.swift +++ b/demo-store-ios/features/cart/CartScreenView.swift @@ -5,10 +5,10 @@ struct CartScreenView: View { var body: some View { NavigationView { VStack { - Text("Cart Screen") + Text("cart_tab_title") .foregroundColor(.white) } - .navigationTitle("Favourites") + .navigationTitle("cart_tab_title") .background(Color.black.edgesIgnoringSafeArea(.all)) } } diff --git a/demo-store-ios/features/catalog/CatalogScreenView.swift b/demo-store-ios/features/catalog/CatalogScreenView.swift index 7984c23..9fd92d7 100644 --- a/demo-store-ios/features/catalog/CatalogScreenView.swift +++ b/demo-store-ios/features/catalog/CatalogScreenView.swift @@ -5,8 +5,7 @@ struct CatalogScreenView: View { var body: some View { NavigationView { VStack { - Text("Cat Screen") - .foregroundColor(.white) + } .navigationTitle("Favourites") .background(Color.black.edgesIgnoringSafeArea(.all)) diff --git a/demo-store-ios/features/main/MainScreenView.swift b/demo-store-ios/features/main/MainScreenView.swift index 158cce0..f0b1bec 100644 --- a/demo-store-ios/features/main/MainScreenView.swift +++ b/demo-store-ios/features/main/MainScreenView.swift @@ -5,10 +5,10 @@ struct MainScreenView: View { var body: some View { NavigationView { VStack { - Text("Favourites Screen") + Text("main_tab_title") .foregroundColor(.white) } - .navigationTitle("Favourites") + .navigationTitle("main_tab_title") .background(Color.black.edgesIgnoringSafeArea(.all)) } } diff --git a/demo-store-ios/features/settings/SettingsScreenView.swift b/demo-store-ios/features/settings/SettingsScreenView.swift index 637332a..3940c0d 100644 --- a/demo-store-ios/features/settings/SettingsScreenView.swift +++ b/demo-store-ios/features/settings/SettingsScreenView.swift @@ -5,10 +5,10 @@ struct SettingsScreenView: View { var body: some View { NavigationView { VStack { - Text("Set Screen") + Text("settings_tab_title") .foregroundColor(.white) } - .navigationTitle("Favourites") + .navigationTitle("settings_tab_title") .background(Color.black.edgesIgnoringSafeArea(.all)) } } diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings new file mode 100644 index 0000000..3cfc73e --- /dev/null +++ b/resources/Localizable.xcstrings @@ -0,0 +1,39 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "cart_tab_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shopping cart" + } + } + } + }, + "main_tab_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Discover" + } + } + } + }, + "settings_tab_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Store settings" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file From 8a66118629d25ed98e6a9ffe9b38d9ec7f2b7213 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 4 Jul 2024 17:29:20 +0200 Subject: [PATCH 09/85] feat: Add toolbar view and icons --- .../Icons/CartIcon.imageset/Contents.json | 23 ++++++ .../Icons/CartIcon.imageset/Frame 26.pdf | Bin 0 -> 1203 bytes .../Icons/CartIcon.imageset/Frame 27.pdf | Bin 0 -> 1203 bytes .../Icons/CartIcon.imageset/Frame 28.pdf | Bin 0 -> 1203 bytes .../Icons/MenuIcon.imageset/Contents.json | 23 ++++++ .../Icons/MenuIcon.imageset/hamburger 1.pdf | Bin 0 -> 954 bytes .../Icons/MenuIcon.imageset/hamburger 2.pdf | Bin 0 -> 954 bytes .../Icons/MenuIcon.imageset/hamburger.pdf | Bin 0 -> 954 bytes .../Icons/SearchIcon.imageset/Contents.json | 23 ++++++ .../Icons/SearchIcon.imageset/Frame 25.pdf | Bin 0 -> 1505 bytes .../Icons/SearchIcon.imageset/Frame 26.pdf | Bin 0 -> 1505 bytes .../Icons/SearchIcon.imageset/Frame 27.pdf | Bin 0 -> 1505 bytes .../Logo/ToolbarLogo.imageset/Contents.json | 23 ++++++ .../Logo/ToolbarLogo.imageset/Logo 1.pdf | Bin 0 -> 9658 bytes .../Logo/ToolbarLogo.imageset/Logo 2.pdf | Bin 0 -> 9658 bytes .../Logo/ToolbarLogo.imageset/Logo.pdf | Bin 0 -> 9658 bytes .../features/splash/ContentView.swift | 72 ++++++++++++++---- 17 files changed, 150 insertions(+), 14 deletions(-) create mode 100644 demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf create mode 100644 demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf create mode 100644 demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json create mode 100644 demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf create mode 100644 demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf create mode 100644 demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Contents.json b/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Contents.json new file mode 100644 index 0000000..58aa3ef --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame 26.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame 27.pdf", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame 28.pdf", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf b/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf new file mode 100644 index 0000000000000000000000000000000000000000..caa98b93c690d36402b967ccf3e138b4ee260907 GIT binary patch literal 1203 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f^qBQvw5P1Jgwg=yCRiMdxifW ziFQchwK=qcV@b94LN6P8^lTA7Td9JZF1~1Rl8EkxZqD;eVd)Pz)BcG)*7mvPt zaX)8vy7Rq@s}roNTJ>`prysewd+`@mrkUD5Js!QAo2yWIEFj;bVotwt^{aGX0Bi>SE!xlfOLIYaR>tZ}U9*BjXB( z^oHlxtj-xMKEAYawZ*4DKPJq(eEol&uW8<6`#sApR61;BVt@CQFFUWoru5Ft!-fXd z(|=2D-XME6phsReKEtB>(IKUu9mmAkPMIqnJ9k*J>tosUI|sjQ36U(Z_48O)aI$aP z{`%|6_b(}w*h+1F@KU!oIx*wnKD~;0#*5gFDCNYwxW0nb>4E91b>}Zje~4&*#pL{2 zpn;jWZ%>2!m4IHZ^eas1zyC9B{bc0{N@36>0!wS4!~;o#rp9LQ6lek$1*S}W$Gp7! zl46DESZKNnsVqoU&<{vVhb2Vc)RfFbr~C?qXaxg3128}^jE!JI2o}twpw#00(xT+l zVg*oM03~8jx^~XbD@n}*+6c-BFu{PtBA}RpDO3n4yMTn?*+}0zGX>~W1&|Md6kzr^ z=a&NY8e+J=7?N#ZfnkPX63Bzaa0@{WgLvFIu_Q4kKOI$TMNw)Rmw|#g7sUG@Qo+pB z)Yw!3C=3OL1`1%7LLOYm80bzAKnR(cVhWi99fqpP!o(6?$kGTHmrzwDMTwa?sYP6% z*zqTC_24ojv8V*>9ZL%%E>%@m Ge>VV~$*FMw literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf b/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf new file mode 100644 index 0000000000000000000000000000000000000000..caa98b93c690d36402b967ccf3e138b4ee260907 GIT binary patch literal 1203 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f^qBQvw5P1Jgwg=yCRiMdxifW ziFQchwK=qcV@b94LN6P8^lTA7Td9JZF1~1Rl8EkxZqD;eVd)Pz)BcG)*7mvPt zaX)8vy7Rq@s}roNTJ>`prysewd+`@mrkUD5Js!QAo2yWIEFj;bVotwt^{aGX0Bi>SE!xlfOLIYaR>tZ}U9*BjXB( z^oHlxtj-xMKEAYawZ*4DKPJq(eEol&uW8<6`#sApR61;BVt@CQFFUWoru5Ft!-fXd z(|=2D-XME6phsReKEtB>(IKUu9mmAkPMIqnJ9k*J>tosUI|sjQ36U(Z_48O)aI$aP z{`%|6_b(}w*h+1F@KU!oIx*wnKD~;0#*5gFDCNYwxW0nb>4E91b>}Zje~4&*#pL{2 zpn;jWZ%>2!m4IHZ^eas1zyC9B{bc0{N@36>0!wS4!~;o#rp9LQ6lek$1*S}W$Gp7! zl46DESZKNnsVqoU&<{vVhb2Vc)RfFbr~C?qXaxg3128}^jE!JI2o}twpw#00(xT+l zVg*oM03~8jx^~XbD@n}*+6c-BFu{PtBA}RpDO3n4yMTn?*+}0zGX>~W1&|Md6kzr^ z=a&NY8e+J=7?N#ZfnkPX63Bzaa0@{WgLvFIu_Q4kKOI$TMNw)Rmw|#g7sUG@Qo+pB z)Yw!3C=3OL1`1%7LLOYm80bzAKnR(cVhWi99fqpP!o(6?$kGTHmrzwDMTwa?sYP6% z*zqTC_24ojv8V*>9ZL%%E>%@m Ge>VV~$*FMw literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf b/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf new file mode 100644 index 0000000000000000000000000000000000000000..caa98b93c690d36402b967ccf3e138b4ee260907 GIT binary patch literal 1203 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f^qBQvw5P1Jgwg=yCRiMdxifW ziFQchwK=qcV@b94LN6P8^lTA7Td9JZF1~1Rl8EkxZqD;eVd)Pz)BcG)*7mvPt zaX)8vy7Rq@s}roNTJ>`prysewd+`@mrkUD5Js!QAo2yWIEFj;bVotwt^{aGX0Bi>SE!xlfOLIYaR>tZ}U9*BjXB( z^oHlxtj-xMKEAYawZ*4DKPJq(eEol&uW8<6`#sApR61;BVt@CQFFUWoru5Ft!-fXd z(|=2D-XME6phsReKEtB>(IKUu9mmAkPMIqnJ9k*J>tosUI|sjQ36U(Z_48O)aI$aP z{`%|6_b(}w*h+1F@KU!oIx*wnKD~;0#*5gFDCNYwxW0nb>4E91b>}Zje~4&*#pL{2 zpn;jWZ%>2!m4IHZ^eas1zyC9B{bc0{N@36>0!wS4!~;o#rp9LQ6lek$1*S}W$Gp7! zl46DESZKNnsVqoU&<{vVhb2Vc)RfFbr~C?qXaxg3128}^jE!JI2o}twpw#00(xT+l zVg*oM03~8jx^~XbD@n}*+6c-BFu{PtBA}RpDO3n4yMTn?*+}0zGX>~W1&|Md6kzr^ z=a&NY8e+J=7?N#ZfnkPX63Bzaa0@{WgLvFIu_Q4kKOI$TMNw)Rmw|#g7sUG@Qo+pB z)Yw!3C=3OL1`1%7LLOYm80bzAKnR(cVhWi99fqpP!o(6?$kGTHmrzwDMTwa?sYP6% z*zqTC_24ojv8V*>9ZL%%E>%@m Ge>VV~$*FMw literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json b/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json new file mode 100644 index 0000000..b770124 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "hamburger.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "hamburger 1.pdf", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "hamburger 2.pdf", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf b/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fb4ae731fa2f6fd39cf442fb62c9349592d8f79a GIT binary patch literal 954 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f-!cYqu*fz0oU(#uGc)46y}&m zG7Dut;0P1+$W;yL{QNojkva3`j{14F^~W9`zWnm{=6P}R<=c*LFW9iZiaTDhFStAL z)g!s1ajzDY1nMVBB}WE(o%*An_ciO7VRh6n;cz{x!IgWn{O*RnASuX$DHiv zd7;j>#qdq_s^=5-afKRIELm@>%$@1HQBjx6+3T&)GdI>`rXS7*rNy_h^Ot{nY~o?- zAuXh5)3@x3>Y1%8 z9{V{(iL`Cg+dQu=wyzP037j%CAs}Rxr>r00RWW$OI;YV8KiZN-fSWElN%;Rsbal zP+Wqd*Ev70BsC9cBPcz<1OpO_fMN=!P$8sL0}_I#CVlVB6rfWTKt2dkfZ5}mUkcP~ zh~fTXNa}$Fh8c=UAP*M9Ed)6X;&JE1lEj?+bX2VsMX70A1`6g}5buLX1v67qV^am7 zFccUXD1ccCd2k_PpgTbTA!K3z^beYlkvY1M8BhzFDl>D0StUh@nK`LNT%g$VbO8p3 zMsa>_s-}WQW{M^xQ1pZH^Gg&!9tH=nesE@0D$w=dtdv+(0``u%u`!pbs;j>n06%6W AD*ylh literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf b/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fb4ae731fa2f6fd39cf442fb62c9349592d8f79a GIT binary patch literal 954 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f-!cYqu*fz0oU(#uGc)46y}&m zG7Dut;0P1+$W;yL{QNojkva3`j{14F^~W9`zWnm{=6P}R<=c*LFW9iZiaTDhFStAL z)g!s1ajzDY1nMVBB}WE(o%*An_ciO7VRh6n;cz{x!IgWn{O*RnASuX$DHiv zd7;j>#qdq_s^=5-afKRIELm@>%$@1HQBjx6+3T&)GdI>`rXS7*rNy_h^Ot{nY~o?- zAuXh5)3@x3>Y1%8 z9{V{(iL`Cg+dQu=wyzP037j%CAs}Rxr>r00RWW$OI;YV8KiZN-fSWElN%;Rsbal zP+Wqd*Ev70BsC9cBPcz<1OpO_fMN=!P$8sL0}_I#CVlVB6rfWTKt2dkfZ5}mUkcP~ zh~fTXNa}$Fh8c=UAP*M9Ed)6X;&JE1lEj?+bX2VsMX70A1`6g}5buLX1v67qV^am7 zFccUXD1ccCd2k_PpgTbTA!K3z^beYlkvY1M8BhzFDl>D0StUh@nK`LNT%g$VbO8p3 zMsa>_s-}WQW{M^xQ1pZH^Gg&!9tH=nesE@0D$w=dtdv+(0``u%u`!pbs;j>n06%6W AD*ylh literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf b/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fb4ae731fa2f6fd39cf442fb62c9349592d8f79a GIT binary patch literal 954 zcmY!laBvK;I`dFTEr~!5FAK2q*+Jp}3?dH8Gc~f-!cYqu*fz0oU(#uGc)46y}&m zG7Dut;0P1+$W;yL{QNojkva3`j{14F^~W9`zWnm{=6P}R<=c*LFW9iZiaTDhFStAL z)g!s1ajzDY1nMVBB}WE(o%*An_ciO7VRh6n;cz{x!IgWn{O*RnASuX$DHiv zd7;j>#qdq_s^=5-afKRIELm@>%$@1HQBjx6+3T&)GdI>`rXS7*rNy_h^Ot{nY~o?- zAuXh5)3@x3>Y1%8 z9{V{(iL`Cg+dQu=wyzP037j%CAs}Rxr>r00RWW$OI;YV8KiZN-fSWElN%;Rsbal zP+Wqd*Ev70BsC9cBPcz<1OpO_fMN=!P$8sL0}_I#CVlVB6rfWTKt2dkfZ5}mUkcP~ zh~fTXNa}$Fh8c=UAP*M9Ed)6X;&JE1lEj?+bX2VsMX70A1`6g}5buLX1v67qV^am7 zFccUXD1ccCd2k_PpgTbTA!K3z^beYlkvY1M8BhzFDl>D0StUh@nK`LNT%g$VbO8p3 zMsa>_s-}WQW{M^xQ1pZH^Gg&!9tH=nesE@0D$w=dtdv+(0``u%u`!pbs;j>n06%6W AD*ylh literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json b/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json new file mode 100644 index 0000000..c7edeb4 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame 25.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame 26.pdf", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame 27.pdf", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf b/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a67dc0f749d0af027c72ebd5d47c4268b301f596 GIT binary patch literal 1505 zcmZXU-*3|}5XayBSKP~_4QYmzV`WKwY)w@?ifQ5(ERwx04^@z@{+}RlRlZ8^Wsyi@B0T(1lMU**SE3Uvtk+l zY^%6_e+7%1`B&Ak-we4p3=rewJkRofcKpxqAf$2{sy!1NjaQ1oy_$4Y&HT7Wl3s9D zTG%tijYlUXOmK>3xj_>|5*%_uIc}{e+yEW7E-39Gi|KJyj+sft0{7ZGM92)08zX`h zgq+k)IG{j57^@W+?r2yK6+_QukUo&hT+!d?VV9uwO4EGw$pQwh&>AnFGZIGOr_B`` zs#bKK+<6pQk46weu2IXBOyI*-~sVgzqIIF5m4G9_cUa+1ElbE7Q{z=Z1Tb z6(>XmA{D3{88%TWdJK~FW^7(eUg^nM6_9Mqf@I0@0_MP(R4nJ0S*|QgWir*8EVz5a zYW9_-b{u+bY|PYy$A$>SXxcyFTO{4hs_g92sRo=$|e2$xKdDT3@ z?bH#u3slZ&nvF{9*fo!B6+1`|$9j-kG<6?qikM!F5w6OX7?=Ug-j;;&n^Sz;ZYWhq z6|7;5vuGY^FTTpZBQjI6&y-SuT@E-Ez9{>0*W5qf`qaidCcv@dHAuf;jZp>&4+8}p zW>9BD*X{)hhU!UUS{0mofe_70EtGQ7>f3U=i!Dp1_hCtPoOaDVp26vMb9OYPST{`% eso;ab#m)9#r0frmaoP5Va!`83PEOu^x&9A{+CVx0 literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf b/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a67dc0f749d0af027c72ebd5d47c4268b301f596 GIT binary patch literal 1505 zcmZXU-*3|}5XayBSKP~_4QYmzV`WKwY)w@?ifQ5(ERwx04^@z@{+}RlRlZ8^Wsyi@B0T(1lMU**SE3Uvtk+l zY^%6_e+7%1`B&Ak-we4p3=rewJkRofcKpxqAf$2{sy!1NjaQ1oy_$4Y&HT7Wl3s9D zTG%tijYlUXOmK>3xj_>|5*%_uIc}{e+yEW7E-39Gi|KJyj+sft0{7ZGM92)08zX`h zgq+k)IG{j57^@W+?r2yK6+_QukUo&hT+!d?VV9uwO4EGw$pQwh&>AnFGZIGOr_B`` zs#bKK+<6pQk46weu2IXBOyI*-~sVgzqIIF5m4G9_cUa+1ElbE7Q{z=Z1Tb z6(>XmA{D3{88%TWdJK~FW^7(eUg^nM6_9Mqf@I0@0_MP(R4nJ0S*|QgWir*8EVz5a zYW9_-b{u+bY|PYy$A$>SXxcyFTO{4hs_g92sRo=$|e2$xKdDT3@ z?bH#u3slZ&nvF{9*fo!B6+1`|$9j-kG<6?qikM!F5w6OX7?=Ug-j;;&n^Sz;ZYWhq z6|7;5vuGY^FTTpZBQjI6&y-SuT@E-Ez9{>0*W5qf`qaidCcv@dHAuf;jZp>&4+8}p zW>9BD*X{)hhU!UUS{0mofe_70EtGQ7>f3U=i!Dp1_hCtPoOaDVp26vMb9OYPST{`% eso;ab#m)9#r0frmaoP5Va!`83PEOu^x&9A{+CVx0 literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf b/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a67dc0f749d0af027c72ebd5d47c4268b301f596 GIT binary patch literal 1505 zcmZXU-*3|}5XayBSKP~_4QYmzV`WKwY)w@?ifQ5(ERwx04^@z@{+}RlRlZ8^Wsyi@B0T(1lMU**SE3Uvtk+l zY^%6_e+7%1`B&Ak-we4p3=rewJkRofcKpxqAf$2{sy!1NjaQ1oy_$4Y&HT7Wl3s9D zTG%tijYlUXOmK>3xj_>|5*%_uIc}{e+yEW7E-39Gi|KJyj+sft0{7ZGM92)08zX`h zgq+k)IG{j57^@W+?r2yK6+_QukUo&hT+!d?VV9uwO4EGw$pQwh&>AnFGZIGOr_B`` zs#bKK+<6pQk46weu2IXBOyI*-~sVgzqIIF5m4G9_cUa+1ElbE7Q{z=Z1Tb z6(>XmA{D3{88%TWdJK~FW^7(eUg^nM6_9Mqf@I0@0_MP(R4nJ0S*|QgWir*8EVz5a zYW9_-b{u+bY|PYy$A$>SXxcyFTO{4hs_g92sRo=$|e2$xKdDT3@ z?bH#u3slZ&nvF{9*fo!B6+1`|$9j-kG<6?qikM!F5w6OX7?=Ug-j;;&n^Sz;ZYWhq z6|7;5vuGY^FTTpZBQjI6&y-SuT@E-Ez9{>0*W5qf`qaidCcv@dHAuf;jZp>&4+8}p zW>9BD*X{)hhU!UUS{0mofe_70EtGQ7>f3U=i!Dp1_hCtPoOaDVp26vMb9OYPST{`% eso;ab#m)9#r0frmaoP5Va!`83PEOu^x&9A{+CVx0 literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json b/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json new file mode 100644 index 0000000..ee55714 --- /dev/null +++ b/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Logo.pdf", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Logo 1.pdf", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Logo 2.pdf", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf b/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b11493dd6a94b427311f93f36bf58ff37da8236c GIT binary patch literal 9658 zcma)i2RxPU`+xRM_Rb+A`<%lWMz*4?WMv;59NTeZ6pD<U zDkCH6{~T1`^6B&YpV#YtJg)n?uYF(7^LpMlzpm8yFl4k%9p?2qaVz z0t4AXC@Imdwg-!WJG=r)ywH73Ffe|4j|j*)tX}G{dN@Q{5-;H2)WfA!NjP2rUcEFNCJhq9yDu%h7Y76wf&k;)M}px<2=XuP3tIpB>^T0g(L9R{bv&P zq#h2!zg8jSa2dkkVAu}}B&ER8kb@vVCGp!44uwlW@g^XUV3-v6Z$bFiI)wadAp*60 zC=U=M0-t_-9u5To*cf=D{;weXYbip0)uJihnS+WGhac>G@gIBeXDbr_u`9%XWCmc~ z4-gQ7{c;fpx)$DE^Pf8oAECor4vNp~|5luYiiWC&D+ULW(8aphTtMSMb{JP%EZWn} z3u}W0S)=VSu9QHX+G1>Q2mkHSY+O+8l=#ILd_8e!7Y$cCH%k28(gPL%{m>V5@-)WY z1qHNUA)w`gBy_O0Xe`Fn{!jV^FL!rmvpma z`9;+Cbw>kD8_xvUx5mcJ7VYVdvO!}}uJ&k3IWSlrBzO9>JU$M8%pI(-wzF|SVGlUL zKn3mb9#H?}fdJ9~9_WAZK=*j0_I3V6j^sWM?7!ql?enPq7Z2?JLk@h82PXMnauEA+ z{?lgUKF@FQ!ABLJ`JWlG@xo$(x{yoRnd6+ewcCa z%KD=)02v3H$%o*f`JFN;k@4jEzYHIl2@iFWBC+-;TuYvws{ZoP5A7BFt z-4nY_v`cv(0}*vEYl{1Kc2*vg?tBYV@ZXxU;j~-;i#hpjV}=u5IJ20$O4({eyFL7u zI_f@ltS)40mZD9jJuXMTaWV<>7wU#So%XW$vK5^$ggxRvWEkkHSt>N{BRjib^LWZ^ zdQRHpkrujgnlVPPsbgdHbT~pkdPrtz>fuOf@LFbQZu-}2gvU!!=`GSu3ltx!8$xX^ zE?%P0%jAFvTE1BnSaFi*mpAa27*pR!4Rx`Mndu^?nXmMd;2*^dqD#YWwt5V^r7u2N zTzHFSn-O+rdrSDHO356;acQl*F_Vj98=km6BgAo2FG)+sL*8erV=C#)MGH^1!ITSM zhRS2URyBX^UtkT>i=OeRV|7gVvgtbZZ#U$$Zf6uqP=ZUd_zHe-ba$K8 z;>_K5sjD&7#-TZU8-mu*Ie00T-vX5jthm0gb{brFt1 zmFVG@EhT8qWI?~qQjbx=GR70)*^0u{o|RCG~RTshdb!||M;2G6j7jp!|un6>xI`Sll3*`Cb>urQlxBO&xjNSlek+zHvp z2^yzOyEv2KlLfhpP3kDBX_wKWOUX4{?P{Jv>CSJeIf+u@RFS86xh2wvz5lu5vWlE! zK1t+MAN}_BzXGFW;@U zTesP1n_r(a7;GF#_DrS|GE6!{Hh43Nd3biyf8Bdh9<%`#piSz+Y`K~xpFH;jZQH5n z91?t|oGT=0z7Lgf$M7{aE7aq}*tSe%eGlq#mu$9$g@o(?-s09nA?JyhPPT$wnNwU9M}gHAm-ufN{Ukua|l7s-HMzR;G=j{Ajtc zVh$=AezLAmN=TS7jaDci=LKKM^Inps&(3!ie5lXij4g$#RmydE^X@a|Cy zZ>oQj^_lC5mNUmlO*_g%kn_tA_2;|SUdMRQAgwquyI*d@-L73f`{js`h?;rIV&zg_ zTyC3OCz&3Up;3iPm9sMH!}S+;`6&1%8luC-l4JAo$gd!AnQ9{EzNXTg*P^$#RKMqZ zjeJ!l)}yzEDyK&Kx*E&ybdJV-h7+rGp2E~>B#~_GtD>AH?V!T~T!`p-olZdfe;ISkr`m)XLjMPuE$}@Q4L-Yoe^x?_or0#v5 zyufmn*Gvjbvh&6`a^szn6K_C4-)GF(8dPiCMM(+iDDyQ64=~Ic4eIMjy$F9!x`NRvIh(jSNiX!_ zW#cHExwzs(N`Cd%;m_Akn99?7F~4gnc}%Mme`=uGk;r;7((ziM;Vq$s_nD7icN~Oi z;#TR}O{IevD^q!VxRhII`>R}wtx7jfIhL*EoDDl$L5S_G`Xs)q%6h_hCW%m;JzK7C zMWr}tfT%h`+#;JL?U6Yw-;3A!m0;dKmQ3j;5q=diicz6${_*6hH@qdDsT!Z}FFK;p zsu)B>_q?v?L60zsk+f{9_N$_Y{u$*QT_2%{tUmH~esQJjcvRB1V2W`{vpp5j%l4hn zLgP}HwN3r)-4E+U!4XunDIgM&iKc)uA&D;Shimig!>Yp_oGV?gt8cX)je{02FkwCs zOC7(6USw-?_I1l@vaZ(&ywWDQM(cYnAY*7Pa?o1UIh^hkiMP!c#PIWhI9^Tt zN3`sY%7Y-kR$d9k0Z+~#P=i<5Zm7XaI_fM=ChP6GW$`$tl`jvD@~ERKJTt(SQ_dlZ zsBW1+o-4=LjMAs&_@VD^CToosn=%Ya)4m#t6Me|oPBXPA#dvz#qQT)odUg=CR^Nqf zY9>y*V%ke*Y0rOAt*^*id+FP@tF(P3B(bcS|CDM#?K#Wt_#z%HKNnJ_b>pqVvl4k# z4n2cP+H)1)Rfl6?Qgf>b?1^4U-iv%gX=EA!etDT2N(~NU$%QUi(Y)ND6XnakY$zXc z6xbm7bA<*m)s8!~HJ^YYFK+F*ghm_n>jwIhk@T-FIckQa&!ET7N6b@l*y?hbUg|qO zQ|H$JRxVj(WWUkHbMeX9q4}PrBDJV{u=n--rR$M{fn(t^LSkD@zF!Q!?5@p(>0_e2 zZ7_2|%!UcXJ{h*Waq?l+RBb{22Qyj?EVrWJ_hK@*pn6-i&iq zT``T-kTHPy%U&`W0V#Bjz$!cXsPsviqv1qS!Cte_Sx?zuv z>kfEm9FL@MF;RbcaxFMI62iBVFGA?B6$~vC5v5B_jEEkjJ4y18D4~bhNAjDXHl@qW z%ah8amm+Rq2m`0+TvSE}8huntY@0a3Z{W_4D&EYEg;v|G#TMUdSBiM=g3Zf1*4cxh z54))zm}?PtgMXNBPLnwgBCC7bFW})Y{iE{aXD@tNE0RD#stWI!#PY%&MC(6N7rB!3N-D6cV;iN#y zx9j{2w4A9K?-Vn<<{iWCFL3Sh4+SmGLYG2YtxL9ad!i=0DBm5Ae|k|dqAMC3x@@R5 zr7N1~NzEi!*uyQ{#Feo=S>OUwtKhO*aiSubopDH_Dg5Y>wx%>GTX@5ca;NytaeuF2 zn%fhRcI`kO9R`q_+Zs) zHJ$29pA0JM(6Dcx-q46f)L(l0IGq3G)hl!-MAD~^wzn(t^YX`wEnQ|`eKFobnAddk zCLPDLIF#*p3Y5-HTeFQ^5m&?2e%@>+|6-o)s$dgrS{Sml9BQEw6mX%yHIaDNXy`Ma?7Yeq%>k*H=AEos2V=WxKTJHB*>EmmE z16LM3Z*ih)$8M&N-Q;qdE;%Rh&_K4QA}uxlb>G&y4gZ;JrZF*>6*RU$qq^wsrL?Q3 zR&f6P|5QKE&x1EvMc7K@%GVO0=AXXlO)HRX8R!z?TKXrr-rL#rDc9Imk1DbGV@w1t zV2qK}Le4pK&e>&pp{J{}EwjWP*WH7%b+e+c>mA7msp&eQx%92?n4+%V`xk1jZVj0E zJ2I0`4Vk#bNV~>qUG}AQ{|@F+JDW@h=X5+So_Y5S%$vGm4yEv9M)K_J`Pa`_pIT*D zP8Lr;=eX(j*5w`O9Fy~?Aw36q-@QBb@5GiXPLYmjs}aYS`4*ic6P7U(Q|TuN?whT4 zuAQU29YsFuLI~xUskN&<3ZojzWy$~0m*qsPG~|jcD$@(2snIrA8Iv1`zH?4+ko=x> zWOEX|wO)2>Kf(nSMy3;E@=7o1qUz%!5bVVLnqo2r!7!>|*XihsV>`XQ%kbgLt<&#l z?Ge0+5<;?;HSmX##)t}80)OvRGFDwF_q@Md_*~Dtk&h9+<*n&;1Yos7uBz>&4?bsawJ~OkG<5XvnCSy-m@Tujp-Wb zgw?KgWG4)ID~;mPk%ASwqmUro`IprLALTL$w3fr}vgcHBdfeqk)+lpW-sP9As$vfH znp+k*I!H26*M3urT3g0Wx7T0&5@<{b$#$8|B#!T@_7b^q`*B$Y^YLC8|Agoe% z8i=WFTv$qTW7tD{JySTFAcTovB_ldAMJ=KBGR5rm^aMpu9W13;<8}tvYc&fLDkOMM zc*406Ws~fE;jub2cKn!Fk&v=H^|fWWm*Nk}W1eA}N5-bNp4J3KBw@_5<#xW%GP zMJ)|~GPCXz0g9}I>iVY4eu9nbyhV(u5Jg8x%Cj$~rHi)o4K_xblouzzZ}pK2+-Q!o z9*Ht~QTM)0{^kN@X==KnYm;ZkJH>P&?dvx^dmuDN9L(!PkDaN}pWUHv>91qZ+y$%J zp2-=ANKa5DCGk@BNmDK9E zM|Yj_Rtry>wE9u(Ln@-e*bieSs>-7bpzB{s(rtvS-Srb4IGJyyv}7hduwwNlep+~r z|AY(jn5pubaZi7cBd9XIjhwg3FXB1>-PwR^USbLNM)k-~k7hXCEv`c`Csin(UpAP& zF@gaJ2??0*X=#_}%QpwXvJU5mgbl46%6!qM{C6BTRQ z(K6*+)7N~=Jjkkz*RQ5rs3+R0sJwYM;iG8otsU{UQ5VJsQ76LX$9-MLp^;VZauc1h zh@-!x`n6jQ(huZkn<<|%ekCZn$Yl#&<;ctEl3p#~Zu!h%2Mer{pGt|wmPW>ZBE5gK z=(vXA<{Vlg*=0@kqSzy+Qbr@?8tZ#mnyqom)Jn4n-^@~RMgm1@AM|^TsoG{8O*FI9 zF@j2I9d^Q!cbqDBj*JXlXHhv9g7X%R8)5h4NT%?t1MBOM zR3(}VPA*`xC`ho;fyPbDIJ`M>(rUF&rM~-_c#y0dY8<62>L2|UK5IRun6$w6DX}HU zKP-PbN{3LxKBCEpY<9jNJE*n3I+i9hty9>}fX{oT`@{57>GIY<7hw_#af)E%M`$hq?d)Td(V z7|!Nmjhc#?o8R9LI1^**$WnvFTuQG9=pG9R?>sGG{Ed$NT@?{u^{3bZ^@58DESX?F zDFH(lW@E7O*_ywc3Hp(#<#z%ix5#BYTQ3uGDuVys1Mq!%BcC+rcRMami1 zd7#Co_w_Ez;amLl*WM^vt!C}C`|2}8S`!>}Y3LyH>n@~qD8#wT<~GLWQX=r-RTCoq zrdRxOZ-hYXb|2Kw-44tE@vs%j%@>MORuc-$o#!_oxu6eoEp_3QOb(v9>Rc33uK!)E z>?~Q!jhruzA<4Re$#sh7U!Brt;o4@66)hQf+X+1C=my5*{G^WY<#8}7ejMv5QIyXV zZhb$YAoN)*1Df4AuUC6?WvK8)hh~pgLJiRG2VI_Xh@{$S`k0m|bv^f*Bbmoli1Lw{ z*J9`(ZD`S183U`_70(JRIqpNPeeHeG;!}ONqHs$py#Z9xXDc;|^O)KM zSvy#+wl|LPk}u7dw`J8EO|PTKdY;^l5;spdT~yl_6)=YUY{ZX2pn_fRYnu#l^85CD zGTO2*($!;;-29Ox6D1o}I_l?%n5XCK^<3%Xq6m#>#ckvG)`(G?)v4c`h}lMRi{-d4&o1~Rhs9A4 z50NcSSA+^&krO%nvNC(Vpi42sYUnkg&F8aO*ICx$^en4%s6Re@m>bx~ z8}`A#S3Nz_gf`->D2*7me0S?e0ktRhc;hQ}243$sMDtUYAFpJ#`BKflKn@G>{-F8qJqvcRHqK8X6TAHg|Pm%KUeBX*b?!Y+|2jg=RfH6|gg7 z-1u?V_uJa)ltNbEhNVFJyAP!(>F=rC4K1ss>pLBS@x&9oW*n?mvY)ZvV7tp(@4B7DaAnE)SG5mM)KQW|Vurdq@NB;V<{tE%de_2;@b#=o5_{Q&mfG!F^4fntE zYoTp1sJ~$p5V+(X`~cuGl0OlQAEJH%0()Qoe?SQ;z_)(@8}kG~_dxaoHM%G~Uj$cXvj}LGm z6%-ET>}LP_VjnDku!2EQY07eH@;gZq0pNLmkfZ@v@OP4wG~nj%Bp4oe`ke%v7&t_dISkCNNLzF@i;6BFMTz76P5b w*b41Kg%WyhZa~!oQuYB;i3=D%0D6-KKz{(oLSb=xH75;*z$p3o)pSn(KWcXG&j0`b literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf b/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b11493dd6a94b427311f93f36bf58ff37da8236c GIT binary patch literal 9658 zcma)i2RxPU`+xRM_Rb+A`<%lWMz*4?WMv;59NTeZ6pD<U zDkCH6{~T1`^6B&YpV#YtJg)n?uYF(7^LpMlzpm8yFl4k%9p?2qaVz z0t4AXC@Imdwg-!WJG=r)ywH73Ffe|4j|j*)tX}G{dN@Q{5-;H2)WfA!NjP2rUcEFNCJhq9yDu%h7Y76wf&k;)M}px<2=XuP3tIpB>^T0g(L9R{bv&P zq#h2!zg8jSa2dkkVAu}}B&ER8kb@vVCGp!44uwlW@g^XUV3-v6Z$bFiI)wadAp*60 zC=U=M0-t_-9u5To*cf=D{;weXYbip0)uJihnS+WGhac>G@gIBeXDbr_u`9%XWCmc~ z4-gQ7{c;fpx)$DE^Pf8oAECor4vNp~|5luYiiWC&D+ULW(8aphTtMSMb{JP%EZWn} z3u}W0S)=VSu9QHX+G1>Q2mkHSY+O+8l=#ILd_8e!7Y$cCH%k28(gPL%{m>V5@-)WY z1qHNUA)w`gBy_O0Xe`Fn{!jV^FL!rmvpma z`9;+Cbw>kD8_xvUx5mcJ7VYVdvO!}}uJ&k3IWSlrBzO9>JU$M8%pI(-wzF|SVGlUL zKn3mb9#H?}fdJ9~9_WAZK=*j0_I3V6j^sWM?7!ql?enPq7Z2?JLk@h82PXMnauEA+ z{?lgUKF@FQ!ABLJ`JWlG@xo$(x{yoRnd6+ewcCa z%KD=)02v3H$%o*f`JFN;k@4jEzYHIl2@iFWBC+-;TuYvws{ZoP5A7BFt z-4nY_v`cv(0}*vEYl{1Kc2*vg?tBYV@ZXxU;j~-;i#hpjV}=u5IJ20$O4({eyFL7u zI_f@ltS)40mZD9jJuXMTaWV<>7wU#So%XW$vK5^$ggxRvWEkkHSt>N{BRjib^LWZ^ zdQRHpkrujgnlVPPsbgdHbT~pkdPrtz>fuOf@LFbQZu-}2gvU!!=`GSu3ltx!8$xX^ zE?%P0%jAFvTE1BnSaFi*mpAa27*pR!4Rx`Mndu^?nXmMd;2*^dqD#YWwt5V^r7u2N zTzHFSn-O+rdrSDHO356;acQl*F_Vj98=km6BgAo2FG)+sL*8erV=C#)MGH^1!ITSM zhRS2URyBX^UtkT>i=OeRV|7gVvgtbZZ#U$$Zf6uqP=ZUd_zHe-ba$K8 z;>_K5sjD&7#-TZU8-mu*Ie00T-vX5jthm0gb{brFt1 zmFVG@EhT8qWI?~qQjbx=GR70)*^0u{o|RCG~RTshdb!||M;2G6j7jp!|un6>xI`Sll3*`Cb>urQlxBO&xjNSlek+zHvp z2^yzOyEv2KlLfhpP3kDBX_wKWOUX4{?P{Jv>CSJeIf+u@RFS86xh2wvz5lu5vWlE! zK1t+MAN}_BzXGFW;@U zTesP1n_r(a7;GF#_DrS|GE6!{Hh43Nd3biyf8Bdh9<%`#piSz+Y`K~xpFH;jZQH5n z91?t|oGT=0z7Lgf$M7{aE7aq}*tSe%eGlq#mu$9$g@o(?-s09nA?JyhPPT$wnNwU9M}gHAm-ufN{Ukua|l7s-HMzR;G=j{Ajtc zVh$=AezLAmN=TS7jaDci=LKKM^Inps&(3!ie5lXij4g$#RmydE^X@a|Cy zZ>oQj^_lC5mNUmlO*_g%kn_tA_2;|SUdMRQAgwquyI*d@-L73f`{js`h?;rIV&zg_ zTyC3OCz&3Up;3iPm9sMH!}S+;`6&1%8luC-l4JAo$gd!AnQ9{EzNXTg*P^$#RKMqZ zjeJ!l)}yzEDyK&Kx*E&ybdJV-h7+rGp2E~>B#~_GtD>AH?V!T~T!`p-olZdfe;ISkr`m)XLjMPuE$}@Q4L-Yoe^x?_or0#v5 zyufmn*Gvjbvh&6`a^szn6K_C4-)GF(8dPiCMM(+iDDyQ64=~Ic4eIMjy$F9!x`NRvIh(jSNiX!_ zW#cHExwzs(N`Cd%;m_Akn99?7F~4gnc}%Mme`=uGk;r;7((ziM;Vq$s_nD7icN~Oi z;#TR}O{IevD^q!VxRhII`>R}wtx7jfIhL*EoDDl$L5S_G`Xs)q%6h_hCW%m;JzK7C zMWr}tfT%h`+#;JL?U6Yw-;3A!m0;dKmQ3j;5q=diicz6${_*6hH@qdDsT!Z}FFK;p zsu)B>_q?v?L60zsk+f{9_N$_Y{u$*QT_2%{tUmH~esQJjcvRB1V2W`{vpp5j%l4hn zLgP}HwN3r)-4E+U!4XunDIgM&iKc)uA&D;Shimig!>Yp_oGV?gt8cX)je{02FkwCs zOC7(6USw-?_I1l@vaZ(&ywWDQM(cYnAY*7Pa?o1UIh^hkiMP!c#PIWhI9^Tt zN3`sY%7Y-kR$d9k0Z+~#P=i<5Zm7XaI_fM=ChP6GW$`$tl`jvD@~ERKJTt(SQ_dlZ zsBW1+o-4=LjMAs&_@VD^CToosn=%Ya)4m#t6Me|oPBXPA#dvz#qQT)odUg=CR^Nqf zY9>y*V%ke*Y0rOAt*^*id+FP@tF(P3B(bcS|CDM#?K#Wt_#z%HKNnJ_b>pqVvl4k# z4n2cP+H)1)Rfl6?Qgf>b?1^4U-iv%gX=EA!etDT2N(~NU$%QUi(Y)ND6XnakY$zXc z6xbm7bA<*m)s8!~HJ^YYFK+F*ghm_n>jwIhk@T-FIckQa&!ET7N6b@l*y?hbUg|qO zQ|H$JRxVj(WWUkHbMeX9q4}PrBDJV{u=n--rR$M{fn(t^LSkD@zF!Q!?5@p(>0_e2 zZ7_2|%!UcXJ{h*Waq?l+RBb{22Qyj?EVrWJ_hK@*pn6-i&iq zT``T-kTHPy%U&`W0V#Bjz$!cXsPsviqv1qS!Cte_Sx?zuv z>kfEm9FL@MF;RbcaxFMI62iBVFGA?B6$~vC5v5B_jEEkjJ4y18D4~bhNAjDXHl@qW z%ah8amm+Rq2m`0+TvSE}8huntY@0a3Z{W_4D&EYEg;v|G#TMUdSBiM=g3Zf1*4cxh z54))zm}?PtgMXNBPLnwgBCC7bFW})Y{iE{aXD@tNE0RD#stWI!#PY%&MC(6N7rB!3N-D6cV;iN#y zx9j{2w4A9K?-Vn<<{iWCFL3Sh4+SmGLYG2YtxL9ad!i=0DBm5Ae|k|dqAMC3x@@R5 zr7N1~NzEi!*uyQ{#Feo=S>OUwtKhO*aiSubopDH_Dg5Y>wx%>GTX@5ca;NytaeuF2 zn%fhRcI`kO9R`q_+Zs) zHJ$29pA0JM(6Dcx-q46f)L(l0IGq3G)hl!-MAD~^wzn(t^YX`wEnQ|`eKFobnAddk zCLPDLIF#*p3Y5-HTeFQ^5m&?2e%@>+|6-o)s$dgrS{Sml9BQEw6mX%yHIaDNXy`Ma?7Yeq%>k*H=AEos2V=WxKTJHB*>EmmE z16LM3Z*ih)$8M&N-Q;qdE;%Rh&_K4QA}uxlb>G&y4gZ;JrZF*>6*RU$qq^wsrL?Q3 zR&f6P|5QKE&x1EvMc7K@%GVO0=AXXlO)HRX8R!z?TKXrr-rL#rDc9Imk1DbGV@w1t zV2qK}Le4pK&e>&pp{J{}EwjWP*WH7%b+e+c>mA7msp&eQx%92?n4+%V`xk1jZVj0E zJ2I0`4Vk#bNV~>qUG}AQ{|@F+JDW@h=X5+So_Y5S%$vGm4yEv9M)K_J`Pa`_pIT*D zP8Lr;=eX(j*5w`O9Fy~?Aw36q-@QBb@5GiXPLYmjs}aYS`4*ic6P7U(Q|TuN?whT4 zuAQU29YsFuLI~xUskN&<3ZojzWy$~0m*qsPG~|jcD$@(2snIrA8Iv1`zH?4+ko=x> zWOEX|wO)2>Kf(nSMy3;E@=7o1qUz%!5bVVLnqo2r!7!>|*XihsV>`XQ%kbgLt<&#l z?Ge0+5<;?;HSmX##)t}80)OvRGFDwF_q@Md_*~Dtk&h9+<*n&;1Yos7uBz>&4?bsawJ~OkG<5XvnCSy-m@Tujp-Wb zgw?KgWG4)ID~;mPk%ASwqmUro`IprLALTL$w3fr}vgcHBdfeqk)+lpW-sP9As$vfH znp+k*I!H26*M3urT3g0Wx7T0&5@<{b$#$8|B#!T@_7b^q`*B$Y^YLC8|Agoe% z8i=WFTv$qTW7tD{JySTFAcTovB_ldAMJ=KBGR5rm^aMpu9W13;<8}tvYc&fLDkOMM zc*406Ws~fE;jub2cKn!Fk&v=H^|fWWm*Nk}W1eA}N5-bNp4J3KBw@_5<#xW%GP zMJ)|~GPCXz0g9}I>iVY4eu9nbyhV(u5Jg8x%Cj$~rHi)o4K_xblouzzZ}pK2+-Q!o z9*Ht~QTM)0{^kN@X==KnYm;ZkJH>P&?dvx^dmuDN9L(!PkDaN}pWUHv>91qZ+y$%J zp2-=ANKa5DCGk@BNmDK9E zM|Yj_Rtry>wE9u(Ln@-e*bieSs>-7bpzB{s(rtvS-Srb4IGJyyv}7hduwwNlep+~r z|AY(jn5pubaZi7cBd9XIjhwg3FXB1>-PwR^USbLNM)k-~k7hXCEv`c`Csin(UpAP& zF@gaJ2??0*X=#_}%QpwXvJU5mgbl46%6!qM{C6BTRQ z(K6*+)7N~=Jjkkz*RQ5rs3+R0sJwYM;iG8otsU{UQ5VJsQ76LX$9-MLp^;VZauc1h zh@-!x`n6jQ(huZkn<<|%ekCZn$Yl#&<;ctEl3p#~Zu!h%2Mer{pGt|wmPW>ZBE5gK z=(vXA<{Vlg*=0@kqSzy+Qbr@?8tZ#mnyqom)Jn4n-^@~RMgm1@AM|^TsoG{8O*FI9 zF@j2I9d^Q!cbqDBj*JXlXHhv9g7X%R8)5h4NT%?t1MBOM zR3(}VPA*`xC`ho;fyPbDIJ`M>(rUF&rM~-_c#y0dY8<62>L2|UK5IRun6$w6DX}HU zKP-PbN{3LxKBCEpY<9jNJE*n3I+i9hty9>}fX{oT`@{57>GIY<7hw_#af)E%M`$hq?d)Td(V z7|!Nmjhc#?o8R9LI1^**$WnvFTuQG9=pG9R?>sGG{Ed$NT@?{u^{3bZ^@58DESX?F zDFH(lW@E7O*_ywc3Hp(#<#z%ix5#BYTQ3uGDuVys1Mq!%BcC+rcRMami1 zd7#Co_w_Ez;amLl*WM^vt!C}C`|2}8S`!>}Y3LyH>n@~qD8#wT<~GLWQX=r-RTCoq zrdRxOZ-hYXb|2Kw-44tE@vs%j%@>MORuc-$o#!_oxu6eoEp_3QOb(v9>Rc33uK!)E z>?~Q!jhruzA<4Re$#sh7U!Brt;o4@66)hQf+X+1C=my5*{G^WY<#8}7ejMv5QIyXV zZhb$YAoN)*1Df4AuUC6?WvK8)hh~pgLJiRG2VI_Xh@{$S`k0m|bv^f*Bbmoli1Lw{ z*J9`(ZD`S183U`_70(JRIqpNPeeHeG;!}ONqHs$py#Z9xXDc;|^O)KM zSvy#+wl|LPk}u7dw`J8EO|PTKdY;^l5;spdT~yl_6)=YUY{ZX2pn_fRYnu#l^85CD zGTO2*($!;;-29Ox6D1o}I_l?%n5XCK^<3%Xq6m#>#ckvG)`(G?)v4c`h}lMRi{-d4&o1~Rhs9A4 z50NcSSA+^&krO%nvNC(Vpi42sYUnkg&F8aO*ICx$^en4%s6Re@m>bx~ z8}`A#S3Nz_gf`->D2*7me0S?e0ktRhc;hQ}243$sMDtUYAFpJ#`BKflKn@G>{-F8qJqvcRHqK8X6TAHg|Pm%KUeBX*b?!Y+|2jg=RfH6|gg7 z-1u?V_uJa)ltNbEhNVFJyAP!(>F=rC4K1ss>pLBS@x&9oW*n?mvY)ZvV7tp(@4B7DaAnE)SG5mM)KQW|Vurdq@NB;V<{tE%de_2;@b#=o5_{Q&mfG!F^4fntE zYoTp1sJ~$p5V+(X`~cuGl0OlQAEJH%0()Qoe?SQ;z_)(@8}kG~_dxaoHM%G~Uj$cXvj}LGm z6%-ET>}LP_VjnDku!2EQY07eH@;gZq0pNLmkfZ@v@OP4wG~nj%Bp4oe`ke%v7&t_dISkCNNLzF@i;6BFMTz76P5b w*b41Kg%WyhZa~!oQuYB;i3=D%0D6-KKz{(oLSb=xH75;*z$p3o)pSn(KWcXG&j0`b literal 0 HcmV?d00001 diff --git a/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf b/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b11493dd6a94b427311f93f36bf58ff37da8236c GIT binary patch literal 9658 zcma)i2RxPU`+xRM_Rb+A`<%lWMz*4?WMv;59NTeZ6pD<U zDkCH6{~T1`^6B&YpV#YtJg)n?uYF(7^LpMlzpm8yFl4k%9p?2qaVz z0t4AXC@Imdwg-!WJG=r)ywH73Ffe|4j|j*)tX}G{dN@Q{5-;H2)WfA!NjP2rUcEFNCJhq9yDu%h7Y76wf&k;)M}px<2=XuP3tIpB>^T0g(L9R{bv&P zq#h2!zg8jSa2dkkVAu}}B&ER8kb@vVCGp!44uwlW@g^XUV3-v6Z$bFiI)wadAp*60 zC=U=M0-t_-9u5To*cf=D{;weXYbip0)uJihnS+WGhac>G@gIBeXDbr_u`9%XWCmc~ z4-gQ7{c;fpx)$DE^Pf8oAECor4vNp~|5luYiiWC&D+ULW(8aphTtMSMb{JP%EZWn} z3u}W0S)=VSu9QHX+G1>Q2mkHSY+O+8l=#ILd_8e!7Y$cCH%k28(gPL%{m>V5@-)WY z1qHNUA)w`gBy_O0Xe`Fn{!jV^FL!rmvpma z`9;+Cbw>kD8_xvUx5mcJ7VYVdvO!}}uJ&k3IWSlrBzO9>JU$M8%pI(-wzF|SVGlUL zKn3mb9#H?}fdJ9~9_WAZK=*j0_I3V6j^sWM?7!ql?enPq7Z2?JLk@h82PXMnauEA+ z{?lgUKF@FQ!ABLJ`JWlG@xo$(x{yoRnd6+ewcCa z%KD=)02v3H$%o*f`JFN;k@4jEzYHIl2@iFWBC+-;TuYvws{ZoP5A7BFt z-4nY_v`cv(0}*vEYl{1Kc2*vg?tBYV@ZXxU;j~-;i#hpjV}=u5IJ20$O4({eyFL7u zI_f@ltS)40mZD9jJuXMTaWV<>7wU#So%XW$vK5^$ggxRvWEkkHSt>N{BRjib^LWZ^ zdQRHpkrujgnlVPPsbgdHbT~pkdPrtz>fuOf@LFbQZu-}2gvU!!=`GSu3ltx!8$xX^ zE?%P0%jAFvTE1BnSaFi*mpAa27*pR!4Rx`Mndu^?nXmMd;2*^dqD#YWwt5V^r7u2N zTzHFSn-O+rdrSDHO356;acQl*F_Vj98=km6BgAo2FG)+sL*8erV=C#)MGH^1!ITSM zhRS2URyBX^UtkT>i=OeRV|7gVvgtbZZ#U$$Zf6uqP=ZUd_zHe-ba$K8 z;>_K5sjD&7#-TZU8-mu*Ie00T-vX5jthm0gb{brFt1 zmFVG@EhT8qWI?~qQjbx=GR70)*^0u{o|RCG~RTshdb!||M;2G6j7jp!|un6>xI`Sll3*`Cb>urQlxBO&xjNSlek+zHvp z2^yzOyEv2KlLfhpP3kDBX_wKWOUX4{?P{Jv>CSJeIf+u@RFS86xh2wvz5lu5vWlE! zK1t+MAN}_BzXGFW;@U zTesP1n_r(a7;GF#_DrS|GE6!{Hh43Nd3biyf8Bdh9<%`#piSz+Y`K~xpFH;jZQH5n z91?t|oGT=0z7Lgf$M7{aE7aq}*tSe%eGlq#mu$9$g@o(?-s09nA?JyhPPT$wnNwU9M}gHAm-ufN{Ukua|l7s-HMzR;G=j{Ajtc zVh$=AezLAmN=TS7jaDci=LKKM^Inps&(3!ie5lXij4g$#RmydE^X@a|Cy zZ>oQj^_lC5mNUmlO*_g%kn_tA_2;|SUdMRQAgwquyI*d@-L73f`{js`h?;rIV&zg_ zTyC3OCz&3Up;3iPm9sMH!}S+;`6&1%8luC-l4JAo$gd!AnQ9{EzNXTg*P^$#RKMqZ zjeJ!l)}yzEDyK&Kx*E&ybdJV-h7+rGp2E~>B#~_GtD>AH?V!T~T!`p-olZdfe;ISkr`m)XLjMPuE$}@Q4L-Yoe^x?_or0#v5 zyufmn*Gvjbvh&6`a^szn6K_C4-)GF(8dPiCMM(+iDDyQ64=~Ic4eIMjy$F9!x`NRvIh(jSNiX!_ zW#cHExwzs(N`Cd%;m_Akn99?7F~4gnc}%Mme`=uGk;r;7((ziM;Vq$s_nD7icN~Oi z;#TR}O{IevD^q!VxRhII`>R}wtx7jfIhL*EoDDl$L5S_G`Xs)q%6h_hCW%m;JzK7C zMWr}tfT%h`+#;JL?U6Yw-;3A!m0;dKmQ3j;5q=diicz6${_*6hH@qdDsT!Z}FFK;p zsu)B>_q?v?L60zsk+f{9_N$_Y{u$*QT_2%{tUmH~esQJjcvRB1V2W`{vpp5j%l4hn zLgP}HwN3r)-4E+U!4XunDIgM&iKc)uA&D;Shimig!>Yp_oGV?gt8cX)je{02FkwCs zOC7(6USw-?_I1l@vaZ(&ywWDQM(cYnAY*7Pa?o1UIh^hkiMP!c#PIWhI9^Tt zN3`sY%7Y-kR$d9k0Z+~#P=i<5Zm7XaI_fM=ChP6GW$`$tl`jvD@~ERKJTt(SQ_dlZ zsBW1+o-4=LjMAs&_@VD^CToosn=%Ya)4m#t6Me|oPBXPA#dvz#qQT)odUg=CR^Nqf zY9>y*V%ke*Y0rOAt*^*id+FP@tF(P3B(bcS|CDM#?K#Wt_#z%HKNnJ_b>pqVvl4k# z4n2cP+H)1)Rfl6?Qgf>b?1^4U-iv%gX=EA!etDT2N(~NU$%QUi(Y)ND6XnakY$zXc z6xbm7bA<*m)s8!~HJ^YYFK+F*ghm_n>jwIhk@T-FIckQa&!ET7N6b@l*y?hbUg|qO zQ|H$JRxVj(WWUkHbMeX9q4}PrBDJV{u=n--rR$M{fn(t^LSkD@zF!Q!?5@p(>0_e2 zZ7_2|%!UcXJ{h*Waq?l+RBb{22Qyj?EVrWJ_hK@*pn6-i&iq zT``T-kTHPy%U&`W0V#Bjz$!cXsPsviqv1qS!Cte_Sx?zuv z>kfEm9FL@MF;RbcaxFMI62iBVFGA?B6$~vC5v5B_jEEkjJ4y18D4~bhNAjDXHl@qW z%ah8amm+Rq2m`0+TvSE}8huntY@0a3Z{W_4D&EYEg;v|G#TMUdSBiM=g3Zf1*4cxh z54))zm}?PtgMXNBPLnwgBCC7bFW})Y{iE{aXD@tNE0RD#stWI!#PY%&MC(6N7rB!3N-D6cV;iN#y zx9j{2w4A9K?-Vn<<{iWCFL3Sh4+SmGLYG2YtxL9ad!i=0DBm5Ae|k|dqAMC3x@@R5 zr7N1~NzEi!*uyQ{#Feo=S>OUwtKhO*aiSubopDH_Dg5Y>wx%>GTX@5ca;NytaeuF2 zn%fhRcI`kO9R`q_+Zs) zHJ$29pA0JM(6Dcx-q46f)L(l0IGq3G)hl!-MAD~^wzn(t^YX`wEnQ|`eKFobnAddk zCLPDLIF#*p3Y5-HTeFQ^5m&?2e%@>+|6-o)s$dgrS{Sml9BQEw6mX%yHIaDNXy`Ma?7Yeq%>k*H=AEos2V=WxKTJHB*>EmmE z16LM3Z*ih)$8M&N-Q;qdE;%Rh&_K4QA}uxlb>G&y4gZ;JrZF*>6*RU$qq^wsrL?Q3 zR&f6P|5QKE&x1EvMc7K@%GVO0=AXXlO)HRX8R!z?TKXrr-rL#rDc9Imk1DbGV@w1t zV2qK}Le4pK&e>&pp{J{}EwjWP*WH7%b+e+c>mA7msp&eQx%92?n4+%V`xk1jZVj0E zJ2I0`4Vk#bNV~>qUG}AQ{|@F+JDW@h=X5+So_Y5S%$vGm4yEv9M)K_J`Pa`_pIT*D zP8Lr;=eX(j*5w`O9Fy~?Aw36q-@QBb@5GiXPLYmjs}aYS`4*ic6P7U(Q|TuN?whT4 zuAQU29YsFuLI~xUskN&<3ZojzWy$~0m*qsPG~|jcD$@(2snIrA8Iv1`zH?4+ko=x> zWOEX|wO)2>Kf(nSMy3;E@=7o1qUz%!5bVVLnqo2r!7!>|*XihsV>`XQ%kbgLt<&#l z?Ge0+5<;?;HSmX##)t}80)OvRGFDwF_q@Md_*~Dtk&h9+<*n&;1Yos7uBz>&4?bsawJ~OkG<5XvnCSy-m@Tujp-Wb zgw?KgWG4)ID~;mPk%ASwqmUro`IprLALTL$w3fr}vgcHBdfeqk)+lpW-sP9As$vfH znp+k*I!H26*M3urT3g0Wx7T0&5@<{b$#$8|B#!T@_7b^q`*B$Y^YLC8|Agoe% z8i=WFTv$qTW7tD{JySTFAcTovB_ldAMJ=KBGR5rm^aMpu9W13;<8}tvYc&fLDkOMM zc*406Ws~fE;jub2cKn!Fk&v=H^|fWWm*Nk}W1eA}N5-bNp4J3KBw@_5<#xW%GP zMJ)|~GPCXz0g9}I>iVY4eu9nbyhV(u5Jg8x%Cj$~rHi)o4K_xblouzzZ}pK2+-Q!o z9*Ht~QTM)0{^kN@X==KnYm;ZkJH>P&?dvx^dmuDN9L(!PkDaN}pWUHv>91qZ+y$%J zp2-=ANKa5DCGk@BNmDK9E zM|Yj_Rtry>wE9u(Ln@-e*bieSs>-7bpzB{s(rtvS-Srb4IGJyyv}7hduwwNlep+~r z|AY(jn5pubaZi7cBd9XIjhwg3FXB1>-PwR^USbLNM)k-~k7hXCEv`c`Csin(UpAP& zF@gaJ2??0*X=#_}%QpwXvJU5mgbl46%6!qM{C6BTRQ z(K6*+)7N~=Jjkkz*RQ5rs3+R0sJwYM;iG8otsU{UQ5VJsQ76LX$9-MLp^;VZauc1h zh@-!x`n6jQ(huZkn<<|%ekCZn$Yl#&<;ctEl3p#~Zu!h%2Mer{pGt|wmPW>ZBE5gK z=(vXA<{Vlg*=0@kqSzy+Qbr@?8tZ#mnyqom)Jn4n-^@~RMgm1@AM|^TsoG{8O*FI9 zF@j2I9d^Q!cbqDBj*JXlXHhv9g7X%R8)5h4NT%?t1MBOM zR3(}VPA*`xC`ho;fyPbDIJ`M>(rUF&rM~-_c#y0dY8<62>L2|UK5IRun6$w6DX}HU zKP-PbN{3LxKBCEpY<9jNJE*n3I+i9hty9>}fX{oT`@{57>GIY<7hw_#af)E%M`$hq?d)Td(V z7|!Nmjhc#?o8R9LI1^**$WnvFTuQG9=pG9R?>sGG{Ed$NT@?{u^{3bZ^@58DESX?F zDFH(lW@E7O*_ywc3Hp(#<#z%ix5#BYTQ3uGDuVys1Mq!%BcC+rcRMami1 zd7#Co_w_Ez;amLl*WM^vt!C}C`|2}8S`!>}Y3LyH>n@~qD8#wT<~GLWQX=r-RTCoq zrdRxOZ-hYXb|2Kw-44tE@vs%j%@>MORuc-$o#!_oxu6eoEp_3QOb(v9>Rc33uK!)E z>?~Q!jhruzA<4Re$#sh7U!Brt;o4@66)hQf+X+1C=my5*{G^WY<#8}7ejMv5QIyXV zZhb$YAoN)*1Df4AuUC6?WvK8)hh~pgLJiRG2VI_Xh@{$S`k0m|bv^f*Bbmoli1Lw{ z*J9`(ZD`S183U`_70(JRIqpNPeeHeG;!}ONqHs$py#Z9xXDc;|^O)KM zSvy#+wl|LPk}u7dw`J8EO|PTKdY;^l5;spdT~yl_6)=YUY{ZX2pn_fRYnu#l^85CD zGTO2*($!;;-29Ox6D1o}I_l?%n5XCK^<3%Xq6m#>#ckvG)`(G?)v4c`h}lMRi{-d4&o1~Rhs9A4 z50NcSSA+^&krO%nvNC(Vpi42sYUnkg&F8aO*ICx$^en4%s6Re@m>bx~ z8}`A#S3Nz_gf`->D2*7me0S?e0ktRhc;hQ}243$sMDtUYAFpJ#`BKflKn@G>{-F8qJqvcRHqK8X6TAHg|Pm%KUeBX*b?!Y+|2jg=RfH6|gg7 z-1u?V_uJa)ltNbEhNVFJyAP!(>F=rC4K1ss>pLBS@x&9oW*n?mvY)ZvV7tp(@4B7DaAnE)SG5mM)KQW|Vurdq@NB;V<{tE%de_2;@b#=o5_{Q&mfG!F^4fntE zYoTp1sJ~$p5V+(X`~cuGl0OlQAEJH%0()Qoe?SQ;z_)(@8}kG~_dxaoHM%G~Uj$cXvj}LGm z6%-ET>}LP_VjnDku!2EQY07eH@;gZq0pNLmkfZ@v@OP4wG~nj%Bp4oe`ke%v7&t_dISkCNNLzF@i;6BFMTz76P5b w*b41Kg%WyhZa~!oQuYB;i3=D%0D6-KKz{(oLSb=xH75;*z$p3o)pSn(KWcXG&j0`b literal 0 HcmV?d00001 diff --git a/demo-store-ios/features/splash/ContentView.swift b/demo-store-ios/features/splash/ContentView.swift index e369348..c8393aa 100644 --- a/demo-store-ios/features/splash/ContentView.swift +++ b/demo-store-ios/features/splash/ContentView.swift @@ -3,29 +3,73 @@ import SwiftUI struct ContentView: View { var body: some View { - CustomTabView() - .edgesIgnoringSafeArea(.all) + VStack(spacing: 0) { + ToolbarView() + + Divider() + + BottomBarView() + .edgesIgnoringSafeArea(.bottom) + } + .background(Color.white.edgesIgnoringSafeArea(.all)) + } +} + +struct ToolbarView: View { + var body: some View { + VStack { + ZStack { + Color.black + Image("ToolbarLogo") + .resizable() + .aspectRatio(contentMode: .fit) + .padding(.vertical, 10) + .foregroundColor(.white) + } + .frame(height: 50) + + HStack(spacing: 20) { + + Image("MenuIcon") + .resizable() + .renderingMode(.template) + .frame(width: 24, height: 24) + .foregroundColor(.black) + .padding(.leading, 12) + + Spacer() + + Image("SearchIcon") + .resizable() + .renderingMode(.template) + .frame(width: 30, height: 30) + .foregroundColor(.black) + + Image("CartIcon") + .resizable() + .renderingMode(.template) + .frame(width: 30, height: 30) + .foregroundColor(.black) + .padding(.trailing, 12) + } + .frame(height: 50) + } + .background(Color.white) } } -struct CustomTabView: View { +struct BottomBarView: View { @State private var selectedTab = 0 var body: some View { VStack { - // Content switch selectedTab { - case 0: - MainScreenView() - case 1: - CatalogScreenView() - case 2: - CartScreenView() - case 3: - SettingsScreenView() - default: - MainScreenView() + case 0:MainScreenView() + case 1:CatalogScreenView() + case 2:CartScreenView() + case 3:SettingsScreenView() + default:MainScreenView() } Spacer() From 10ca3122ef7f16d63075000dcc012de332c6c5b4 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 4 Jul 2024 17:49:20 +0200 Subject: [PATCH 10/85] feat: Change status bar colors in main screens --- demo-store-ios.xcodeproj/project.pbxproj | 12 +++ demo-store-ios/DemoStoreApp.swift | 1 + .../features/splash/ContentView.swift | 84 ++++--------------- .../features/splash/SplashScreenView.swift | 3 +- demo-store-ios/navigation/BottomBarView.swift | 65 ++++++++++++++ resources/Localizable.xcstrings | 3 + 6 files changed, 100 insertions(+), 68 deletions(-) create mode 100644 demo-store-ios/navigation/BottomBarView.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index bae3c83..106f62f 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -21,6 +21,7 @@ 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */; }; 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */; }; + 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD192C36F94800D6D346 /* BottomBarView.swift */; }; D78A79C526F8BC172C2E09DA /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; E595009B8CDAA1ED437EACF0 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */; }; FF4CD03BDB28EF3ACB920BA6 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */; }; @@ -65,6 +66,7 @@ 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenView.swift; sourceTree = ""; }; 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + 75ECCD192C36F94800D6D346 /* BottomBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomBarView.swift; sourceTree = ""; }; 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; @@ -173,6 +175,7 @@ 75B935552C3564360063E814 /* demo-store-ios */ = { isa = PBXGroup; children = ( + 75ECCD182C36F92A00D6D346 /* navigation */, 755944A32C35883F00C274C9 /* utils */, 7559449C2C357E1800C274C9 /* features */, 75B935562C3564360063E814 /* DemoStoreApp.swift */, @@ -239,6 +242,14 @@ path = resources; sourceTree = ""; }; + 75ECCD182C36F92A00D6D346 /* navigation */ = { + isa = PBXGroup; + children = ( + 75ECCD192C36F94800D6D346 /* BottomBarView.swift */, + ); + path = navigation; + sourceTree = ""; + }; 8FED5CC7CDC6607CEFB8FDC9 /* Pods */ = { isa = PBXGroup; children = ( @@ -455,6 +466,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */, diff --git a/demo-store-ios/DemoStoreApp.swift b/demo-store-ios/DemoStoreApp.swift index 4e4a8be..5b89f2d 100644 --- a/demo-store-ios/DemoStoreApp.swift +++ b/demo-store-ios/DemoStoreApp.swift @@ -8,6 +8,7 @@ struct DemoStoreApp: App { WindowGroup { if showSplash { LaunchScreen() + .edgesIgnoringSafeArea(.all) .onAppear { DispatchQueue.main.asyncAfter(deadline: .now() + 2) { withAnimation { diff --git a/demo-store-ios/features/splash/ContentView.swift b/demo-store-ios/features/splash/ContentView.swift index c8393aa..21f737b 100644 --- a/demo-store-ios/features/splash/ContentView.swift +++ b/demo-store-ios/features/splash/ContentView.swift @@ -1,21 +1,30 @@ +import SwiftUI +import Combine + import SwiftUI struct ContentView: View { + @StateObject var tabSelection = TabSelection() var body: some View { - VStack(spacing: 0) { - ToolbarView() - - Divider() + ZStack { + Color.black.edgesIgnoringSafeArea(.top) - BottomBarView() - .edgesIgnoringSafeArea(.bottom) + VStack(spacing: 0) { + ToolbarView(tabSelection: tabSelection) + + BottomBarView(tabSelection: tabSelection) + .edgesIgnoringSafeArea(.bottom) + } } .background(Color.white.edgesIgnoringSafeArea(.all)) + .statusBar(hidden: false) } } struct ToolbarView: View { + @ObservedObject var tabSelection: TabSelection + var body: some View { VStack { ZStack { @@ -51,6 +60,9 @@ struct ToolbarView: View { .frame(width: 30, height: 30) .foregroundColor(.black) .padding(.trailing, 12) + .onTapGesture { + tabSelection.selectedTabIndex = 2 + } } .frame(height: 50) } @@ -58,66 +70,6 @@ struct ToolbarView: View { } } -struct BottomBarView: View { - @State private var selectedTab = 0 - - var body: some View { - - VStack { - switch selectedTab { - case 0:MainScreenView() - case 1:CatalogScreenView() - case 2:CartScreenView() - case 3:SettingsScreenView() - default:MainScreenView() - } - - Spacer() - - HStack { - TabBarButton(image: "MainTab", isSelected: selectedTab == 0) - .onTapGesture {selectedTab = 0} - .padding(.leading, 20) - - Spacer() - - TabBarButton(image: "CatalogTab", isSelected: selectedTab == 1) - .onTapGesture { selectedTab = 1} - - Spacer() - - TabBarButton(image: "CartTab", isSelected: selectedTab == 2) - .onTapGesture {selectedTab = 2} - - Spacer() - - TabBarButton(image: "SettingsTab", isSelected: selectedTab == 3) - .onTapGesture { selectedTab = 3 } - .padding(.trailing, 20) - } - .frame(height: 70) - .background(Color.black) - } - } -} - -struct TabBarButton: View { - var image: String - var isSelected: Bool - - var body: some View { - VStack { - Spacer() - Image(image) - .resizable() - .renderingMode(.template) - .frame(width: 32, height: 32) - .foregroundColor(isSelected ? .white : .gray) - Spacer().frame(height: 20) - } - } -} - #if DEBUG struct ContentView_Previews: PreviewProvider { static var previews: some View { diff --git a/demo-store-ios/features/splash/SplashScreenView.swift b/demo-store-ios/features/splash/SplashScreenView.swift index 30fe397..4edfe39 100644 --- a/demo-store-ios/features/splash/SplashScreenView.swift +++ b/demo-store-ios/features/splash/SplashScreenView.swift @@ -3,8 +3,7 @@ import SwiftUI struct SplashScreenView: View { var body: some View { ZStack{ - Color.black - .edgesIgnoringSafeArea(.all) + Color.black.edgesIgnoringSafeArea(.all) Image("SplashLogo") .resizable() diff --git a/demo-store-ios/navigation/BottomBarView.swift b/demo-store-ios/navigation/BottomBarView.swift new file mode 100644 index 0000000..7b1f0b7 --- /dev/null +++ b/demo-store-ios/navigation/BottomBarView.swift @@ -0,0 +1,65 @@ +import SwiftUI +import Combine + +class TabSelection: ObservableObject { + @Published var selectedTabIndex = 0 +} + +struct BottomBarView: View { + @ObservedObject var tabSelection: TabSelection + + var body: some View { + VStack { + switch tabSelection.selectedTabIndex { + case 0: MainScreenView() + case 1: CatalogScreenView() + case 2: CartScreenView() + case 3: SettingsScreenView() + default: MainScreenView() + } + + Spacer() + + HStack { + TabBarButton(image: "MainTab", isSelected: tabSelection.selectedTabIndex == 0) + .onTapGesture { tabSelection.selectedTabIndex = 0 } + .padding(.leading, 20) + + Spacer() + + TabBarButton(image: "CatalogTab", isSelected: tabSelection.selectedTabIndex == 1) + .onTapGesture { tabSelection.selectedTabIndex = 1 } + + Spacer() + + TabBarButton(image: "CartTab", isSelected: tabSelection.selectedTabIndex == 2) + .onTapGesture { tabSelection.selectedTabIndex = 2 } + + Spacer() + + TabBarButton(image: "SettingsTab", isSelected: tabSelection.selectedTabIndex == 3) + .onTapGesture { tabSelection.selectedTabIndex = 3 } + .padding(.trailing, 20) + } + .frame(height: 70) + .background(Color.black) + } + } +} + +struct TabBarButton: View { + var image: String + var isSelected: Bool + + var body: some View { + VStack { + Spacer() + Image(image) + .resizable() + .renderingMode(.template) + .frame(width: 32, height: 32) + .foregroundColor(isSelected ? .white : .gray) + Spacer().frame(height: 30) + } + } +} diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 3cfc73e..e2f04ea 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -11,6 +11,9 @@ } } } + }, + "Favourites" : { + }, "main_tab_title" : { "extractionState" : "manual", From ba1d56f958a6ec17b95b2da749b8ce644e1a0a49 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 4 Jul 2024 18:33:40 +0200 Subject: [PATCH 11/85] feat: Add strings --- resources/Localizable.xcstrings | 245 ++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index e2f04ea..9c2cb81 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -1,6 +1,39 @@ { "sourceLanguage" : "en", "strings" : { + "also_bought_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Also bought" + } + } + } + }, + "arrivals_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "New arrivals" + } + } + } + }, + "back_button" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Back" + } + } + } + }, "cart_tab_title" : { "extractionState" : "manual", "localizations" : { @@ -12,8 +45,85 @@ } } }, + "checkout_button" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Checkout" + } + } + } + }, + "continue_button" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continue shopping" + } + } + } + }, + "default_error_sub_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Page not found." + } + } + } + }, + "default_error_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Something went wrong." + } + } + } + }, + "empty_cart_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your shopping cart is empty" + } + } + } + }, "Favourites" : { + }, + "go_home_button" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Go to home" + } + } + } + }, + "login_button" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Login" + } + } + } }, "main_tab_title" : { "extractionState" : "manual", @@ -26,6 +136,50 @@ } } }, + "more_button" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show more" + } + } + } + }, + "processing_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Page not found." + } + } + } + }, + "reccomender_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recommender title" + } + } + } + }, + "settings_sub_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "If you want to try a demo store with your products, you can put here your store key. To get the key, sign up on rees46.ru." + } + } + } + }, "settings_tab_title" : { "extractionState" : "manual", "localizations" : { @@ -36,6 +190,97 @@ } } } + }, + "settings_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Try your own products" + } + } + } + }, + "shipping_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shipping:" + } + } + } + }, + "show_all_button" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show all" + } + } + } + }, + "sign_up_button" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sign Up" + } + } + } + }, + "store_key_hint" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your store key" + } + } + } + }, + "stories_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stories" + } + } + } + }, + "top_trend_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Top trends" + } + } + } + }, + "total_title" : { + "extractionState" : "manual" + }, + "upload_button_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Upload" + } + } + } } }, "version" : "1.0" From 24f8c95a12f7f27be774e5c9c59e38b0a24a4553 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 5 Jul 2024 13:31:28 +0200 Subject: [PATCH 12/85] feat: Add Rees sdk initialization --- Podfile | 1 - Podfile.lock | 23 +- Pods/Local Podspecs/REES46.podspec.json | 31 + Pods/Manifest.lock | 23 +- Pods/Pods.xcodeproj/project.pbxproj | 1161 +++++++++++--- Pods/REES46/LICENSE | 19 + Pods/REES46/README.md | 29 + .../Classes/Button/ProductsButton.swift | 185 +++ .../REES46/Classes/Button/PromoCodeView.swift | 183 +++ .../REES46/Classes/Button/ReloadButton.swift | 31 + .../REES46/Classes/Button/StoryButton.swift | 132 ++ .../VideoDownloadManager.swift | 256 ++++ .../DownloadManager/VideoDownloadObject.swift | 24 + .../DownloadManager/VideoFileUtils.swift | 44 + .../Classes/Extensions/InitService.swift | 100 ++ .../NetworkStatusObserver.swift | 25 + .../NetworkStatusObserverUI.swift | 48 + .../NetworkConnectionStatus.swift | 6 + .../NetworkConnectionType.swift | 21 + .../NetworkRadioType.swift | 24 + .../Extensions/NetworkStatus/Navigation.swift | 34 + .../NetworkStatus/NetworkStatus.swift | 126 ++ .../NetworkStatus/SdkGlobalHelper.swift | 239 +++ .../ManagedViewConfig/ManagedViewConfig.swift | 63 + .../SettingsManageable.swift | 125 ++ .../ManagedViewConfig/ViewConfigPlain.swift | 46 + .../ManagedViewConfig/ViewConfigService.swift | 42 + .../PromocodeBanner/PromocodeBanner.swift | 174 +++ .../PromocodeBanner/SdkPopupAlertView.swift | 377 +++++ .../UIViewController+PromocodeBanner.swift | 149 ++ .../Coverable+UIKit.swift | 54 + .../PromocodeImagePlaceholder/Coverable.swift | 59 + .../LoadingPlaceholderView.swift | 211 +++ .../UIBezierPath+ImagePlaceholder.swift | 28 + .../RecommendationsStarsView.swift | 728 +++++++++ .../SdkConfiguration/SdkConfiguration.swift | 1333 +++++++++++++++++ .../RawRepresentable+FontInjector.swift | 22 + .../SdkFontInjector/SdkDynamicFont.swift | 15 + .../SdkFontInjector/SdkFontInjector.swift | 135 ++ .../SdkFontInjector/UIFont+FontInjector.swift | 64 + .../SdkFontInjector/UISdkWrapLabel.swift | 93 ++ .../SdkStyle/SdkApperanceViewScheme.swift | 13 + .../SdkConfiguration/SdkStyle/SdkStyle.swift | 180 +++ .../SdkStyleAdditional/FontFamily.swift | 96 ++ .../SdkStyleAdditional/SdkFontInstaller.swift | 34 + .../SdkStyleUIApplication.swift | 160 ++ .../UIFontDescriptorUsage.swift | 1 + .../SdkStyleColorScheme.swift | 65 + .../SdkStyleColorSchemeAwareView.swift | 192 +++ ...kStyleColorSchemeAwareViewController.swift | 145 ++ .../SdkStyleCustomColorScheme.swift | 14 + .../SdkStyleCustomColorSchemeAwareView.swift | 15 + ...CustomColorSchemeAwareViewController.swift | 5 + .../SdkStyleCustomFontSizeAwareView.swift | 5 + ...yleCustomFontSizeAwareViewController.swift | 34 + .../SdkStyleFonts/SdkStyleCustomFonts.swift | 18 + .../SessionQueue/GenericDataTask.swift | 54 + .../SessionQueue/RequestOperation.swift | 132 ++ .../SessionQueue/SdkQueryBuilder.swift | 17 + .../SessionDataTaskProtocol.swift | 25 + .../SessionQueue/SessionOperation.swift | 69 + .../SessionQueue/SessionQueue.swift | 99 ++ .../SessionQueue/URLSessionQueue.swift | 108 ++ .../StoriesImageLoader/Core/Disk.swift | 104 ++ .../StoriesImageLoader/Core/HashStorage.swift | 30 + .../StoriesImageLoader/Core/Loader.swift | 78 + .../StoriesImageLoader/Core/Operative.swift | 41 + .../StoriesImageLoader/Core/Option.swift | 13 + .../Core/SdkImageReloader.swift | 26 + .../Core/StoriesImageLoader.swift | 97 ++ .../Core/URLLiteralConvertible.swift | 29 + .../Extension/CGImageSource+ImageLoader.swift | 28 + .../Extension/Data+ImageLoader.swift | 43 + .../Extension/UIColor+Extension.swift | 24 + .../Extension/UIImage+ImageLoader.swift | 84 ++ .../Extension/UIImageView+ImageLoader.swift | 82 + .../StoryBlockImageCache.swift | 166 ++ .../CAPropertyAnimation+Key.swift | 19 + .../CGRect+Center.swift | 7 + .../CGSize+Min.swift | 7 + .../UIBezierPath+Circle.swift | 7 + .../StoriesPreload/SdkActivityIndicator.swift | 146 ++ .../StoriesSlideReloadIndicator.swift | 147 ++ .../Extensions/UserDefaultsExtension.swift | 63 + .../REES46/Classes/Model/CartItem.swift | 16 + .../REES46/Classes/Model/InitResponse.swift | 57 + .../Classes/Model/ProductsResponse.swift | 114 ++ .../Classes/Model/RecommendResponse.swift | 199 +++ .../REES46/Classes/Model/SearchResponse.swift | 287 ++++ .../REES46/REES46/Classes/Model/Stories.swift | 447 ++++++ .../REES46/Classes/Model/UserSettings.swift | 96 ++ .../REES46/Classes/NotificationService.swift | 294 ++++ .../REES46/Classes/PersonalizationSDK.swift | 310 ++++ .../REES46/Classes/Resources/Assets.swift | 1 + .../Resources/Assets.xcassets/Contents.json | 6 + .../angleDownBlack.imageset/Contents.json | 21 + .../angleDownBlack_1x.png | Bin 0 -> 2968 bytes .../angleDownWhite.imageset/Contents.json | 21 + .../angleDownWhite_1x.png | Bin 0 -> 1494 bytes .../angleUpBlack.imageset/Contents.json | 21 + .../angleUpBlack.imageset/angleUpBlack_1x.png | Bin 0 -> 2941 bytes .../angleUpWhite.imageset/Contents.json | 21 + .../angleUpWhite.imageset/angleUpWhite_1x.png | Bin 0 -> 1689 bytes .../iconCopyDark.imageset/Contents.json | 21 + .../iconCopyDark.imageset/iconCopyDark.png | Bin 0 -> 1162 bytes .../iconCopyLight.imageset/Contents.json | 21 + .../iconCopyLight.imageset/iconCopyLight.png | Bin 0 -> 1234 bytes .../iconError.imageset/Contents.json | 21 + .../iconError.imageset/iconError.png | Bin 0 -> 9326 bytes .../iconLikeHeartDark.imageset/Contents.json | 21 + .../iconLikeHeartDark.png | Bin 0 -> 1034 bytes .../Contents.json | 21 + .../iconLikeHeartFillDark.png | Bin 0 -> 2196 bytes .../Contents.json | 21 + .../iconLikeHeartFillLight.png | Bin 0 -> 2708 bytes .../iconLikeHeartLight.imageset/Contents.json | 21 + .../iconLikeHeartLight.png | Bin 0 -> 2593 bytes .../iconReload.imageset/Contents.json | 21 + .../iconReload.imageset/iconReload.png | Bin 0 -> 10146 bytes .../iconSearch.imageset/Contents.json | 22 + .../iconSearch.imageset/search@2x.png | Bin 0 -> 716 bytes .../iconSearch.imageset/search@3x.png | Bin 0 -> 2554 bytes .../iconSearchClose.imageset/Contents.json | 21 + .../iconSearchClose.png | Bin 0 -> 781 bytes .../iconStoryClose.imageset/Contents.json | 22 + .../iconStoryClose_1x.png | Bin 0 -> 2413 bytes .../iconStoryClose_2x.png | Bin 0 -> 2539 bytes .../iconStoryMute.imageset/Contents.json | 21 + .../iconStorySoundMute_1x.png | Bin 0 -> 3288 bytes .../iconStoryVolumeUp.imageset/Contents.json | 21 + .../iconStorySoundeVolumeUp_1x.png | Bin 0 -> 3775 bytes .../iconWebKitClose.imageset/Contents.json | 26 + .../iconWebKitClose_1x.png | Bin 0 -> 176 bytes .../iconWebKitClose_2x.png | Bin 0 -> 253 bytes .../iconWebKitClose_3x.png | Bin 0 -> 311 bytes .../StoriesCollectionViewPreviewCell.xib | 88 ++ .../REES46/Classes/Resources/StoriesView.xib | 53 + .../Resources/StoryCollectionViewCell.xib | 87 ++ .../NotificationHandlingService.swift | 17 + .../PushTokenNotificationService.swift | 10 + .../SubscriptionService.swift | 28 + .../ServiceProtocols/TrackingService.swift | 11 + .../NotificationHandlingServiceImpl.swift | 97 ++ .../PushTokenHandlerImpl.swift | 65 + .../PushTokenNotificationServiceImpl.swift | 40 + .../SubscriptionServiceImpl.swift | 245 +++ .../TrackServiceImpl.swift | 295 ++++ .../Classes/Shared/ColorExtensions.swift | 32 + .../Classes/SimplePersonalizationSDK.swift | 1272 ++++++++++++++++ .../StoriesCollectionViewPreviewCell.swift | 395 +++++ .../Data/ImageLoader.swift | 33 + .../Entities/ImageData.swift | 8 + .../ErrorHandler/ImageLoaderError.swift | 21 + .../UseCases/ImageLoading.swift | 6 + .../Views/SlideView.swift | 9 + .../Views/SlideViewController.swift | 142 ++ .../REES46/Classes/Stories/StoriesView.swift | 373 +++++ .../StoryCollectionViewCell.swift | 1124 ++++++++++++++ .../CarouselCollectionView.swift | 243 +++ .../CarouselCollectionViewCell.swift | 137 ++ .../ProductsCarousel/CarouselConstants.swift | 16 + .../RecommendationsWidgetConstants.swift | 10 + .../RecommendationsWidgetView.swift | 511 +++++++ .../RecommendationsWidgetViewCell.swift | 289 ++++ .../SearchWidget/SearchWidget.swift | 54 + .../SearchWidgetCategoriesButton.swift | 101 ++ .../SearchWidget/SearchWidgetDelegate.swift | 44 + .../SearchWidget/SearchWidgetExtension.swift | 18 + .../SearchWidgetHistoryButton.swift | 82 + .../SearchWidget/SearchWidgetListView.swift | 66 + .../SearchWidgetListViewCell.swift | 36 + .../SearchWidget/SearchWidgetMainView.swift | 186 +++ .../SearchWidget/SearchWidgetModel.swift | 8 + .../SearchWidgetObjectification.swift | 114 ++ .../SearchWidget/SearchWidgetTextField.swift | 79 + .../SearchWidget/SearchWidgetView.swift | 81 + .../SearchWidgetViewController.swift | 104 ++ .../StoryViewController.swift | 1131 ++++++++++++++ .../TBAppearanceConfiguration.swift | 32 + .../TBFontConfiguration.swift | 51 + .../TBTextConfiguration.swift | 36 + .../TexBlockConfiguration.swift | 14 + .../TextBlockView/TextBlockConstants.swift | 20 + .../Stories/TextBlockView/TextBlockView.swift | 54 + .../Stories/WebKit/RView_Extensions.swift | 37 + .../Stories/WebKit/RWebViewController.swift | 286 ++++ .../RWebViewController_Extensions.swift | 19 + .../events/RegisterNotification.swift | 48 + ...store-iosUITests-acknowledgements.markdown | 23 + ...mo-store-iosUITests-acknowledgements.plist | 29 + ...ts-frameworks-Debug-input-files.xcfilelist | 2 + ...s-frameworks-Debug-output-files.xcfilelist | 1 + ...-frameworks-Release-input-files.xcfilelist | 2 + ...frameworks-Release-output-files.xcfilelist | 1 + ...re-ios-demo-store-iosUITests-frameworks.sh | 186 +++ ...e-ios-demo-store-iosUITests.debug.xcconfig | 7 + ...ios-demo-store-iosUITests.release.xcconfig | 7 + .../Pods-demo-store-ios-Info.plist | 2 - ...s-demo-store-ios-acknowledgements.markdown | 23 + ...Pods-demo-store-ios-acknowledgements.plist | 29 + ...os-frameworks-Debug-input-files.xcfilelist | 2 + ...s-frameworks-Debug-output-files.xcfilelist | 1 + ...-frameworks-Release-input-files.xcfilelist | 2 + ...frameworks-Release-output-files.xcfilelist | 1 + .../Pods-demo-store-ios-frameworks.sh | 186 +++ .../Pods-demo-store-ios.debug.xcconfig | 7 + .../Pods-demo-store-ios.release.xcconfig | 7 + .../Pods-demo-store-iosTests.debug.xcconfig | 3 + .../Pods-demo-store-iosTests.release.xcconfig | 3 + .../REES46/REES46-Info.plist | 26 + .../REES46/REES46-dummy.m | 5 + .../REES46/REES46-prefix.pch | 12 + .../REES46/REES46-umbrella.h | 16 + .../REES46/REES46.debug.xcconfig | 14 + .../REES46/REES46.modulemap | 6 + .../REES46/REES46.release.xcconfig | 14 + README.md | 31 +- demo-store-ios.xcodeproj/project.pbxproj | 134 +- .../xcschemes/xcschememanagement.plist | 2 +- demo-store-ios/AppDelegate.swift | 43 + .../{features/splash => }/ContentView.swift | 0 demo-store-ios/DemoStoreApp.swift | 3 + 222 files changed, 20363 insertions(+), 242 deletions(-) create mode 100644 Pods/Local Podspecs/REES46.podspec.json create mode 100644 Pods/REES46/LICENSE create mode 100644 Pods/REES46/README.md create mode 100644 Pods/REES46/REES46/Classes/Button/ProductsButton.swift create mode 100644 Pods/REES46/REES46/Classes/Button/PromoCodeView.swift create mode 100644 Pods/REES46/REES46/Classes/Button/ReloadButton.swift create mode 100644 Pods/REES46/REES46/Classes/Button/StoryButton.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/InitService.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/NetworkStatus/Navigation.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift create mode 100755 Pods/REES46/REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift create mode 100755 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift create mode 100755 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/RecommendationsStars/RecommendationsStarsView.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SessionQueue/RequestOperation.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionOperation.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionQueue.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift create mode 100644 Pods/REES46/REES46/Classes/Extensions/UserDefaultsExtension.swift create mode 100644 Pods/REES46/REES46/Classes/Model/CartItem.swift create mode 100644 Pods/REES46/REES46/Classes/Model/InitResponse.swift create mode 100644 Pods/REES46/REES46/Classes/Model/ProductsResponse.swift create mode 100644 Pods/REES46/REES46/Classes/Model/RecommendResponse.swift create mode 100644 Pods/REES46/REES46/Classes/Model/SearchResponse.swift create mode 100644 Pods/REES46/REES46/Classes/Model/Stories.swift create mode 100644 Pods/REES46/REES46/Classes/Model/UserSettings.swift create mode 100644 Pods/REES46/REES46/Classes/NotificationService.swift create mode 100644 Pods/REES46/REES46/Classes/PersonalizationSDK.swift create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.swift create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownBlack.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownBlack.imageset/angleDownBlack_1x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownWhite.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownWhite.imageset/angleDownWhite_1x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpBlack.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpBlack.imageset/angleUpBlack_1x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpWhite.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpWhite.imageset/angleUpWhite_1x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconCopyDark.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconCopyDark.imageset/iconCopyDark.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconCopyLight.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconCopyLight.imageset/iconCopyLight.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconError.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconError.imageset/iconError.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartDark.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartDark.imageset/iconLikeHeartDark.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillDark.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillDark.imageset/iconLikeHeartFillDark.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillLight.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillLight.imageset/iconLikeHeartFillLight.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartLight.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartLight.imageset/iconLikeHeartLight.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconReload.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconReload.imageset/iconReload.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearch.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearch.imageset/search@2x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearch.imageset/search@3x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearchClose.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearchClose.imageset/iconSearchClose.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/iconStoryClose_1x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/iconStoryClose_2x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryMute.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryMute.imageset/iconStorySoundMute_1x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryVolumeUp.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryVolumeUp.imageset/iconStorySoundeVolumeUp_1x.png create mode 100755 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/Contents.json create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/iconWebKitClose_1x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/iconWebKitClose_2x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/iconWebKitClose_3x.png create mode 100644 Pods/REES46/REES46/Classes/Resources/StoriesCollectionViewPreviewCell.xib create mode 100644 Pods/REES46/REES46/Classes/Resources/StoriesView.xib create mode 100644 Pods/REES46/REES46/Classes/Resources/StoryCollectionViewCell.xib create mode 100644 Pods/REES46/REES46/Classes/ServiceProtocols/NotificationHandlingService.swift create mode 100644 Pods/REES46/REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift create mode 100644 Pods/REES46/REES46/Classes/ServiceProtocols/SubscriptionService.swift create mode 100644 Pods/REES46/REES46/Classes/ServiceProtocols/TrackingService.swift create mode 100644 Pods/REES46/REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift create mode 100644 Pods/REES46/REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift create mode 100644 Pods/REES46/REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift create mode 100644 Pods/REES46/REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift create mode 100644 Pods/REES46/REES46/Classes/ServicesImplementation/TrackServiceImpl.swift create mode 100644 Pods/REES46/REES46/Classes/Shared/ColorExtensions.swift create mode 100644 Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoriesView.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift create mode 100755 Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift create mode 100755 Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift create mode 100755 Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift create mode 100755 Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift create mode 100755 Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift create mode 100755 Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetModel.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetObjectification.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/StoryViewController/StoryViewController.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockView.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/WebKit/RView_Extensions.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/WebKit/RWebViewController.swift create mode 100644 Pods/REES46/REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift create mode 100644 Pods/REES46/REES46/Classes/services/notification/events/RegisterNotification.swift create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist create mode 100755 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist create mode 100755 Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh create mode 100644 Pods/Target Support Files/REES46/REES46-Info.plist create mode 100644 Pods/Target Support Files/REES46/REES46-dummy.m create mode 100644 Pods/Target Support Files/REES46/REES46-prefix.pch create mode 100644 Pods/Target Support Files/REES46/REES46-umbrella.h create mode 100644 Pods/Target Support Files/REES46/REES46.debug.xcconfig create mode 100644 Pods/Target Support Files/REES46/REES46.modulemap create mode 100644 Pods/Target Support Files/REES46/REES46.release.xcconfig create mode 100644 demo-store-ios/AppDelegate.swift rename demo-store-ios/{features/splash => }/ContentView.swift (100%) diff --git a/Podfile b/Podfile index b37a78c..0b0e391 100644 --- a/Podfile +++ b/Podfile @@ -3,7 +3,6 @@ platform :ios, '12.0' target 'demo-store-ios' do use_frameworks! - # Добавьте ваш SDK pod 'REES46', :git => 'https://github.com/rees46/ios-sdk.git', :branch => 'master', :tag => '3.6.19' target 'demo-store-iosTests' do diff --git a/Podfile.lock b/Podfile.lock index 34b0f0c..d15d479 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,3 +1,24 @@ -PODFILE CHECKSUM: 149d4084f0a926e30c6011e52f5111014f15474e +PODS: + - REES46 (3.6.19) + +DEPENDENCIES: + - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) + +EXTERNAL SOURCES: + REES46: + :branch: master + :git: https://github.com/rees46/ios-sdk.git + :tag: 3.6.19 + +CHECKOUT OPTIONS: + REES46: + :commit: a7dc0ba52750cc671ff34e5cbf52b98b0aae61d9 + :git: https://github.com/rees46/ios-sdk.git + :tag: 3.6.19 + +SPEC CHECKSUMS: + REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb + +PODFILE CHECKSUM: 4ac57bdcddb3e4b10f017054225582e9a1d32920 COCOAPODS: 1.15.2 diff --git a/Pods/Local Podspecs/REES46.podspec.json b/Pods/Local Podspecs/REES46.podspec.json new file mode 100644 index 0000000..f831106 --- /dev/null +++ b/Pods/Local Podspecs/REES46.podspec.json @@ -0,0 +1,31 @@ +{ + "name": "REES46", + "version": "3.6.19", + "summary": "REES46 SDK for iOS platform - the wide toolset for eCommerce apps. This SDK can be used to integrate in your own app for iOS in few steps.", + "readme": "https://reference.api.rees46.com/#{spec.version.to_s}/README.md", + "description": "REES46 SDK for iOS platform - the wide toolset for eCommerce apps:\n\n- Personalization engine.\n- Product recommendations.\n- Personalized products search engine.\n- Bulk emails, push-notifications, SMS and Telegram messages.\n- Transactional emails, push-notifications, Telegram and SMS.\n- Drip campaigns (email, push, Telegram, SMS).\n- Customizable on-site popups.\n- CRM, CDP and customer segments.\n- Net Promoter Score tool for any goal.\n- Stories.\n- In-app push.\n- Loyalty program.\n\nYou can integrate all REES46 tools into your iOS app.", + "homepage": "https://reference.api.rees46.com/", + "social_media_url": "https://rees46.com/", + "license": { + "type": "MIT", + "file": "LICENSE" + }, + "authors": { + "REES46": "«desk@rees46.com»" + }, + "screenshots": [ + "https://rees46.com/static-images/cocoapods/r46_ios_sdk_cocoapods_cover.png" + ], + "source": { + "git": "https://github.com/rees46/ios-sdk.git", + "branch": "master", + "tag": "3.6.19" + }, + "platforms": { + "ios": "12.0" + }, + "source_files": "REES46/Classes/**/*.{swift}", + "resources": "REES46/Classes/Resources/*.{xcassets,xib,storyboard,json,png}", + "swift_versions": "5", + "swift_version": "5" +} diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 34b0f0c..d15d479 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,3 +1,24 @@ -PODFILE CHECKSUM: 149d4084f0a926e30c6011e52f5111014f15474e +PODS: + - REES46 (3.6.19) + +DEPENDENCIES: + - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) + +EXTERNAL SOURCES: + REES46: + :branch: master + :git: https://github.com/rees46/ios-sdk.git + :tag: 3.6.19 + +CHECKOUT OPTIONS: + REES46: + :commit: a7dc0ba52750cc671ff34e5cbf52b98b0aae61d9 + :git: https://github.com/rees46/ios-sdk.git + :tag: 3.6.19 + +SPEC CHECKSUMS: + REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb + +PODFILE CHECKSUM: 4ac57bdcddb3e4b10f017054225582e9a1d32920 COCOAPODS: 1.15.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 4ca0012..bd1cf68 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,73 +7,390 @@ objects = { /* Begin PBXBuildFile section */ - 0EB01A16DB7BF09F43A06760CAAD7AF5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - 2ED0D7AE2F2531563EBC0135C853AE8E /* Pods-demo-store-iosTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2820D7576E9D83DD79F820940F214CDF /* Pods-demo-store-iosTests-dummy.m */; }; - 4CF839B5325FB3ACF72D843CFF091251 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 000B92572AB3BA2EF78F29FC06720F72 /* FontFamily.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */; }; + 00E4A44ED57BE79A80742EFB71221A8F /* Coverable+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */; }; + 0334759C415B8CF146E61AB99FE69227 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */; }; + 03FFFE029584CC21DD2FDC4369224B1E /* NotificationHandlingServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */; }; + 05438BA0424A6EACD940A12BADEA800A /* UIFont+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */; }; + 05921ED246B06FE8677425ED82B6C032 /* TBTextConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */; }; + 077CADF6F924345A3E25E7D7003BBD5E /* URLSessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */; }; + 091DF2ED562F9F9107EF807638E22662 /* SearchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */; }; + 0CFFB84337D831CA8EF3617D7DB3772E /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A791B748A86BE064FA80C12134F8E728 /* Loader.swift */; }; + 0F50D04988DAEFAB5D74706EE6591588 /* StoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */; }; + 1016ABA1F6A6BFBDE0EA9FC87B86A858 /* ViewConfigService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */; }; + 13EAE9F36834227AC6603F76D54DD1D4 /* SlideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */; }; + 14242A0D3156633A69FB084B10C60EDB /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */; }; + 14D4D1A202CB5C785E18D2ED9A93F81D /* StoriesSlideReloadIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */; }; + 155C4149B624787E4BAAA07B1D4EBD39 /* REES46-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */; }; + 18BA7C889427497D1A009D85662C46CE /* SdkGlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */; }; + 1905EBF3E70183BFC8580F3819F692CC /* NotificationHandlingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */; }; + 19FF735430577E28E963D72D58DF655C /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFC11AC8252C36F4B476D4E56652E41 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1B6FDB2F5513BFAA3FB1BB1B851B236F /* SdkImageReloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */; }; + 1C778D789F4B0897A6037CB978826072 /* RecommendResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */; }; + 1D0FCF6225378C95A3246107F648C538 /* TexBlockConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */; }; + 1DABF66E97AD95FCF260BA3176E86685 /* TrackingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */; }; + 1E35871E2E937C15DD42093DF742998B /* RecommendationsWidgetViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */; }; + 1F215B81847B4CD4B36342CE793CF473 /* RegisterNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */; }; + 20AED63279F202C3174FE802C696B9A1 /* VideoDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */; }; + 20FBF01A41A066522B5DEDF65AE31666 /* SearchWidgetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */; }; + 210280AA598517CF989A582413B25FCB /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */; }; + 216F659702FE03B7987F7AE153DC0185 /* ColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */; }; + 217043CCF240C170FBA603D1CD39C65A /* TrackServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */; }; + 21A6687D0BA31E63C8800D2C9F20CC70 /* ImageLoaderError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */; }; + 246ABC711084B7E4CC7B4A27989AB69E /* PushTokenNotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */; }; + 24A6C06C7F607033FE51591F7D66A682 /* SdkStyleCustomColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */; }; + 2868EA3EDB5D52CB4B54C1C280421595 /* StoriesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */; }; + 289E24AFFFBE57287ADD4AB22F17A4B9 /* SdkDynamicFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */; }; + 28F8EF2658BA628CA99983594C415D09 /* RecommendationsWidgetConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */; }; + 2A3ACC61257E4E88DE782C3CD1BC0CCE /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C82152B76290FC32122F96E2333F17 /* Assets.swift */; }; + 2D32B1BFDFC57E7BAFF6B73C30F42DFC /* NetworkStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */; }; + 2ED0D7AE2F2531563EBC0135C853AE8E /* Pods-demo-store-iosTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FB9E93A5A045ADF557378B54D551DDE /* Pods-demo-store-iosTests-dummy.m */; }; + 34EF675DD2AB530F8C16D96F7D198E33 /* RecommendationsWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */; }; + 3726922467DD0501527002C0C31278E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 3728D15DC1AE882F703003FDF14D52F0 /* SdkStyleColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */; }; + 38AFD9246E6995657D1EDE99EBC6CEE5 /* RWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */; }; + 39AE9A2AD1B349F39699B3578E56BF00 /* SdkStyleCustomColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */; }; + 3C0BFC786BED0FA23523678B73728154 /* RWebViewController_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */; }; + 41822CFDBD9C86FB87B351EBFEC58073 /* ProductsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */; }; + 41CC97B0C6B55C160191247F4CF2D8ED /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C58E5652FE52EBEEC8CFECDDAB7690EA /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */; }; + 42C4319E1A92EB4B2BB51E51D1E14D1F /* SdkQueryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */; }; + 44D5997FBA69F54DF6D3B0D068C7953D /* ImageLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */; }; + 44E68CF722456B675ABF6D715C514AC6 /* SdkStyleCustomFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */; }; + 45EB33BB9930BD56B2C0E09F8F7598DE /* VideoDownloadObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */; }; + 469C92E04B9D2D4F8392EE02C7A39C69 /* Pods-demo-store-ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C72C00B34C83096ED3147E8AAAD8EAE /* Pods-demo-store-ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 46DCEDA235C161852B926A0EF943EACC /* Data+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */; }; + 473ABA01905DAFFF8D07DEB476A9D75D /* SdkStyleCustomFontSizeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */; }; + 48A2019E7B6882B3B0C6BFF5A49E2C24 /* StoryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */; }; + 49DEB29E8A22D8F5F67907D19A906F18 /* SearchWidgetTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */; }; + 4CBB873363589E883524864FFBFE17D2 /* CarouselConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */; }; + 4DF1CC4FC7EAEB5C38F32AA1C39C5A07 /* PushTokenHandlerImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */; }; + 53758A7E257766681ECCDFEE4288C35D /* UIFontDescriptorUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */; }; + 53FD279BE6D27EC46BF71734B84F51A8 /* SearchWidgetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */; }; + 56369E2C8C8213D51A72552106A9C264 /* ImageData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */; }; + 56B8E8C41883E4FC7F171F62949E04BD /* SdkStyleCustomColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */; }; + 5A234484C926A75BA80099AEC8CC4611 /* SearchWidgetObjectification.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */; }; + 5DCEC664244099368ABFA62172F815C6 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */; }; + 5E8FB1E21260A9D830B33A759E4627F6 /* UIViewController+PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */; }; + 6447E67AD574E06A2B69690B0B29BC89 /* SdkActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */; }; + 66724EBA9152FA748810F92BAF9F80DC /* SubscriptionServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */; }; + 681A5A71427454B12747295ECDD0D24C /* NetworkRadioType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */; }; + 6DEFEFA0016D535ADBAD7B823B156E7D /* SdkFontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */; }; + 6E6B81FC768C9444F194B10B259FA696 /* SdkStyleUIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */; }; + 71A9026CA64F36A0A121DD4060BB5BB9 /* PushTokenNotificationServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */; }; + 71CDDF6B42C2D0D1CC5A94AB0BE99E23 /* UIBezierPath+Circle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */; }; + 72A17042882104723E9CA92A14D80CC1 /* URLLiteralConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */; }; + 73BBCA8BA8E0D143006C01813759AC18 /* SdkStyleColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */; }; + 78AF773DEA2008B6FE70C40246E48D18 /* TBAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */; }; 79D2610CEAF017AD0332D7F90672483A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - 7A60842F1082CDF4F04C7DE464416B35 /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 73948AC430BD554A737110C5CCBDF88A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */; }; - 834C14FE5447464523181F2F002D63FE /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 000794A532A447E20C7175D1D5724A31 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9E2500E6DDD2ADAF4D773649B7A360C9 /* Pods-demo-store-iosTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 77437148103FBD547B6ACA0E29028AF1 /* Pods-demo-store-iosTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF78F329D56E1C5D0A0B83A5D9E03EED /* Pods-demo-store-ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CF521C1E5BEF75F11F75D3EF1212D499 /* Pods-demo-store-ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DFFF30C2EB16C41D21FC724DC7E4AB43 /* Pods-demo-store-ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D87EF1D4E9B9A3D0F6FA34800AB6F48 /* Pods-demo-store-ios-dummy.m */; }; + 7B10C150677B6261882D5C0C1297F00F /* StoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */; }; + 7CA7335FA31F5B8BF6A8FFA433CEE3AE /* CGSize+Min.swift in Sources */ = {isa = PBXBuildFile; fileRef = F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */; }; + 7EB26E79BA128D1E2F994D902036286C /* SearchWidgetListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */; }; + 81091327D041DE2EDC26B207E3584D0E /* UIBezierPath+ImagePlaceholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */; }; + 835A6430B8B241FF5E042D4415103DDD /* RView_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */; }; + 8AE54E966BB7B8583BF5B5BD952BDF0A /* UIImageView+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */; }; + 8B15040F27C854C43BE632FB8D86B683 /* TextBlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */; }; + 8BACD88871220B13AB285BC476A7F194 /* StoryCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */; }; + 8C1057083C31FF842CEEEF864911D1A4 /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */; }; + 8CE4BF9FB621CF956CB6262F53B07C83 /* NetworkStatusObserverUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */; }; + 8D05D7544E96EB065022900C06BD8BDA /* ReloadButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */; }; + 8D50E5745C533C21E8EAE239F4E59FC3 /* PromoCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */; }; + 90547932EA32076C22D800BDAD445A1F /* SearchWidgetCategoriesButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */; }; + 92E5F181D61E15ACB5931E80F5DDBBDB /* Stories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */; }; + 93C9B6D59CF164493225BB90330ED9CB /* SubscriptionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */; }; + 9550440BCB953E622CC97EFB797E3C07 /* StoriesImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */; }; + 9653EFA6AC3DDF7D0F90B549C485C9F9 /* RequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */; }; + 96F98929440C537CC83107C3747D6480 /* CarouselCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */; }; + 9997384531CF394E13FCDB94F6354C9A /* SessionDataTaskProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */; }; + 99B5996FC38567CF3ED494041F3E3BF1 /* Operative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */; }; + 9D19EE689D681F8493419C2CA1FB6D5E /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */; }; + 9E2500E6DDD2ADAF4D773649B7A360C9 /* Pods-demo-store-iosTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E23C6A0C21CCDEEED0DAC1168FC8DE30 /* Pods-demo-store-iosTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A09249CC7461C9EC873C4AB82C16124B /* SdkFontInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */; }; + A150E969EA20BF59B3CF070A4240F180 /* HashStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */; }; + A1BE35C271D2217C0B4232D0AB0C8DA3 /* StoriesCollectionViewPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */; }; + A20FF0BB2984AC66216074B1EFBE8F98 /* RawRepresentable+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */; }; + A2D682E7527D83413A35CA870AF7B766 /* SdkApperanceViewScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */; }; + A5234B6659FC63CB96F6BC93C9D05DB7 /* SimplePersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */; }; + A84F0846ABE5B8D3E87FB73531F706A4 /* LoadingPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */; }; + A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A969E1ACC2EEF44464751BAB8DEB684E /* InitResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */; }; + ABCFB3FD321DE180968A5A0B2BB86A62 /* StoriesCollectionViewPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */; }; + AC146C49CFAC1C9EBDB2BAAF57FDD984 /* SettingsManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */; }; + AE87C2623409B5C7F73B12649F5B26E5 /* UIImage+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */; }; + AEB0C53C27CB087C3215538B6F476A33 /* CartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */; }; + B08BD0363F34B4423E46FDBAB017A26C /* VideoFileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */; }; + B14B39DD5BE9A500B163EE27C544AA2B /* CAPropertyAnimation+Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */; }; + B1FF3AA160C3354557A6B38A48756E98 /* Pods-demo-store-ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 37529AFAE21E524BB5CF8528DBDBFF62 /* Pods-demo-store-ios-dummy.m */; }; + B29CDD67B86238DFC22CB13179C4DAAA /* PersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */; }; + B2C4ADFF7916C0CA794767779FCF79D6 /* CGRect+Center.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */; }; + B3768606656AAEE8FE776B7A823030B1 /* Coverable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */; }; + B3C75BB3596FA47232F49322F2851860 /* SearchWidgetDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */; }; + B4C27A1D9F4EC266C766251289AA689E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + B56C23C1C826628465D0881A71FC3346 /* SearchWidgetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */; }; + B886B2522D2C093BBCE9844BBC2A84AE /* ViewConfigPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */; }; + BA66BD722D1029DB90B91889AE435938 /* SdkStyleColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */; }; + BBCDC6622412DD3C491775830A55FE4D /* RecommendationsStarsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */; }; + BD49D731800904B988C8A771E0C1A9CC /* SdkStyleCustomFontSizeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */; }; + BF0485F5C192F225E4B519B7F2793DFC /* NetworkConnectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */; }; + BFC831FD30B89FC45404A6CBC78D2BEA /* NetworkConnectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */; }; + BFD7143593CAF751E9C8344B20488F31 /* UISdkWrapLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */; }; + C204C6976B8B9ACE9797F222AA6ECCA5 /* GenericDataTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */; }; + C3B214337422238B6F16DDD4D83FE86A /* SearchWidgetMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */; }; + C800B58B3331444C8BB27C4F89D2CE44 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */; }; + C88C545BF7521C369D2602C552A551A8 /* TextBlockConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */; }; + C9042F117FB2359CFFAE2A484BCAD759 /* SearchWidgetHistoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */; }; + CEDD87245EDA33E6EED478D04CFF3863 /* SdkConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */; }; + D0925D984A33493CBD8748EF9A3B91D3 /* Option.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */; }; + D0A994B97078D246BFD4805C729AC6FC /* SearchWidgetListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */; }; + D0D410CA575CE4E459381557FDEFA3A5 /* StoryBlockImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */; }; + D9B862FA4640C84B16DF0E2AF96459D3 /* TBFontConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */; }; + DA38244A91BEB77E42BD4F150B807505 /* ManagedViewConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */; }; + DEB27EE51D09D55258D69927B56120DB /* InitService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */; }; + E0B0ED3036DA4A0A5A0CA0FD17D1B9DF /* SessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */; }; + E0D9CD065B64C0D661B5FD42FEB79918 /* SdkStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */; }; + E385668DBCD81215689D1543C955E46A /* SdkPopupAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */; }; + E49668B0B739D147E3414D17D4A0BA0E /* SearchWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */; }; + E761A05087F0E09F0DC407500FEE98E2 /* ProductsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */; }; + E7E128BBA990CA16D6C7D2E12C7451B3 /* CGImageSource+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */; }; + E9CC56086B144A2A4193EF27C59F6FB1 /* CarouselCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */; }; + ED9F4F1DEDFDBEFCD5E129DA9755A705 /* PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */; }; + F38F22B4A2A822E5BC40C664C5943FB9 /* Disk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */; }; + F5AB8C4608DCCA8557A248A0EF9D3571 /* NetworkStatusObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */; }; + F685A237C47426370D2AC2956285C3E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + F6DEE3FA2EF0113730454100EEE86756 /* StoriesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */; }; + F83B27F3BA95658EAD242D8EC0FF4C91 /* SlideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */; }; + FA8B5D62D1F65F6083B7FF811EB32EBB /* SearchWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */; }; + FF76EE2CCAF3321D9F471F7D3BC05971 /* SessionOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 5F88B7735B116F009987088762EC7F2F /* PBXContainerItemProxy */ = { + 40C2C9959393295F1B86C75B81551CC4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 80CA65F514DD5B1DC5829F29295F6292; remoteInfo = "Pods-demo-store-ios"; }; + 97FD9F25B8F6CE6ACEDF790C858E79E0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0C03A6912D025B497528F2C7FFE2F1D5; + remoteInfo = REES46; + }; + DCDA243612AE8D7094728CC593FF8178 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0C03A6912D025B497528F2C7FFE2F1D5; + remoteInfo = REES46; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 000794A532A447E20C7175D1D5724A31 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-demo-store-iosUITests-umbrella.h"; sourceTree = ""; }; - 0D8535F146F9398315EBFC5555887E37 /* Pods-demo-store-ios-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-Info.plist"; sourceTree = ""; }; - 2820D7576E9D83DD79F820940F214CDF /* Pods-demo-store-iosTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-iosTests-dummy.m"; sourceTree = ""; }; - 3FA3CB90DCB86363A419F3791B7B3A34 /* Pods-demo-store-iosTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-iosTests.modulemap"; sourceTree = ""; }; + 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromoCodeView.swift; path = REES46/Classes/Button/PromoCodeView.swift; sourceTree = ""; }; + 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionServiceImpl.swift; path = REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift; sourceTree = ""; }; + 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInstaller.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift; sourceTree = ""; }; + 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLSessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift; sourceTree = ""; }; + 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigService.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift; sourceTree = ""; }; + 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkRadioType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift; sourceTree = ""; }; + 0BB49B831AF796BFD54D280D4E950744 /* Pods-demo-store-iosTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-Info.plist"; sourceTree = ""; }; + 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadManager.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift; sourceTree = ""; }; + 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Option.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift; sourceTree = ""; }; + 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesImageLoader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift; sourceTree = ""; }; + 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageData.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift; sourceTree = ""; }; + 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesView.swift; path = REES46/Classes/Stories/StoriesView.swift; sourceTree = ""; }; + 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CartItem.swift; path = REES46/Classes/Model/CartItem.swift; sourceTree = ""; }; + 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadingPlaceholderView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift; sourceTree = ""; }; + 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenericDataTask.swift; path = REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift; sourceTree = ""; }; + 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromocodeBanner.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift; sourceTree = ""; }; + 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryBlockImageCache.swift; path = REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift; sourceTree = ""; }; + 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkDynamicFont.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift; sourceTree = ""; }; + 1B85BF16297242DA531FC69E93CF9CA5 /* Pods-demo-store-ios-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-Info.plist"; sourceTree = ""; }; + 1C72C00B34C83096ED3147E8AAAD8EAE /* Pods-demo-store-ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-umbrella.h"; sourceTree = ""; }; + 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetMainView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift; sourceTree = ""; }; + 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockView.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockView.swift; sourceTree = ""; }; + 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFonts.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift; sourceTree = ""; }; + 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift; sourceTree = ""; }; + 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesSlideReloadIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift; sourceTree = ""; }; + 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitResponse.swift; path = REES46/Classes/Model/InitResponse.swift; sourceTree = ""; }; + 240A79C469C0F6595705D16927F498E9 /* REES46-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-prefix.pch"; sourceTree = ""; }; + 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleUIApplication.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift; sourceTree = ""; }; + 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SimplePersonalizationSDK.swift; path = REES46/Classes/SimplePersonalizationSDK.swift; sourceTree = ""; }; + 2A71319F6A963531ACFFF30BCBC6DDB2 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; + 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Extension.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift"; sourceTree = ""; }; + 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetHistoryButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift; sourceTree = ""; }; + 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift; sourceTree = ""; }; + 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stories.swift; path = REES46/Classes/Model/Stories.swift; sourceTree = ""; }; + 2E74AC7CFF2C91899A037B82C869DB0A /* Pods-demo-store-ios-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-acknowledgements.markdown"; sourceTree = ""; }; + 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift; sourceTree = ""; }; + 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift; sourceTree = ""; }; + 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetConstants.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift; sourceTree = ""; }; + 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesView.xib; path = REES46/Classes/Resources/StoriesView.xib; sourceTree = ""; }; + 2FB9E93A5A045ADF557378B54D551DDE /* Pods-demo-store-iosTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-iosTests-dummy.m"; sourceTree = ""; }; + 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift"; sourceTree = ""; }; + 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/SessionQueue.swift; sourceTree = ""; }; + 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift; sourceTree = ""; }; + 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsButton.swift; path = REES46/Classes/Button/ProductsButton.swift; sourceTree = ""; }; + 3433BC654811C432BEF5CB32AAF90EFB /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; + 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesCollectionViewPreviewCell.xib; path = REES46/Classes/Resources/StoriesCollectionViewPreviewCell.xib; sourceTree = ""; }; + 3671B3C220D01E22000CF41146C2B4AB /* REES46 */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = REES46; path = REES46.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIFont+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift"; sourceTree = ""; }; + 37529AFAE21E524BB5CF8528DBDBFF62 /* Pods-demo-store-ios-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-dummy.m"; sourceTree = ""; }; + 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationService.swift; path = REES46/Classes/NotificationService.swift; sourceTree = ""; }; + 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserver.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift; sourceTree = ""; }; + 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReloadButton.swift; path = REES46/Classes/Button/ReloadButton.swift; sourceTree = ""; }; + 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift; sourceTree = ""; }; + 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkConfiguration.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift; sourceTree = ""; }; + 4566A7EDA1E302A996738A3E6923BB76 /* Pods-demo-store-ios-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-acknowledgements.plist"; sourceTree = ""; }; + 48D43AAA52FE567ADF7FABD5AD0D1218 /* Pods-demo-store-iosTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-iosTests.modulemap"; sourceTree = ""; }; + 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBFontConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift; sourceTree = ""; }; + 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidget.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift; sourceTree = ""; }; + 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingService.swift; path = REES46/Classes/ServiceProtocols/NotificationHandlingService.swift; sourceTree = ""; }; + 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disk.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift; sourceTree = ""; }; + 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RView_Extensions.swift; path = REES46/Classes/Stories/WebKit/RView_Extensions.swift; sourceTree = ""; }; + 4DF8AECAEC072703693B3E3E2C4B83C5 /* Pods-demo-store-ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios.modulemap"; sourceTree = ""; }; + 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoading.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift; sourceTree = ""; }; + 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkImageReloader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift; sourceTree = ""; }; + 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInjector.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift; sourceTree = ""; }; + 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackingService.swift; path = REES46/Classes/ServiceProtocols/TrackingService.swift; sourceTree = ""; }; 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-iosTests"; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 541C246A0AE79A1CC820CFF87F6B0BC6 /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; - 5D87EF1D4E9B9A3D0F6FA34800AB6F48 /* Pods-demo-store-ios-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-dummy.m"; sourceTree = ""; }; - 5DB4BE39384F4CAFB6BEED58E43B9E6D /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; + 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIFontDescriptorUsage.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift; sourceTree = ""; }; + 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetViewController.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift; sourceTree = ""; }; + 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TexBlockConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift; sourceTree = ""; }; + 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Coverable+UIKit.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift"; sourceTree = ""; }; + 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift; sourceTree = ""; }; + 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBAppearanceConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift; sourceTree = ""; }; + 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationService.swift; path = REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift; sourceTree = ""; }; + 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegisterNotification.swift; path = REES46/Classes/services/notification/events/RegisterNotification.swift; sourceTree = ""; }; + 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetModel.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetModel.swift; sourceTree = ""; }; + 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitService.swift; path = REES46/Classes/Extensions/InitService.swift; sourceTree = ""; }; + 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserDefaultsExtension.swift; path = REES46/Classes/Extensions/UserDefaultsExtension.swift; sourceTree = ""; }; + 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoryCollectionViewCell.xib; path = REES46/Classes/Resources/StoryCollectionViewCell.xib; sourceTree = ""; }; + 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationServiceImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift; sourceTree = ""; }; + 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionOperation.swift; path = REES46/Classes/Extensions/SessionQueue/SessionOperation.swift; sourceTree = ""; }; + 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift; sourceTree = ""; }; + 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetViewCell.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift; sourceTree = ""; }; + 6FEE741AF14146505421E6B9B790997B /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; + 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+Circle.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift"; sourceTree = ""; }; + 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListViewCell.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift; sourceTree = ""; }; + 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkApperanceViewScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift; sourceTree = ""; }; + 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackServiceImpl.swift; path = REES46/Classes/ServicesImplementation/TrackServiceImpl.swift; sourceTree = ""; }; 73010CC983E3809BECEE5348DA1BB8C6 /* 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; }; - 73948AC430BD554A737110C5CCBDF88A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-demo-store-iosUITests-dummy.m"; sourceTree = ""; }; - 77437148103FBD547B6ACA0E29028AF1 /* Pods-demo-store-iosTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-iosTests-umbrella.h"; sourceTree = ""; }; + 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift; sourceTree = ""; }; + 76DEAE9E95F151F7D441B0550C8E10B5 /* Pods-demo-store-ios-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-store-ios-frameworks.sh"; sourceTree = ""; }; + 774742885C515AA49BD28EF3648BA370 /* Pods-demo-store-iosTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-acknowledgements.plist"; sourceTree = ""; }; + 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingServiceImpl.swift; path = REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift; sourceTree = ""; }; + 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift"; sourceTree = ""; }; + 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryViewController.swift; path = REES46/Classes/Stories/StoryViewController/StoryViewController.swift; sourceTree = ""; }; + 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkGlobalHelper.swift; path = REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift; sourceTree = ""; }; + 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift; sourceTree = ""; }; + 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockConstants.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift; sourceTree = ""; }; + 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselConstants.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift; sourceTree = ""; }; + 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController.swift; path = REES46/Classes/Stories/WebKit/RWebViewController.swift; sourceTree = ""; }; + 7EED3A4B574EFEBB9FC4A320FC64352D /* REES46.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = REES46.modulemap; sourceTree = ""; }; + 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigPlain.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift; sourceTree = ""; }; + 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operative.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift; sourceTree = ""; }; + 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Navigation.swift; path = REES46/Classes/Extensions/NetworkStatus/Navigation.swift; sourceTree = ""; }; 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios-demo-store-iosUITests"; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 99F2681231E62574920A23BBA1BE7657 /* Pods-demo-store-ios-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-acknowledgements.plist"; sourceTree = ""; }; - 9C56376A1E36CAF7BE077F7B9A6C7C80 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist"; sourceTree = ""; }; + 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsManageable.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift; sourceTree = ""; }; + 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchResponse.swift; path = REES46/Classes/Model/SearchResponse.swift; sourceTree = ""; }; + 8FFC11AC8252C36F4B476D4E56652E41 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-demo-store-iosUITests-umbrella.h"; sourceTree = ""; }; + 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift; sourceTree = ""; }; + 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-umbrella.h"; sourceTree = ""; }; + 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoaderError.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift; sourceTree = ""; }; + 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryButton.swift; path = REES46/Classes/Button/StoryButton.swift; sourceTree = ""; }; + 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserSettings.swift; path = REES46/Classes/Model/UserSettings.swift; 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; }; - 9DD417BED260D762F9613D0934D1C06E /* Pods-demo-store-iosTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-acknowledgements.plist"; sourceTree = ""; }; + 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBTextConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift; sourceTree = ""; }; + 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsResponse.swift; path = REES46/Classes/Model/ProductsResponse.swift; sourceTree = ""; }; A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios"; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A349F70763EBA29B153A9EBC74ACA5E0 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown"; sourceTree = ""; }; - B00A45F6B27A0C155BD06F52EEB2B9A9 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; - B89E1C307963068AD807FE658CCC41C0 /* Pods-demo-store-ios-demo-store-iosUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; sourceTree = ""; }; - BDA32C7D30CD5025FFCA4FF5F2BC8124 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; - CEF2605DB4960E5503E8622AD666F390 /* Pods-demo-store-ios-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-acknowledgements.markdown"; sourceTree = ""; }; - CF521C1E5BEF75F11F75D3EF1212D499 /* Pods-demo-store-ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-umbrella.h"; sourceTree = ""; }; - D0551A46E0902FC163468EEB71CF0D05 /* Pods-demo-store-iosTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-Info.plist"; sourceTree = ""; }; - D4883278E9C43B1A1B5122C838F2371F /* Pods-demo-store-ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios.modulemap"; sourceTree = ""; }; - D8A669AAE1BD38692EB0DF177A4A4785 /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; - DF8B984FD50CC786F6E8C7D8DA034152 /* Pods-demo-store-iosTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-iosTests-acknowledgements.markdown"; sourceTree = ""; }; - F82F204BB039897365274B7C21538809 /* Pods-demo-store-ios-demo-store-iosUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios-demo-store-iosUITests.modulemap"; sourceTree = ""; }; - FEB5355A1D321179D84CC5BD9162A74C /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; + A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideViewController.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift; sourceTree = ""; }; + A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift; sourceTree = ""; }; + A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoFileUtils.swift; path = REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift; sourceTree = ""; }; + A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.release.xcconfig; sourceTree = ""; }; + A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGImageSource+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift"; sourceTree = ""; }; + A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CAPropertyAnimation+Key.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift"; sourceTree = ""; }; + A6EB5D5955124BD96D5764A18024EBC9 /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; + A791B748A86BE064FA80C12134F8E728 /* Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Loader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift; sourceTree = ""; }; + A9C82152B76290FC32122F96E2333F17 /* Assets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Assets.swift; path = REES46/Classes/Resources/Assets.swift; sourceTree = ""; }; + AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendResponse.swift; path = REES46/Classes/Model/RecommendResponse.swift; sourceTree = ""; }; + ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyle.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift; sourceTree = ""; }; + B41372352EEE4B1588AE589803A39DAD /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; + B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+ImagePlaceholder.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift"; sourceTree = ""; }; + B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetExtension.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift; sourceTree = ""; }; + B603BAB61730E8452D4CEE95A702E9E6 /* Pods-demo-store-iosTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-iosTests-acknowledgements.markdown"; sourceTree = ""; }; + B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+PromocodeBanner.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift"; sourceTree = ""; }; + BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenHandlerImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift; sourceTree = ""; }; + BDBCFAB7B704ABF80789FF3A7F6F3A0B /* Pods-demo-store-ios-demo-store-iosUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; sourceTree = ""; }; + C0A7C4F93426C9E1F538C7A9D7D26A38 /* Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh"; sourceTree = ""; }; + C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionService.swift; path = REES46/Classes/ServiceProtocols/SubscriptionService.swift; sourceTree = ""; }; + C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.debug.xcconfig; sourceTree = ""; }; + C58E5652FE52EBEEC8CFECDDAB7690EA /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-demo-store-iosUITests-dummy.m"; sourceTree = ""; }; + CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift; sourceTree = ""; }; + CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserverUI.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift; sourceTree = ""; }; + CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideView.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift; sourceTree = ""; }; + CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController_Extensions.swift; path = REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift; sourceTree = ""; }; + CFA4DC5C53C70119E18B12E39210BCF1 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist"; sourceTree = ""; }; + D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetCategoriesButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift; sourceTree = ""; }; + D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsStarsView.swift; path = REES46/Classes/Extensions/SdkConfiguration/RecommendationsStars/RecommendationsStarsView.swift; sourceTree = ""; }; + D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HashStorage.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift; sourceTree = ""; }; + D5AC60A10479B2D353EC371DC8B83A57 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; + D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTaskProtocol.swift; path = REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift; sourceTree = ""; }; + D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetObjectification.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetObjectification.swift; sourceTree = ""; }; + DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoader.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift; sourceTree = ""; }; + DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = REES46/Classes/Resources/Assets.xcassets; sourceTree = ""; }; + DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkActivityIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift; sourceTree = ""; }; + DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetDelegate.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift; sourceTree = ""; }; + DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift; sourceTree = ""; }; + DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "REES46-dummy.m"; sourceTree = ""; }; + E23C6A0C21CCDEEED0DAC1168FC8DE30 /* Pods-demo-store-iosTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-iosTests-umbrella.h"; sourceTree = ""; }; + E488745F10B20C3BE441DFD1B370AFD7 /* Pods-demo-store-ios-demo-store-iosUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios-demo-store-iosUITests.modulemap"; sourceTree = ""; }; + E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift"; sourceTree = ""; }; + E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionView.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift; sourceTree = ""; }; + E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkQueryBuilder.swift; path = REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift; sourceTree = ""; }; + E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ColorExtensions.swift; path = REES46/Classes/Shared/ColorExtensions.swift; sourceTree = ""; }; + EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Center.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift"; sourceTree = ""; }; + EFE1038B30DAB86B0B88A1A3AAC6E034 /* REES46-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "REES46-Info.plist"; sourceTree = ""; }; + F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkPopupAlertView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift; sourceTree = ""; }; + F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UISdkWrapLabel.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift; sourceTree = ""; }; + F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetTextField.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift; sourceTree = ""; }; + F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadObject.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift; sourceTree = ""; }; + F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PersonalizationSDK.swift; path = REES46/Classes/PersonalizationSDK.swift; sourceTree = ""; }; + F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLLiteralConvertible.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift; sourceTree = ""; }; + F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestOperation.swift; path = REES46/Classes/Extensions/SessionQueue/RequestOperation.swift; sourceTree = ""; }; + F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesCollectionViewPreviewCell.swift; path = REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift; sourceTree = ""; }; + F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGSize+Min.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift"; sourceTree = ""; }; + F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RawRepresentable+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift"; sourceTree = ""; }; + FA03167D0E708CC82BFBCD6475749CE2 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown"; sourceTree = ""; }; + FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift; sourceTree = ""; }; + FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FontFamily.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift; sourceTree = ""; }; + FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Coverable.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift; sourceTree = ""; }; + FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift; sourceTree = ""; }; + FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ManagedViewConfig.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 04D60E451996ABB241E7F11AA534C260 /* Frameworks */ = { + 0F5AD16E4861F5A40FD3476C13069579 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3726922467DD0501527002C0C31278E4 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 948F19A1F75D391F321A6D6E4202D5D5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4CF839B5325FB3ACF72D843CFF091251 /* Foundation.framework in Frameworks */, + F685A237C47426370D2AC2956285C3E1 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - CA705C5F96DD6DF2E3692326AFB3DEC7 /* Frameworks */ = { + D5E80841615FB620CED229E7885AC08F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0EB01A16DB7BF09F43A06760CAAD7AF5 /* Foundation.framework in Frameworks */, + B4C27A1D9F4EC266C766251289AA689E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -88,64 +405,222 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 1965A49D3B7987D00E298B33CB853E40 /* Pods-demo-store-ios-demo-store-iosUITests */ = { + 05C54A4D55BA128EDFC7C91451A8BB11 /* Pods */ = { isa = PBXGroup; children = ( - F82F204BB039897365274B7C21538809 /* Pods-demo-store-ios-demo-store-iosUITests.modulemap */, - A349F70763EBA29B153A9EBC74ACA5E0 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown */, - 9C56376A1E36CAF7BE077F7B9A6C7C80 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist */, - 73948AC430BD554A737110C5CCBDF88A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */, - B89E1C307963068AD807FE658CCC41C0 /* Pods-demo-store-ios-demo-store-iosUITests-Info.plist */, - 000794A532A447E20C7175D1D5724A31 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */, - BDA32C7D30CD5025FFCA4FF5F2BC8124 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, - B00A45F6B27A0C155BD06F52EEB2B9A9 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, + 2C90CD89B61815D5FE9D0AE6A9D21A2F /* REES46 */, ); - name = "Pods-demo-store-ios-demo-store-iosUITests"; - path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests"; + name = Pods; sourceTree = ""; }; - 2B621E016A855BABD9C774B381226343 /* Targets Support Files */ = { + 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */ = { isa = PBXGroup; children = ( - 49F08750EEC82D5A8FD4755D12F0317B /* Pods-demo-store-ios */, - 1965A49D3B7987D00E298B33CB853E40 /* Pods-demo-store-ios-demo-store-iosUITests */, - 560704A2DF8BCC7024EEABB465EADD07 /* Pods-demo-store-iosTests */, + DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */, + 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */, + 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */, + 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */, ); - name = "Targets Support Files"; + name = Resources; sourceTree = ""; }; - 49F08750EEC82D5A8FD4755D12F0317B /* Pods-demo-store-ios */ = { + 2C90CD89B61815D5FE9D0AE6A9D21A2F /* REES46 */ = { isa = PBXGroup; children = ( - D4883278E9C43B1A1B5122C838F2371F /* Pods-demo-store-ios.modulemap */, - CEF2605DB4960E5503E8622AD666F390 /* Pods-demo-store-ios-acknowledgements.markdown */, - 99F2681231E62574920A23BBA1BE7657 /* Pods-demo-store-ios-acknowledgements.plist */, - 5D87EF1D4E9B9A3D0F6FA34800AB6F48 /* Pods-demo-store-ios-dummy.m */, - 0D8535F146F9398315EBFC5555887E37 /* Pods-demo-store-ios-Info.plist */, - CF521C1E5BEF75F11F75D3EF1212D499 /* Pods-demo-store-ios-umbrella.h */, - 5DB4BE39384F4CAFB6BEED58E43B9E6D /* Pods-demo-store-ios.debug.xcconfig */, - 541C246A0AE79A1CC820CFF87F6B0BC6 /* Pods-demo-store-ios.release.xcconfig */, + A9C82152B76290FC32122F96E2333F17 /* Assets.swift */, + A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */, + E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */, + 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */, + 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */, + 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */, + A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */, + EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */, + F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */, + E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */, + FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */, + 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */, + 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */, + 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */, + FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */, + 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */, + D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */, + 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */, + DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */, + 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */, + 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */, + 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */, + 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */, + A791B748A86BE064FA80C12134F8E728 /* Loader.swift */, + 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */, + FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */, + 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */, + FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */, + 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */, + 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */, + 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */, + 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */, + CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */, + 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */, + 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */, + 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */, + 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */, + 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */, + F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */, + 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */, + 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */, + 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */, + 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */, + BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */, + 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */, + 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */, + F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */, + D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */, + 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */, + 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */, + 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */, + AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */, + 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */, + 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */, + F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */, + 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */, + 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */, + CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */, + DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */, + 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */, + 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */, + 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */, + 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */, + 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */, + 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */, + 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */, + F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */, + E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */, + ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */, + 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */, + 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */, + 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */, + DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */, + CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */, + 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */, + 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */, + 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */, + A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */, + 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */, + 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */, + 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */, + D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */, + DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */, + B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */, + 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */, + 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */, + 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */, + 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */, + 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */, + D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */, + F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */, + FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */, + 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */, + D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */, + 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */, + 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */, + 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */, + 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */, + CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */, + A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */, + 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */, + F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */, + 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */, + 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */, + 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */, + 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */, + 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */, + 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */, + 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */, + C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */, + 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */, + 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */, + 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */, + 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */, + 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */, + 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */, + 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */, + 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */, + 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */, + 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */, + B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */, + 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */, + 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */, + 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */, + 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */, + E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */, + F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */, + B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */, + F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */, + 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */, + 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */, + 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */, + 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */, + F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */, + A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */, + 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */, + 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */, + 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */, + A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */, ); - name = "Pods-demo-store-ios"; - path = "Target Support Files/Pods-demo-store-ios"; + name = REES46; + path = REES46; sourceTree = ""; }; - 560704A2DF8BCC7024EEABB465EADD07 /* Pods-demo-store-iosTests */ = { + 421E5C4F1CB4560D8EC4FCBE1120AE3E /* Pods-demo-store-iosTests */ = { isa = PBXGroup; children = ( - 3FA3CB90DCB86363A419F3791B7B3A34 /* Pods-demo-store-iosTests.modulemap */, - DF8B984FD50CC786F6E8C7D8DA034152 /* Pods-demo-store-iosTests-acknowledgements.markdown */, - 9DD417BED260D762F9613D0934D1C06E /* Pods-demo-store-iosTests-acknowledgements.plist */, - 2820D7576E9D83DD79F820940F214CDF /* Pods-demo-store-iosTests-dummy.m */, - D0551A46E0902FC163468EEB71CF0D05 /* Pods-demo-store-iosTests-Info.plist */, - 77437148103FBD547B6ACA0E29028AF1 /* Pods-demo-store-iosTests-umbrella.h */, - FEB5355A1D321179D84CC5BD9162A74C /* Pods-demo-store-iosTests.debug.xcconfig */, - D8A669AAE1BD38692EB0DF177A4A4785 /* Pods-demo-store-iosTests.release.xcconfig */, + 48D43AAA52FE567ADF7FABD5AD0D1218 /* Pods-demo-store-iosTests.modulemap */, + B603BAB61730E8452D4CEE95A702E9E6 /* Pods-demo-store-iosTests-acknowledgements.markdown */, + 774742885C515AA49BD28EF3648BA370 /* Pods-demo-store-iosTests-acknowledgements.plist */, + 2FB9E93A5A045ADF557378B54D551DDE /* Pods-demo-store-iosTests-dummy.m */, + 0BB49B831AF796BFD54D280D4E950744 /* Pods-demo-store-iosTests-Info.plist */, + E23C6A0C21CCDEEED0DAC1168FC8DE30 /* Pods-demo-store-iosTests-umbrella.h */, + A6EB5D5955124BD96D5764A18024EBC9 /* Pods-demo-store-iosTests.debug.xcconfig */, + 6FEE741AF14146505421E6B9B790997B /* Pods-demo-store-iosTests.release.xcconfig */, ); name = "Pods-demo-store-iosTests"; path = "Target Support Files/Pods-demo-store-iosTests"; sourceTree = ""; }; + 449C210F1D4405071D5EC14553BAE4AC /* Pods-demo-store-ios-demo-store-iosUITests */ = { + isa = PBXGroup; + children = ( + E488745F10B20C3BE441DFD1B370AFD7 /* Pods-demo-store-ios-demo-store-iosUITests.modulemap */, + FA03167D0E708CC82BFBCD6475749CE2 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown */, + CFA4DC5C53C70119E18B12E39210BCF1 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist */, + C58E5652FE52EBEEC8CFECDDAB7690EA /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */, + C0A7C4F93426C9E1F538C7A9D7D26A38 /* Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh */, + BDBCFAB7B704ABF80789FF3A7F6F3A0B /* Pods-demo-store-ios-demo-store-iosUITests-Info.plist */, + 8FFC11AC8252C36F4B476D4E56652E41 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */, + D5AC60A10479B2D353EC371DC8B83A57 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, + 2A71319F6A963531ACFFF30BCBC6DDB2 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, + ); + name = "Pods-demo-store-ios-demo-store-iosUITests"; + path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests"; + sourceTree = ""; + }; + 45A7C2EE7440D2AEC66E412DA39A3B2B /* Pods-demo-store-ios */ = { + isa = PBXGroup; + children = ( + 4DF8AECAEC072703693B3E3E2C4B83C5 /* Pods-demo-store-ios.modulemap */, + 2E74AC7CFF2C91899A037B82C869DB0A /* Pods-demo-store-ios-acknowledgements.markdown */, + 4566A7EDA1E302A996738A3E6923BB76 /* Pods-demo-store-ios-acknowledgements.plist */, + 37529AFAE21E524BB5CF8528DBDBFF62 /* Pods-demo-store-ios-dummy.m */, + 76DEAE9E95F151F7D441B0550C8E10B5 /* Pods-demo-store-ios-frameworks.sh */, + 1B85BF16297242DA531FC69E93CF9CA5 /* Pods-demo-store-ios-Info.plist */, + 1C72C00B34C83096ED3147E8AAAD8EAE /* Pods-demo-store-ios-umbrella.h */, + B41372352EEE4B1588AE589803A39DAD /* Pods-demo-store-ios.debug.xcconfig */, + 3433BC654811C432BEF5CB32AAF90EFB /* Pods-demo-store-ios.release.xcconfig */, + ); + name = "Pods-demo-store-ios"; + path = "Target Support Files/Pods-demo-store-ios"; + sourceTree = ""; + }; 578452D2E740E91742655AC8F1636D1F /* iOS */ = { isa = PBXGroup; children = ( @@ -154,23 +629,50 @@ name = iOS; sourceTree = ""; }; - 7C450847E734658F86406652EBF5E935 /* Products */ = { + 65D0B108902971FD545088B9D3A3C79A /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 45A7C2EE7440D2AEC66E412DA39A3B2B /* Pods-demo-store-ios */, + 449C210F1D4405071D5EC14553BAE4AC /* Pods-demo-store-ios-demo-store-iosUITests */, + 421E5C4F1CB4560D8EC4FCBE1120AE3E /* Pods-demo-store-iosTests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + A12468668661804CACF886A903F1799F /* Products */ = { isa = PBXGroup; children = ( A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */, 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */, 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */, + 3671B3C220D01E22000CF41146C2B4AB /* REES46 */, ); name = Products; sourceTree = ""; }; + A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */ = { + isa = PBXGroup; + children = ( + 7EED3A4B574EFEBB9FC4A320FC64352D /* REES46.modulemap */, + DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */, + EFE1038B30DAB86B0B88A1A3AAC6E034 /* REES46-Info.plist */, + 240A79C469C0F6595705D16927F498E9 /* REES46-prefix.pch */, + 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */, + C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */, + A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/REES46"; + sourceTree = ""; + }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, - 7C450847E734658F86406652EBF5E935 /* Products */, - 2B621E016A855BABD9C774B381226343 /* Targets Support Files */, + 05C54A4D55BA128EDFC7C91451A8BB11 /* Pods */, + A12468668661804CACF886A903F1799F /* Products */, + 65D0B108902971FD545088B9D3A3C79A /* Targets Support Files */, ); sourceTree = ""; }; @@ -185,19 +687,27 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 14BED80D38E09DA024CC9AE31245984E /* Headers */ = { + 5D67C5954DA4997D536C56BA4873F67C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7099F79CA33CF3C0CDECCA80F7A9C308 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 834C14FE5447464523181F2F002D63FE /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */, + 19FF735430577E28E963D72D58DF655C /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - F3C3E54D5D02879771EA6AB4336B3B1B /* Headers */ = { + A4F049A598956AF94033ADA695606EB1 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BF78F329D56E1C5D0A0B83A5D9E03EED /* Pods-demo-store-ios-umbrella.h in Headers */, + 469C92E04B9D2D4F8392EE02C7A39C69 /* Pods-demo-store-ios-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -212,6 +722,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 22B59BFD5B487006E1351D4A0360ED8C /* Build configuration list for PBXNativeTarget "REES46" */; + buildPhases = ( + 5D67C5954DA4997D536C56BA4873F67C /* Headers */, + F36EF4E98F2A8B5AB79DDC806B04E10B /* Sources */, + 948F19A1F75D391F321A6D6E4202D5D5 /* Frameworks */, + F83C3BAEE5E889D5CC05754543D1EA43 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = REES46; + productName = REES46; + productReference = 3671B3C220D01E22000CF41146C2B4AB /* REES46 */; + productType = "com.apple.product-type.framework"; + }; 70C4579D73168EDE5BAEF9D0A675D6F0 /* Pods-demo-store-iosTests */ = { isa = PBXNativeTarget; buildConfigurationList = DDA0AEAEF33653027530506736479FDE /* Build configuration list for PBXNativeTarget "Pods-demo-store-iosTests" */; @@ -224,7 +752,7 @@ buildRules = ( ); dependencies = ( - AC6BA83CFA2AA6EE41038A9DF6494CBA /* PBXTargetDependency */, + FAC7701D239872B8311C4054D9DB2831 /* PBXTargetDependency */, ); name = "Pods-demo-store-iosTests"; productName = Pods_demo_store_iosTests; @@ -233,16 +761,17 @@ }; 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */ = { isa = PBXNativeTarget; - buildConfigurationList = E1355212E33F5FCDE58798608E20E3A7 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */; + buildConfigurationList = 055840A6FA6AAA9EF10FDACFBB00DB5C /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */; buildPhases = ( - F3C3E54D5D02879771EA6AB4336B3B1B /* Headers */, - E75BC81316702BB1428FD2F73D61A707 /* Sources */, - CA705C5F96DD6DF2E3692326AFB3DEC7 /* Frameworks */, - 303053C93DA6D632B8EC0D383C155C7D /* Resources */, + A4F049A598956AF94033ADA695606EB1 /* Headers */, + EB0148397D0D3BE3BDDD286B33CDA7DE /* Sources */, + 0F5AD16E4861F5A40FD3476C13069579 /* Frameworks */, + 6ED9D74DEB6F3EDA8219CEA42CF2E560 /* Resources */, ); buildRules = ( ); dependencies = ( + 504A7F75DEBB11C4718A9166A011498E /* PBXTargetDependency */, ); name = "Pods-demo-store-ios"; productName = Pods_demo_store_ios; @@ -251,16 +780,17 @@ }; AC237AA952DF10555F917C17037E3C89 /* Pods-demo-store-ios-demo-store-iosUITests */ = { isa = PBXNativeTarget; - buildConfigurationList = 7AE97CA311119F2870BF61DDB9DF8BE8 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */; + buildConfigurationList = FFFF784778B0D8536B0539C3A7ED3159 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */; buildPhases = ( - 14BED80D38E09DA024CC9AE31245984E /* Headers */, - 995E9E2AD023E6745964B0CAA40E668C /* Sources */, - 04D60E451996ABB241E7F11AA534C260 /* Frameworks */, - AC7F612FDE5A0B8961529F2D412EEAF6 /* Resources */, + 7099F79CA33CF3C0CDECCA80F7A9C308 /* Headers */, + D73C4EB97843C82E030E491F2D212141 /* Sources */, + D5E80841615FB620CED229E7885AC08F /* Frameworks */, + 4D87E5A45DD4BE31359A94FEB978164D /* Resources */, ); buildRules = ( ); dependencies = ( + E331C98E7CB8005A04A6364504C13DF3 /* PBXTargetDependency */, ); name = "Pods-demo-store-ios-demo-store-iosUITests"; productName = Pods_demo_store_ios_demo_store_iosUITests; @@ -285,26 +815,27 @@ en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 7C450847E734658F86406652EBF5E935 /* Products */; + productRefGroup = A12468668661804CACF886A903F1799F /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */, AC237AA952DF10555F917C17037E3C89 /* Pods-demo-store-ios-demo-store-iosUITests */, 70C4579D73168EDE5BAEF9D0A675D6F0 /* Pods-demo-store-iosTests */, + 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 303053C93DA6D632B8EC0D383C155C7D /* Resources */ = { + 4D87E5A45DD4BE31359A94FEB978164D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - AC7F612FDE5A0B8961529F2D412EEAF6 /* Resources */ = { + 6ED9D74DEB6F3EDA8219CEA42CF2E560 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -318,48 +849,287 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F83C3BAEE5E889D5CC05754543D1EA43 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0334759C415B8CF146E61AB99FE69227 /* Assets.xcassets in Resources */, + ABCFB3FD321DE180968A5A0B2BB86A62 /* StoriesCollectionViewPreviewCell.xib in Resources */, + F6DEE3FA2EF0113730454100EEE86756 /* StoriesView.xib in Resources */, + 8BACD88871220B13AB285BC476A7F194 /* StoryCollectionViewCell.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 995E9E2AD023E6745964B0CAA40E668C /* Sources */ = { + A60E7D11219A77AC97624EE5EFAE16C4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7A60842F1082CDF4F04C7DE464416B35 /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */, + 2ED0D7AE2F2531563EBC0135C853AE8E /* Pods-demo-store-iosTests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A60E7D11219A77AC97624EE5EFAE16C4 /* Sources */ = { + D73C4EB97843C82E030E491F2D212141 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2ED0D7AE2F2531563EBC0135C853AE8E /* Pods-demo-store-iosTests-dummy.m in Sources */, + 41CC97B0C6B55C160191247F4CF2D8ED /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EB0148397D0D3BE3BDDD286B33CDA7DE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B1FF3AA160C3354557A6B38A48756E98 /* Pods-demo-store-ios-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E75BC81316702BB1428FD2F73D61A707 /* Sources */ = { + F36EF4E98F2A8B5AB79DDC806B04E10B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DFFF30C2EB16C41D21FC724DC7E4AB43 /* Pods-demo-store-ios-dummy.m in Sources */, + 2A3ACC61257E4E88DE782C3CD1BC0CCE /* Assets.swift in Sources */, + B14B39DD5BE9A500B163EE27C544AA2B /* CAPropertyAnimation+Key.swift in Sources */, + 96F98929440C537CC83107C3747D6480 /* CarouselCollectionView.swift in Sources */, + E9CC56086B144A2A4193EF27C59F6FB1 /* CarouselCollectionViewCell.swift in Sources */, + 4CBB873363589E883524864FFBFE17D2 /* CarouselConstants.swift in Sources */, + AEB0C53C27CB087C3215538B6F476A33 /* CartItem.swift in Sources */, + E7E128BBA990CA16D6C7D2E12C7451B3 /* CGImageSource+ImageLoader.swift in Sources */, + B2C4ADFF7916C0CA794767779FCF79D6 /* CGRect+Center.swift in Sources */, + 7CA7335FA31F5B8BF6A8FFA433CEE3AE /* CGSize+Min.swift in Sources */, + 216F659702FE03B7987F7AE153DC0185 /* ColorExtensions.swift in Sources */, + B3768606656AAEE8FE776B7A823030B1 /* Coverable.swift in Sources */, + 00E4A44ED57BE79A80742EFB71221A8F /* Coverable+UIKit.swift in Sources */, + 46DCEDA235C161852B926A0EF943EACC /* Data+ImageLoader.swift in Sources */, + F38F22B4A2A822E5BC40C664C5943FB9 /* Disk.swift in Sources */, + 000B92572AB3BA2EF78F29FC06720F72 /* FontFamily.swift in Sources */, + C204C6976B8B9ACE9797F222AA6ECCA5 /* GenericDataTask.swift in Sources */, + A150E969EA20BF59B3CF070A4240F180 /* HashStorage.swift in Sources */, + 56369E2C8C8213D51A72552106A9C264 /* ImageData.swift in Sources */, + 14242A0D3156633A69FB084B10C60EDB /* ImageLoader.swift in Sources */, + 21A6687D0BA31E63C8800D2C9F20CC70 /* ImageLoaderError.swift in Sources */, + 44D5997FBA69F54DF6D3B0D068C7953D /* ImageLoading.swift in Sources */, + A969E1ACC2EEF44464751BAB8DEB684E /* InitResponse.swift in Sources */, + DEB27EE51D09D55258D69927B56120DB /* InitService.swift in Sources */, + 0CFFB84337D831CA8EF3617D7DB3772E /* Loader.swift in Sources */, + A84F0846ABE5B8D3E87FB73531F706A4 /* LoadingPlaceholderView.swift in Sources */, + DA38244A91BEB77E42BD4F150B807505 /* ManagedViewConfig.swift in Sources */, + C800B58B3331444C8BB27C4F89D2CE44 /* Navigation.swift in Sources */, + BFC831FD30B89FC45404A6CBC78D2BEA /* NetworkConnectionStatus.swift in Sources */, + BF0485F5C192F225E4B519B7F2793DFC /* NetworkConnectionType.swift in Sources */, + 681A5A71427454B12747295ECDD0D24C /* NetworkRadioType.swift in Sources */, + 2D32B1BFDFC57E7BAFF6B73C30F42DFC /* NetworkStatus.swift in Sources */, + F5AB8C4608DCCA8557A248A0EF9D3571 /* NetworkStatusObserver.swift in Sources */, + 8CE4BF9FB621CF956CB6262F53B07C83 /* NetworkStatusObserverUI.swift in Sources */, + 1905EBF3E70183BFC8580F3819F692CC /* NotificationHandlingService.swift in Sources */, + 03FFFE029584CC21DD2FDC4369224B1E /* NotificationHandlingServiceImpl.swift in Sources */, + 210280AA598517CF989A582413B25FCB /* NotificationService.swift in Sources */, + 99B5996FC38567CF3ED494041F3E3BF1 /* Operative.swift in Sources */, + D0925D984A33493CBD8748EF9A3B91D3 /* Option.swift in Sources */, + B29CDD67B86238DFC22CB13179C4DAAA /* PersonalizationSDK.swift in Sources */, + 41822CFDBD9C86FB87B351EBFEC58073 /* ProductsButton.swift in Sources */, + E761A05087F0E09F0DC407500FEE98E2 /* ProductsResponse.swift in Sources */, + ED9F4F1DEDFDBEFCD5E129DA9755A705 /* PromocodeBanner.swift in Sources */, + 8D50E5745C533C21E8EAE239F4E59FC3 /* PromoCodeView.swift in Sources */, + 4DF1CC4FC7EAEB5C38F32AA1C39C5A07 /* PushTokenHandlerImpl.swift in Sources */, + 246ABC711084B7E4CC7B4A27989AB69E /* PushTokenNotificationService.swift in Sources */, + 71A9026CA64F36A0A121DD4060BB5BB9 /* PushTokenNotificationServiceImpl.swift in Sources */, + A20FF0BB2984AC66216074B1EFBE8F98 /* RawRepresentable+FontInjector.swift in Sources */, + BBCDC6622412DD3C491775830A55FE4D /* RecommendationsStarsView.swift in Sources */, + 28F8EF2658BA628CA99983594C415D09 /* RecommendationsWidgetConstants.swift in Sources */, + 34EF675DD2AB530F8C16D96F7D198E33 /* RecommendationsWidgetView.swift in Sources */, + 1E35871E2E937C15DD42093DF742998B /* RecommendationsWidgetViewCell.swift in Sources */, + 1C778D789F4B0897A6037CB978826072 /* RecommendResponse.swift in Sources */, + 155C4149B624787E4BAAA07B1D4EBD39 /* REES46-dummy.m in Sources */, + 1F215B81847B4CD4B36342CE793CF473 /* RegisterNotification.swift in Sources */, + 8D05D7544E96EB065022900C06BD8BDA /* ReloadButton.swift in Sources */, + 9653EFA6AC3DDF7D0F90B549C485C9F9 /* RequestOperation.swift in Sources */, + 835A6430B8B241FF5E042D4415103DDD /* RView_Extensions.swift in Sources */, + 38AFD9246E6995657D1EDE99EBC6CEE5 /* RWebViewController.swift in Sources */, + 3C0BFC786BED0FA23523678B73728154 /* RWebViewController_Extensions.swift in Sources */, + 6447E67AD574E06A2B69690B0B29BC89 /* SdkActivityIndicator.swift in Sources */, + A2D682E7527D83413A35CA870AF7B766 /* SdkApperanceViewScheme.swift in Sources */, + CEDD87245EDA33E6EED478D04CFF3863 /* SdkConfiguration.swift in Sources */, + 289E24AFFFBE57287ADD4AB22F17A4B9 /* SdkDynamicFont.swift in Sources */, + 6DEFEFA0016D535ADBAD7B823B156E7D /* SdkFontInjector.swift in Sources */, + A09249CC7461C9EC873C4AB82C16124B /* SdkFontInstaller.swift in Sources */, + 18BA7C889427497D1A009D85662C46CE /* SdkGlobalHelper.swift in Sources */, + 1B6FDB2F5513BFAA3FB1BB1B851B236F /* SdkImageReloader.swift in Sources */, + E385668DBCD81215689D1543C955E46A /* SdkPopupAlertView.swift in Sources */, + 42C4319E1A92EB4B2BB51E51D1E14D1F /* SdkQueryBuilder.swift in Sources */, + E0D9CD065B64C0D661B5FD42FEB79918 /* SdkStyle.swift in Sources */, + 73BBCA8BA8E0D143006C01813759AC18 /* SdkStyleColorScheme.swift in Sources */, + BA66BD722D1029DB90B91889AE435938 /* SdkStyleColorSchemeAwareView.swift in Sources */, + 3728D15DC1AE882F703003FDF14D52F0 /* SdkStyleColorSchemeAwareViewController.swift in Sources */, + 39AE9A2AD1B349F39699B3578E56BF00 /* SdkStyleCustomColorScheme.swift in Sources */, + 56B8E8C41883E4FC7F171F62949E04BD /* SdkStyleCustomColorSchemeAwareView.swift in Sources */, + 24A6C06C7F607033FE51591F7D66A682 /* SdkStyleCustomColorSchemeAwareViewController.swift in Sources */, + 44E68CF722456B675ABF6D715C514AC6 /* SdkStyleCustomFonts.swift in Sources */, + BD49D731800904B988C8A771E0C1A9CC /* SdkStyleCustomFontSizeAwareView.swift in Sources */, + 473ABA01905DAFFF8D07DEB476A9D75D /* SdkStyleCustomFontSizeAwareViewController.swift in Sources */, + 6E6B81FC768C9444F194B10B259FA696 /* SdkStyleUIApplication.swift in Sources */, + 091DF2ED562F9F9107EF807638E22662 /* SearchResponse.swift in Sources */, + FA8B5D62D1F65F6083B7FF811EB32EBB /* SearchWidget.swift in Sources */, + 90547932EA32076C22D800BDAD445A1F /* SearchWidgetCategoriesButton.swift in Sources */, + B3C75BB3596FA47232F49322F2851860 /* SearchWidgetDelegate.swift in Sources */, + 20FBF01A41A066522B5DEDF65AE31666 /* SearchWidgetExtension.swift in Sources */, + C9042F117FB2359CFFAE2A484BCAD759 /* SearchWidgetHistoryButton.swift in Sources */, + 7EB26E79BA128D1E2F994D902036286C /* SearchWidgetListView.swift in Sources */, + D0A994B97078D246BFD4805C729AC6FC /* SearchWidgetListViewCell.swift in Sources */, + C3B214337422238B6F16DDD4D83FE86A /* SearchWidgetMainView.swift in Sources */, + B56C23C1C826628465D0881A71FC3346 /* SearchWidgetModel.swift in Sources */, + 5A234484C926A75BA80099AEC8CC4611 /* SearchWidgetObjectification.swift in Sources */, + 49DEB29E8A22D8F5F67907D19A906F18 /* SearchWidgetTextField.swift in Sources */, + E49668B0B739D147E3414D17D4A0BA0E /* SearchWidgetView.swift in Sources */, + 53FD279BE6D27EC46BF71734B84F51A8 /* SearchWidgetViewController.swift in Sources */, + 9997384531CF394E13FCDB94F6354C9A /* SessionDataTaskProtocol.swift in Sources */, + FF76EE2CCAF3321D9F471F7D3BC05971 /* SessionOperation.swift in Sources */, + E0B0ED3036DA4A0A5A0CA0FD17D1B9DF /* SessionQueue.swift in Sources */, + AC146C49CFAC1C9EBDB2BAAF57FDD984 /* SettingsManageable.swift in Sources */, + A5234B6659FC63CB96F6BC93C9D05DB7 /* SimplePersonalizationSDK.swift in Sources */, + F83B27F3BA95658EAD242D8EC0FF4C91 /* SlideView.swift in Sources */, + 13EAE9F36834227AC6603F76D54DD1D4 /* SlideViewController.swift in Sources */, + 92E5F181D61E15ACB5931E80F5DDBBDB /* Stories.swift in Sources */, + A1BE35C271D2217C0B4232D0AB0C8DA3 /* StoriesCollectionViewPreviewCell.swift in Sources */, + 9550440BCB953E622CC97EFB797E3C07 /* StoriesImageLoader.swift in Sources */, + 14D4D1A202CB5C785E18D2ED9A93F81D /* StoriesSlideReloadIndicator.swift in Sources */, + 2868EA3EDB5D52CB4B54C1C280421595 /* StoriesView.swift in Sources */, + D0D410CA575CE4E459381557FDEFA3A5 /* StoryBlockImageCache.swift in Sources */, + 7B10C150677B6261882D5C0C1297F00F /* StoryButton.swift in Sources */, + 48A2019E7B6882B3B0C6BFF5A49E2C24 /* StoryCollectionViewCell.swift in Sources */, + 0F50D04988DAEFAB5D74706EE6591588 /* StoryViewController.swift in Sources */, + 93C9B6D59CF164493225BB90330ED9CB /* SubscriptionService.swift in Sources */, + 66724EBA9152FA748810F92BAF9F80DC /* SubscriptionServiceImpl.swift in Sources */, + 78AF773DEA2008B6FE70C40246E48D18 /* TBAppearanceConfiguration.swift in Sources */, + D9B862FA4640C84B16DF0E2AF96459D3 /* TBFontConfiguration.swift in Sources */, + 05921ED246B06FE8677425ED82B6C032 /* TBTextConfiguration.swift in Sources */, + 1D0FCF6225378C95A3246107F648C538 /* TexBlockConfiguration.swift in Sources */, + C88C545BF7521C369D2602C552A551A8 /* TextBlockConstants.swift in Sources */, + 8B15040F27C854C43BE632FB8D86B683 /* TextBlockView.swift in Sources */, + 1DABF66E97AD95FCF260BA3176E86685 /* TrackingService.swift in Sources */, + 217043CCF240C170FBA603D1CD39C65A /* TrackServiceImpl.swift in Sources */, + 71CDDF6B42C2D0D1CC5A94AB0BE99E23 /* UIBezierPath+Circle.swift in Sources */, + 81091327D041DE2EDC26B207E3584D0E /* UIBezierPath+ImagePlaceholder.swift in Sources */, + 5DCEC664244099368ABFA62172F815C6 /* UIColor+Extension.swift in Sources */, + 05438BA0424A6EACD940A12BADEA800A /* UIFont+FontInjector.swift in Sources */, + 53758A7E257766681ECCDFEE4288C35D /* UIFontDescriptorUsage.swift in Sources */, + AE87C2623409B5C7F73B12649F5B26E5 /* UIImage+ImageLoader.swift in Sources */, + 8AE54E966BB7B8583BF5B5BD952BDF0A /* UIImageView+ImageLoader.swift in Sources */, + BFD7143593CAF751E9C8344B20488F31 /* UISdkWrapLabel.swift in Sources */, + 5E8FB1E21260A9D830B33A759E4627F6 /* UIViewController+PromocodeBanner.swift in Sources */, + 72A17042882104723E9CA92A14D80CC1 /* URLLiteralConvertible.swift in Sources */, + 077CADF6F924345A3E25E7D7003BBD5E /* URLSessionQueue.swift in Sources */, + 9D19EE689D681F8493419C2CA1FB6D5E /* UserDefaultsExtension.swift in Sources */, + 8C1057083C31FF842CEEEF864911D1A4 /* UserSettings.swift in Sources */, + 20AED63279F202C3174FE802C696B9A1 /* VideoDownloadManager.swift in Sources */, + 45EB33BB9930BD56B2C0E09F8F7598DE /* VideoDownloadObject.swift in Sources */, + B08BD0363F34B4423E46FDBAB017A26C /* VideoFileUtils.swift in Sources */, + B886B2522D2C093BBCE9844BBC2A84AE /* ViewConfigPlain.swift in Sources */, + 1016ABA1F6A6BFBDE0EA9FC87B86A858 /* ViewConfigService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - AC6BA83CFA2AA6EE41038A9DF6494CBA /* PBXTargetDependency */ = { + 504A7F75DEBB11C4718A9166A011498E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = REES46; + target = 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */; + targetProxy = 97FD9F25B8F6CE6ACEDF790C858E79E0 /* PBXContainerItemProxy */; + }; + E331C98E7CB8005A04A6364504C13DF3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = REES46; + target = 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */; + targetProxy = DCDA243612AE8D7094728CC593FF8178 /* PBXContainerItemProxy */; + }; + FAC7701D239872B8311C4054D9DB2831 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "Pods-demo-store-ios"; target = 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */; - targetProxy = 5F88B7735B116F009987088762EC7F2F /* PBXContainerItemProxy */; + targetProxy = 40C2C9959393295F1B86C75B81551CC4 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + 0543067DFA4157D877ECC1E37BB23EB4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */; + buildSettings = { + 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"; + GCC_PREFIX_HEADER = "Target Support Files/REES46/REES46-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/REES46/REES46-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/REES46/REES46.modulemap"; + PRODUCT_MODULE_NAME = REES46; + PRODUCT_NAME = REES46; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 06C2BC5254088328504EE61E0205587A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */; + buildSettings = { + 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"; + GCC_PREFIX_HEADER = "Target Support Files/REES46/REES46-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/REES46/REES46-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/REES46/REES46.modulemap"; + PRODUCT_MODULE_NAME = REES46; + PRODUCT_NAME = REES46; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; 223F613DD12A97C370C9A8BBBA680196 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FEB5355A1D321179D84CC5BD9162A74C /* Pods-demo-store-iosTests.debug.xcconfig */; + baseConfigurationReference = A6EB5D5955124BD96D5764A18024EBC9 /* Pods-demo-store-iosTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -460,71 +1230,9 @@ }; name = Debug; }; - 63FAF33E1C55B71A5F5A8B3CC8749F99 /* 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 = 12.0; - 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; - }; - 844C608F2983144588E8075F58AE5D4D /* Release */ = { + 49EA8E87E9FEEFE7A39E5DE24D678A23 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B00A45F6B27A0C155BD06F52EEB2B9A9 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */; + baseConfigurationReference = 3433BC654811C432BEF5CB32AAF90EFB /* Pods-demo-store-ios.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -536,7 +1244,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -545,7 +1253,7 @@ "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -560,9 +1268,9 @@ }; name = Release; }; - 96C094A76C8F5B5519FFA3DE71AB253D /* Debug */ = { + 54DD08EE33F7AEF6E15ACEB4A2A3D5C7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5DB4BE39384F4CAFB6BEED58E43B9E6D /* Pods-demo-store-ios.debug.xcconfig */; + baseConfigurationReference = D5AC60A10479B2D353EC371DC8B83A57 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -574,7 +1282,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -583,7 +1291,7 @@ "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -597,9 +1305,71 @@ }; name = Debug; }; - 984D4CDE2B6BC4261868FDB953629006 /* Debug */ = { + 63FAF33E1C55B71A5F5A8B3CC8749F99 /* 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 = 12.0; + 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; + }; + B11EC91B86D8E2B9AFB081C6BE92B63D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BDA32C7D30CD5025FFCA4FF5F2BC8124 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; + baseConfigurationReference = B41372352EEE4B1588AE589803A39DAD /* Pods-demo-store-ios.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -611,7 +1381,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -620,7 +1390,7 @@ "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -634,9 +1404,9 @@ }; name = Debug; }; - E3BBBD39BDCD883B13DB24B728D42B1C /* Release */ = { + B1EF0CE90FBACBD5AE75C9B20E847EE2 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 541C246A0AE79A1CC820CFF87F6B0BC6 /* Pods-demo-store-ios.release.xcconfig */; + baseConfigurationReference = 2A71319F6A963531ACFFF30BCBC6DDB2 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -648,7 +1418,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -657,7 +1427,7 @@ "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -674,7 +1444,7 @@ }; EA7EA17ED62FCF720DF60909BD5D8380 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D8A669AAE1BD38692EB0DF177A4A4785 /* Pods-demo-store-iosTests.release.xcconfig */; + baseConfigurationReference = 6FEE741AF14146505421E6B9B790997B /* Pods-demo-store-iosTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -713,20 +1483,29 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + 055840A6FA6AAA9EF10FDACFBB00DB5C /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2B9E26EAE2CD392AD762421F663075A1 /* Debug */, - 63FAF33E1C55B71A5F5A8B3CC8749F99 /* Release */, + B11EC91B86D8E2B9AFB081C6BE92B63D /* Debug */, + 49EA8E87E9FEEFE7A39E5DE24D678A23 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 7AE97CA311119F2870BF61DDB9DF8BE8 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */ = { + 22B59BFD5B487006E1351D4A0360ED8C /* Build configuration list for PBXNativeTarget "REES46" */ = { isa = XCConfigurationList; buildConfigurations = ( - 984D4CDE2B6BC4261868FDB953629006 /* Debug */, - 844C608F2983144588E8075F58AE5D4D /* Release */, + 06C2BC5254088328504EE61E0205587A /* Debug */, + 0543067DFA4157D877ECC1E37BB23EB4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2B9E26EAE2CD392AD762421F663075A1 /* Debug */, + 63FAF33E1C55B71A5F5A8B3CC8749F99 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -740,11 +1519,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E1355212E33F5FCDE58798608E20E3A7 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */ = { + FFFF784778B0D8536B0539C3A7ED3159 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 96C094A76C8F5B5519FFA3DE71AB253D /* Debug */, - E3BBBD39BDCD883B13DB24B728D42B1C /* Release */, + 54DD08EE33F7AEF6E15ACEB4A2A3D5C7 /* Debug */, + B1EF0CE90FBACBD5AE75C9B20E847EE2 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/REES46/LICENSE b/Pods/REES46/LICENSE new file mode 100644 index 0000000..ef5c1f0 --- /dev/null +++ b/Pods/REES46/LICENSE @@ -0,0 +1,19 @@ +Copyright REES46 (c) 2023. All rights reserved. + +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 REES46 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 REES46 SOFTWARE. diff --git a/Pods/REES46/README.md b/Pods/REES46/README.md new file mode 100644 index 0000000..dd1c6b7 --- /dev/null +++ b/Pods/REES46/README.md @@ -0,0 +1,29 @@ +# REES46 SDK for iOS + +[![Version](https://img.shields.io/cocoapods/v/REES46.svg?style=flat)](https://cocoapods.org/pods/REES46) +![iOS](https://img.shields.io/badge/iOS-release) +![Release](https://img.shields.io/badge/release-blueviolet) +[![License](https://img.shields.io/cocoapods/l/REES46.svg?style=flat)](https://cocoapods.org/pods/REES46) + +![REES46](https://rees46.com/static-images/cocoapods/r46_ios_sdk_cocoapods_cover.png) + +## Description + +REES46 SDK for iOS platform - the wide toolset for eCommerce apps. +This SDK can be used to integrate in your own app for iOS in few steps. + +## Documentation + +For detailed information on methods, please refer to the documentation available at the following link: + +[Official API references](https://reference.api.rees46.com/#introduction) + +## Author + + +REES46, desk@rees46.com + +## License + + +REES46 SDK is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/REES46/REES46/Classes/Button/ProductsButton.swift b/Pods/REES46/REES46/Classes/Button/ProductsButton.swift new file mode 100644 index 0000000..8b98e91 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Button/ProductsButton.swift @@ -0,0 +1,185 @@ +import UIKit + +protocol CustomProductButtonDelegate: AnyObject { + func openDeepLink(url: String) + func openLinkIosExternal(url: String) + func openLinkWebExternal(url: String) +} + +@IBDesignable class ProductsButton: UIButton { + + var _buttonData: StoriesElement? + weak var delegate: CustomProductButtonDelegate? + + init() { + super.init(frame: .zero) + setToDefaultProductsButton() + } + + override func layoutSubviews() { + super.layoutSubviews() + updateCornerRadius() + } + + @IBInspectable var rounded: Bool = true { + didSet { + updateCornerRadius() + } + } + + func updateCornerRadius() { + if SdkConfiguration.stories.productsButtonCornerRadius != -1 { + layer.cornerRadius = SdkConfiguration.stories.productsButtonCornerRadius + } else { + layer.cornerRadius = rounded ? frame.size.height / 2 : 2 + } + } + + func configProductsButton(buttonData: StoriesElement) { + if (buttonData.products!.count != 0) { + if SdkConfiguration.stories.slideProductsButtonFontNameChanged != nil { + if SdkConfiguration.stories.slideProductsButtonFontSizeChanged != nil { + self.titleLabel?.font = UIFont(name: (SdkConfiguration.stories.slideProductsButtonFontNameChanged)!, size: (SdkConfiguration.stories.slideProductsButtonFontSizeChanged)!) + } else { + self.titleLabel?.font = UIFont(name: (SdkConfiguration.stories.slideProductsButtonFontNameChanged)!, size: 14) + } + } else { + if SdkConfiguration.stories.slideProductsButtonFontSizeChanged != nil { + self.titleLabel?.font = .systemFont(ofSize: SdkConfiguration.stories.slideProductsButtonFontSizeChanged!, weight: .bold) + } else { + self.titleLabel?.font = .systemFont(ofSize: 14, weight: .bold) + } + } + + setTitle(buttonData.labels?.showCarousel ?? SdkConfiguration.stories.defaultShowProductsButtonText, for: .normal) + if buttonData.labels?.showCarousel == "" { + setTitle(SdkConfiguration.stories.defaultShowProductsButtonText, for: .normal) + } + + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + + let angleUpIcon = UIImage(named: "angleUpBlack", in: frameworkBundle, compatibleWith: nil)?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate) + + if SdkConfiguration.isDarkMode { + if SdkConfiguration.stories.slideProductsButtonBackgroundColorChanged_Dark != nil { + self.backgroundColor = SdkConfiguration.stories.slideProductsButtonBackgroundColorChanged_Dark + } else { + self.backgroundColor = .white + } + } else { + if SdkConfiguration.stories.slideProductsButtonBackgroundColorChanged_Light != nil { + self.backgroundColor = SdkConfiguration.stories.slideProductsButtonBackgroundColorChanged_Light + } else { + self.backgroundColor = .white + } + } + + if SdkConfiguration.stories.productsButtonCornerRadius != -1 { + layer.cornerRadius = SdkConfiguration.stories.productsButtonCornerRadius + } else { + layer.cornerRadius = layer.frame.size.height/2 + } + layer.masksToBounds = true + + if SdkConfiguration.isDarkMode { + if SdkConfiguration.stories.slideProductsButtonTextColorChanged_Dark != nil { + if let components = SdkConfiguration.stories.slideProductsButtonTextColorChanged_Dark?.rgba { + self.setTitleColor(UIColor(red: components.red, green: components.green, blue: components.blue, alpha: components.alpha), for: .normal) + } else { + self.setTitleColor(.black, for: .normal) + } + self.addRightIconForProductsBtn(image: angleUpIcon!) + tintColor = SdkConfiguration.stories.slideProductsButtonTextColorChanged_Dark + } else { + setTitleColor(.black, for: .normal) + self.addRightIconForProductsBtn(image: angleUpIcon!) + tintColor = .black + } + } else { + if SdkConfiguration.stories.slideProductsButtonTextColorChanged_Light != nil { + if let components = SdkConfiguration.stories.slideProductsButtonTextColorChanged_Light?.rgba { + self.setTitleColor(UIColor(red: components.red, green: components.green, blue: components.blue, alpha: components.alpha), for: .normal) + } else { + self.setTitleColor(.black, for: .normal) + } + self.addRightIconForProductsBtn(image: angleUpIcon!) + tintColor = SdkConfiguration.stories.slideProductsButtonTextColorChanged_Light + } else { + setTitleColor(.black, for: .normal) + self.addRightIconForProductsBtn(image: angleUpIcon!) + tintColor = .black + } + } + + } else { + titleLabel?.font = .systemFont(ofSize: 17.0, weight: .semibold) + if SdkConfiguration.stories.productsButtonCornerRadius != -1 { + self.layer.cornerRadius = SdkConfiguration.stories.productsButtonCornerRadius + } else { + self.layer.cornerRadius = layer.frame.size.height/2 + } + self.layer.masksToBounds = true + } + super.layoutSubviews() + } + + @objc + public func didTapButton() { + + if let iosLink = _buttonData?.linkIos { + delegate?.openLinkIosExternal(url: iosLink) + return + } + if let link = _buttonData?.link { + delegate?.openDeepLink(url: link) + return + } + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setToDefaultProductsButton() + super.layoutSubviews() + } + + private func setToDefaultProductsButton() { + backgroundColor = .white + setTitle("", for: .normal) + if SdkConfiguration.stories.productsButtonCornerRadius != -1 { + layer.cornerRadius = SdkConfiguration.stories.productsButtonCornerRadius + } else { + layer.cornerRadius = layer.frame.size.height / 2 + } + layer.masksToBounds = true + super.layoutSubviews() + } +} + + +extension UIButton { + func addRightIconForProductsBtn(image: UIImage) { + + let imageView = UIImageView(image: image) + imageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(imageView) + + let length = CGFloat(21) + titleEdgeInsets.right += length + + NSLayoutConstraint.activate([ + imageView.leadingAnchor.constraint(equalTo: self.titleLabel!.trailingAnchor, constant: 6), + imageView.centerYAnchor.constraint(equalTo: self.titleLabel!.centerYAnchor, constant: 1), + imageView.widthAnchor.constraint(equalToConstant: length), + imageView.heightAnchor.constraint(equalToConstant: length) + ]) + } + + func setImageTintColor(_ color: UIColor) { + let tintedImage = self.imageView?.image?.withRenderingMode(.alwaysTemplate) + self.setImage(tintedImage, for: .normal) + self.tintColor = color + } +} diff --git a/Pods/REES46/REES46/Classes/Button/PromoCodeView.swift b/Pods/REES46/REES46/Classes/Button/PromoCodeView.swift new file mode 100644 index 0000000..1408816 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Button/PromoCodeView.swift @@ -0,0 +1,183 @@ +import UIKit + +class PromoCodeView: UIView { + var _promoData: StoriesPromoCodeElement? + + private let loadingPlaceholderView = LoadingPlaceholderView() + + let promoProductNameLabel = UILabel() + var promocodeSlideProductImage = UIImageView() + + init() { + super.init(frame: .zero) + setToDefault() + } + + func configPromoView(promoData: StoriesPromoCodeElement) { + promoProductNameLabel.removeFromSuperview() + + if (promoData.name != "") { + if SdkGlobalHelper.DeviceType.IS_IPHONE_14 || SdkGlobalHelper.DeviceType.IS_IPHONE_14_PLUS || SdkGlobalHelper.DeviceType.IS_IPHONE_XS_MAX || SdkGlobalHelper.DeviceType.IS_IPHONE_XS || SdkGlobalHelper.DeviceType.IS_IPHONE_SE || SdkGlobalHelper.DeviceType.IS_IPHONE_8_PLUS || SdkGlobalHelper.DeviceType.IS_IPHONE_5 { + promoProductNameLabel.frame = CGRect(x: frame.minX + 18, y: frame.minY + 72, width: frame.width - 60, height: 80) + } else { + promoProductNameLabel.frame = CGRect(x: frame.minX + 18, y: frame.minY + 116, width: frame.width - 60, height: 80) + } + promoProductNameLabel.text = promoData.name + promoProductNameLabel.numberOfLines = 0 + promoProductNameLabel.textAlignment = .left + + if SdkConfiguration.stories.promoCodeSlideFontNameChanged != nil { + if let customFont = UIFont(name: SdkConfiguration.stories.promoCodeSlideFontNameChanged!, size: 16) { + promoProductNameLabel.font = customFont + } + if SdkConfiguration.stories.promoCodeSlideFontSizeChanged != nil { + if let customFontWithSize = UIFont(name: SdkConfiguration.stories.promoCodeSlideFontNameChanged!, size: SdkConfiguration.stories.promoCodeSlideFontSizeChanged!) { + promoProductNameLabel.font = customFontWithSize + } + } + } else { + promoProductNameLabel.font = UIFont.systemFont(ofSize: 16, weight: .semibold) + if SdkConfiguration.stories.promoCodeSlideFontSizeChanged != nil { + promoProductNameLabel.font = UIFont.systemFont(ofSize: SdkConfiguration.stories.promoCodeSlideFontSizeChanged!, weight: .semibold) + } + } + + if SdkConfiguration.isDarkMode { + promoProductNameLabel.textColor = SdkConfiguration.stories.promoProductTitleTextColorDarkMode ?? .white + } else { + promoProductNameLabel.textColor = SdkConfiguration.stories.promoProductTitleTextColorLightMode ?? .white + } + + promoProductNameLabel.sizeToFit() + addSubview(promoProductNameLabel) + + promocodeSlideProductImage.backgroundColor = .clear + promocodeSlideProductImage.contentMode = .scaleAspectFit + promocodeSlideProductImage.layer.masksToBounds = true + promocodeSlideProductImage.layer.cornerRadius = 6.0 + promocodeSlideProductImage.layer.borderColor = UIColor.clear.cgColor + promocodeSlideProductImage.frame = CGRect(x: 18, y: frame.maxY / 2 - frame.size.width / 2, width: frame.size.width - 36, height: frame.size.width - 36) + + addSubview(promocodeSlideProductImage) + + let urlImgFullSize: String = promoData.image_url + let urlImgResize = URL(string: promoData.image_url_resized?.image_url_resized520 ?? urlImgFullSize) + + if urlImgResize != nil { + StoryBlockImageCache.image(for: urlImgResize!.absoluteString) { [self] cachedImage in + if cachedImage != nil { + let imageBorderRepresentation = cachedImage!.imageWithInsets(insets: UIEdgeInsets(top: 22, left: 22, bottom: 22, right: 22)) + if cachedImage!.hasAlpha { + DispatchQueue.main.async { + self.promocodeSlideProductImage.backgroundColor = .clear + self.promocodeSlideProductImage.layer.borderWidth = 0.0 + self.promocodeSlideProductImage.image = cachedImage + } + } else { + DispatchQueue.main.async { + self.promocodeSlideProductImage.backgroundColor = .white + self.promocodeSlideProductImage.layer.borderWidth = 22.0 + self.promocodeSlideProductImage.image = imageBorderRepresentation + } + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + self.loadingPlaceholderView.uncover(animated: false) + } + UIView.animate(withDuration: 0.2, animations: { + self.promocodeSlideProductImage.alpha = 1.0 + }, completion: { (b) in + //Do nothing + }) + } else { + + loadingPlaceholderView.gradientColor = .white + loadingPlaceholderView.backgroundColor = .clear + + UIView.animate(withDuration: 0.1, animations: { + self.loadingPlaceholderView.cover(self, animated: true) + }, completion: { (b) in + //Do nothing + }) + + let task = URLSession.shared.dataTask(with: urlImgResize!, completionHandler: { data, _, error in + if error == nil { + guard let unwrappedData = data, let downloadedImage = UIImage(data: unwrappedData) else { + return + } + + let imageBorderRepresentation = downloadedImage.imageWithInsets(insets: UIEdgeInsets(top: 22, left: 22, bottom: 22, right: 22)) + if downloadedImage.hasAlpha { + DispatchQueue.main.async { [self] in + self.promocodeSlideProductImage.backgroundColor = .clear + self.promocodeSlideProductImage.layer.borderWidth = 0.0 + self.promocodeSlideProductImage.image = downloadedImage + } + } else { + DispatchQueue.main.async { [self] in + self.promocodeSlideProductImage.backgroundColor = .white + self.promocodeSlideProductImage.layer.borderWidth = 22.0 + self.promocodeSlideProductImage.image = imageBorderRepresentation + } + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 1.8) { + self.loadingPlaceholderView.uncover(animated: true) + } + + DispatchQueue.main.async { [self] in + UIView.animate(withDuration: 1.8, animations: { + self.promocodeSlideProductImage.alpha = 1.0 + }, completion: { (b) in }) + } + + StoryBlockImageCache.save(downloadedImage, for: urlImgResize!.absoluteString) + } + }) + task.resume() + } + } + } + } + } + + private func setToDefault() { + self.backgroundColor = .clear + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setToDefault() + } +} + + +extension UIImage { + func imageWithInsets(insets: UIEdgeInsets) -> UIImage? { + UIGraphicsBeginImageContextWithOptions( + CGSize(width: self.size.width + insets.left + insets.right, + height: self.size.height + insets.top + insets.bottom), false, self.scale) + let _ = UIGraphicsGetCurrentContext() + let origin = CGPoint(x: insets.left, y: insets.top) + self.draw(at: origin) + let imageWithInsets = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return imageWithInsets + } +} + + +extension UIImage { + public var hasAlpha: Bool { + guard let alphaInfo = self.cgImage?.alphaInfo else { + return false + } + + switch alphaInfo { + case .none, .noneSkipLast, .noneSkipFirst: + return false + default: + return true + } + } +} diff --git a/Pods/REES46/REES46/Classes/Button/ReloadButton.swift b/Pods/REES46/REES46/Classes/Button/ReloadButton.swift new file mode 100644 index 0000000..b47c5e6 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Button/ReloadButton.swift @@ -0,0 +1,31 @@ +import UIKit + +class ReloadButton: UIButton { + init() { + super.init(frame: .zero) + setToDefault() + } + + func configReloadButton() { + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + setImage(UIImage(named: "iconReload", in: frameworkBundle, compatibleWith: nil), for: .normal) + addTarget(self, action: #selector(didTapReloadButton), for: .touchUpInside) + } + + private func setToDefault() { + self.layer.masksToBounds = true + } + + @objc + public func didTapReloadButton() { + print("didTapReloadButton") + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setToDefault() + } +} diff --git a/Pods/REES46/REES46/Classes/Button/StoryButton.swift b/Pods/REES46/REES46/Classes/Button/StoryButton.swift new file mode 100644 index 0000000..44f1385 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Button/StoryButton.swift @@ -0,0 +1,132 @@ +import UIKit + +protocol CustomButtonDelegate: AnyObject { + func openDeepLink(url: String) + func openLinkIosExternal(url: String) + func openLinkWebExternal(url: String) +} + +class StoryButton: UIButton { + + var _buttonData: StoriesElement? + weak var delegate: CustomButtonDelegate? + + init() { + super.init(frame: .zero) + setToDefault() + } + + func configButton(buttonData: StoriesElement) { + if SdkConfiguration.stories.slideDefaultButtonFontNameChanged != nil { + if SdkConfiguration.stories.slideDefaultButtonFontSizeChanged != 0.0 { + self.titleLabel?.font = SdkStyle.shared.currentColorScheme?.defaultButtonSelectFontName.withSize(SdkStyle.shared.currentColorScheme!.defaultButtonSelectFontSize) + } else { + self.titleLabel?.font = SdkStyle.shared.currentColorScheme?.defaultButtonSelectFontName.withSize(19.0) + } + } else { + if let backendFont = buttonData.textBold { + if SdkConfiguration.stories.slideDefaultButtonFontSizeChanged != nil { + self.titleLabel?.font = .systemFont(ofSize: SdkStyle.shared.currentColorScheme!.defaultButtonSelectFontSize, weight: .bold) + } else { + self.titleLabel?.font = .systemFont(ofSize: 17.0, weight: backendFont ? .bold : .regular) + } + } else { + if SdkConfiguration.stories.slideDefaultButtonFontSizeChanged != nil { + self.titleLabel?.font = .systemFont(ofSize: SdkStyle.shared.currentColorScheme!.defaultButtonSelectFontSize, weight: .regular) + } else { + self.titleLabel?.font = .systemFont(ofSize: 19.0, weight: .regular) + } + } + } + + self.setTitle(buttonData.title ?? "", for: .normal) + + if SdkConfiguration.stories.defaultButtonCornerRadius != -1 { + self.layer.cornerRadius = SdkConfiguration.stories.defaultButtonCornerRadius + } else { + self.layer.cornerRadius = CGFloat(buttonData.cornerRadius) + } + self.layer.masksToBounds = true + + if SdkConfiguration.isDarkMode { + if SdkConfiguration.stories.slideDefaultButtonBackgroundColorChanged_Dark != nil { + self.backgroundColor = SdkConfiguration.stories.slideDefaultButtonBackgroundColorChanged_Dark + } else { + if let bgColor = buttonData.background { + let color = bgColor.hexToRGB() + self.backgroundColor = UIColor(red: color.red, green: color.green, blue: color.blue, alpha: 1) + } else { + self.backgroundColor = .white + } + } + + if SdkConfiguration.stories.slideDefaultButtonTextColorChanged_Dark != nil { + if let components = SdkConfiguration.stories.slideDefaultButtonTextColorChanged_Dark?.rgba { + self.setTitleColor(UIColor(red: components.red, green: components.green, blue: components.blue, alpha: components.alpha), for: .normal) + } else { + self.setTitleColor(.black, for: .normal) + } + } else { + if let titleColor = buttonData.color { + let color = titleColor.hexToRGB() + self.setTitleColor(UIColor(red: color.red, green: color.green, blue: color.blue, alpha: 1), for: .normal) + } else { + self.setTitleColor(.black, for: .normal) + } + } + } else { + if SdkConfiguration.stories.slideDefaultButtonBackgroundColorChanged_Light != nil { + self.backgroundColor = SdkConfiguration.stories.slideDefaultButtonBackgroundColorChanged_Light + } else { + if let bgColor = buttonData.background { + let color = bgColor.hexToRGB() + self.backgroundColor = UIColor(red: color.red, green: color.green, blue: color.blue, alpha: 1) + } else { + self.backgroundColor = .white + } + } + + if SdkConfiguration.stories.slideDefaultButtonTextColorChanged_Light != nil { + if let components = SdkConfiguration.stories.slideDefaultButtonTextColorChanged_Light?.rgba { + self.setTitleColor(UIColor(red: components.red, green: components.green, blue: components.blue, alpha: components.alpha), for: .normal) + } else { + self.setTitleColor(.black, for: .normal) + } + } else { + if let titleColor = buttonData.color { + let color = titleColor.hexToRGB() + self.setTitleColor(UIColor(red: color.red, green: color.green, blue: color.blue, alpha: 1), for: .normal) + } else { + self.setTitleColor(.black, for: .normal) + } + } + } + } + + private func setToDefault() { + self.backgroundColor = .white + if SdkConfiguration.stories.productsButtonCornerRadius != -1 { + self.layer.cornerRadius = SdkConfiguration.stories.productsButtonCornerRadius + } else { + self.layer.cornerRadius = layer.frame.size.height / 2 + } + self.layer.masksToBounds = true + } + + @objc + public func didTapOnButton() { + if let iosLink = _buttonData?.linkIos { + delegate?.openLinkIosExternal(url: iosLink) + return + } + if let link = _buttonData?.link { + delegate?.openDeepLink(url: link) + return + } + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setToDefault() + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift b/Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift new file mode 100644 index 0000000..51c52d5 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift @@ -0,0 +1,256 @@ +import UIKit +import UserNotifications + +final public class VideoDownloadManager: NSObject { + + public typealias DownloadCompletionBlock = (_ error : Error?, _ fileUrl:URL?) -> Void + public typealias DownloadProgressBlock = (_ progress : CGFloat) -> Void + public typealias BackgroundDownloadCompletionHandler = () -> Void + + private var session: URLSession! + private var ongoingDownloads: [String : VideoDownloadObject] = [:] + private var backgroundSession: URLSession! + + public var backgroundCompletionHandler: BackgroundDownloadCompletionHandler? + public var showLocalNotificationOnBackgroundDownloadSuccess = true + public var localNotificationText: String? + + public static let shared: VideoDownloadManager = { + return VideoDownloadManager() + }() + + public func downloadStoryMediaFile(withRequest request: URLRequest, + inDirectory directory: String? = nil, + withName fileName: String? = nil, + shouldDownloadInBackground: Bool = false, + onProgress progressBlock:DownloadProgressBlock? = nil, + onCompletion completionBlock:@escaping DownloadCompletionBlock) -> String? { + + guard let url = request.url else { + print("SDK Request url is empty") + return nil + } + + if let _ = self.ongoingDownloads[url.absoluteString] { + return nil + } + var downloadTask: URLSessionDownloadTask + if shouldDownloadInBackground { + downloadTask = self.backgroundSession.downloadTask(with: request) + } else{ + downloadTask = self.session.downloadTask(with: request) + } + + let download = VideoDownloadObject(downloadTask: downloadTask, + progressBlock: progressBlock, + completionBlock: completionBlock, + fileName: fileName, + directoryName: directory) + + let key = self.getExDownloadKey(withUrl: url) + self.ongoingDownloads[key] = download + downloadTask.resume() + return key + } + + public func getExDownloadKey(withUrl url: URL) -> String { + return url.absoluteString + } + + public func currentDownloads() -> [String] { + return Array(self.ongoingDownloads.keys) + } + + public func cancelAllDownloads() { + for (_, download) in self.ongoingDownloads { + let downloadTask = download.downloadTask + downloadTask.cancel() + } + self.ongoingDownloads.removeAll() + } + + public func cancelDownload(forUniqueKey key:String?) { + let downloadStatus = self.isDownloadInProgress(forUniqueKey: key) + let presence = downloadStatus.0 + if presence { + if let download = downloadStatus.1 { + download.downloadTask.cancel() + self.ongoingDownloads.removeValue(forKey: key!) + } + } + } + + public func pause(forUniqueKey key:String?) { + let downloadStatus = self.isDownloadInProgress(forUniqueKey: key) + let presence = downloadStatus.0 + if presence { + if let download = downloadStatus.1 { + let downloadTask = download.downloadTask + downloadTask.suspend() + }} + } + + public func resume(forUniqueKey key:String?) { + let downloadStatus = self.isDownloadInProgress(forUniqueKey: key) + let presence = downloadStatus.0 + if presence { + if let download = downloadStatus.1 { + let downloadTask = download.downloadTask + downloadTask.resume() + }} + } + + public func isDownloadInProgress(forKey key:String?) -> Bool { + let downloadStatus = self.isDownloadInProgress(forUniqueKey: key) + return downloadStatus.0 + } + + public func alterDownload(withKey key: String?, + onProgress progressBlock:DownloadProgressBlock?, + onCompletion completionBlock:@escaping DownloadCompletionBlock) { + let downloadStatus = self.isDownloadInProgress(forUniqueKey: key) + let presence = downloadStatus.0 + if presence { + if let download = downloadStatus.1 { + download.progressBlock = progressBlock + download.completionBlock = completionBlock + } + } + } + + private func isDownloadInProgress(forUniqueKey key:String?) -> (Bool, VideoDownloadObject?) { + guard let key = key else { + return (false, nil) + } + + for (uniqueKey, download) in self.ongoingDownloads { + if key == uniqueKey { + return (true, download) + } + } + return (false, nil) + } + + private func showSdkDownloaderNotification(withText text:String) { + let notificationCenter = UNUserNotificationCenter.current() + notificationCenter.getNotificationSettings { (settings) in + guard settings.authorizationStatus == .authorized else { + //debugPrint("SDK not authorized to schedule notification") + return + } + + let content = UNMutableNotificationContent() + content.title = text + content.sound = UNNotificationSound.default + let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.1, repeats: false) + let identifier = "SDKSuccessDownloadManagerNotification" + let request = UNNotificationRequest(identifier: identifier, + content: content, trigger: trigger) + notificationCenter.add(request, withCompletionHandler: { (error) in + if let error = error { + debugPrint("SDK could not schedule notification with error: \(error)") + } + }) + } + } + + private override init() { + super.init() + let sessionConfiguration = URLSessionConfiguration.default + self.session = URLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: nil) + let backgroundConfiguration = URLSessionConfiguration.background(withIdentifier: Bundle.main.bundleIdentifier!) + self.backgroundSession = URLSession(configuration: backgroundConfiguration, delegate: self, delegateQueue: OperationQueue()) + } +} + +extension VideoDownloadManager : URLSessionDelegate, URLSessionDownloadDelegate { + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didFinishDownloadingTo location: URL) { + + let key = (downloadTask.originalRequest?.url?.absoluteString)! + if let download = self.ongoingDownloads[key] { + if let response = downloadTask.response { + let statusCode = (response as! HTTPURLResponse).statusCode + + guard statusCode < 400 else { + let error = NSError(domain:"HttpError", code:statusCode, userInfo:[NSLocalizedDescriptionKey : HTTPURLResponse.localizedString(forStatusCode: statusCode)]) + OperationQueue.main.addOperation({ + download.completionBlock(error, nil) + }) + return + } + let fileName = download.fileName ?? downloadTask.response?.suggestedFilename ?? (downloadTask.originalRequest?.url?.lastPathComponent)! + let directoryName = download.directoryName + + let fileMovingResult = VideoFileUtils.moveFile(fromUrl: location, toDirectory: directoryName, withName: fileName) + let didSucceed = fileMovingResult.0 + let error = fileMovingResult.1 + let finalFileUrl = fileMovingResult.2 + + OperationQueue.main.addOperation({ + (didSucceed ? download.completionBlock(nil, finalFileUrl) : download.completionBlock(error, nil)) + }) + } + } + self.ongoingDownloads.removeValue(forKey:key) + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) { + guard totalBytesExpectedToWrite > 0 else { + //debugPrint("SDK Could not calculate progress as total bytes to Write is less than 0") + return + } +// if let download = self.ongoingDownloads[(downloadTask.originalRequest?.url?.absoluteString)!], +// let progressBlock = download.progressBlock { +// let progress: CGFloat = CGFloat(totalBytesWritten) / CGFloat(totalBytesExpectedToWrite) +// //let percent = String(format:"%.0f", progress * 100) + "%" +// OperationQueue.main.addOperation({ +// progressBlock(progress) +// }) +// } + } + + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didCompleteWithError error: Error?) { + + if let error = error { + let downloadTask = task as! URLSessionDownloadTask + let key = (downloadTask.originalRequest?.url?.absoluteString)! + if let download = self.ongoingDownloads[key] { + OperationQueue.main.addOperation({ + download.completionBlock(error, nil) + }) + } + self.ongoingDownloads.removeValue(forKey:key) + } + } + + public func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) { + session.getTasksWithCompletionHandler { (dataTasks, uploadTasks, downloadTasks) in + if downloadTasks.count == 0 { + OperationQueue.main.addOperation({ + if let completion = self.backgroundCompletionHandler { + completion() + } + + if self.showLocalNotificationOnBackgroundDownloadSuccess { + var notificationText = "SDK Internal Notification Downloading task completed" + if let userNotificationText = self.localNotificationText { + notificationText = userNotificationText + } + + self.showSdkDownloaderNotification(withText: notificationText) + } + + self.backgroundCompletionHandler = nil + }) + } + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift b/Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift new file mode 100644 index 0000000..ae788fe --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift @@ -0,0 +1,24 @@ +import UIKit + +class VideoDownloadObject: NSObject { + + var completionBlock: VideoDownloadManager.DownloadCompletionBlock + var progressBlock: VideoDownloadManager.DownloadProgressBlock? + let downloadTask: URLSessionDownloadTask + let directoryName: String? + let fileName:String? + + init(downloadTask: URLSessionDownloadTask, + progressBlock: VideoDownloadManager.DownloadProgressBlock?, + completionBlock: @escaping VideoDownloadManager.DownloadCompletionBlock, + fileName: String?, + directoryName: String?) { + + self.downloadTask = downloadTask + self.completionBlock = completionBlock + self.progressBlock = progressBlock + self.fileName = fileName + self.directoryName = directoryName + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift b/Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift new file mode 100644 index 0000000..af89493 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift @@ -0,0 +1,44 @@ +import UIKit + +class VideoFileUtils: NSObject { + + static func moveFile(fromUrl url:URL, + toDirectory directory:String? , + withName name:String) -> (Bool, Error?, URL?) { + var newUrl:URL + if let directory = directory { + let directoryCreationResult = self.createDirectoryIfNotExists(withName: directory) + guard directoryCreationResult.0 else { + return (false, directoryCreationResult.1, nil) + } + newUrl = self.cacheDirectoryPath().appendingPathComponent(directory).appendingPathComponent(name) + } else { + newUrl = self.cacheDirectoryPath().appendingPathComponent(name) + } + do { + try FileManager.default.moveItem(at: url, to: newUrl) + return (true, nil, newUrl) + } catch { + return (false, error, nil) + } + } + + static func cacheDirectoryPath() -> URL { + let cachePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0] + return URL(fileURLWithPath: cachePath) + } + + static func createDirectoryIfNotExists(withName name:String) -> (Bool, Error?) { + let directoryUrl = self.cacheDirectoryPath().appendingPathComponent(name) + if FileManager.default.fileExists(atPath: directoryUrl.path) { + return (true, nil) + } + do { + try FileManager.default.createDirectory(at: directoryUrl, withIntermediateDirectories: true, attributes: nil) + return (true, nil) + } catch { + return (false, error) + } + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/InitService.swift b/Pods/REES46/REES46/Classes/Extensions/InitService.swift new file mode 100644 index 0000000..51224fd --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/InitService.swift @@ -0,0 +1,100 @@ +import Foundation + +enum KeychainError: LocalizedError { + case itemNotFound + case duplicateItem + case unexpectedStatus(OSStatus) +} + +public let sdkBundleId = Bundle(for: SimplePersonalizationSDK.self).bundleIdentifier ?? "com.bundle.ident.sdk-instanceKeychainService" +public let instanceKeychainService = Bundle(for: SimplePersonalizationSDK.self).bundleIdentifier ?? "com.bundle.ident.sdk-instanceKeychainService" + +public struct InitService { + + static func insertKeychainDidToken(_ token: Data, identifier: String, instanceKeychainService: String = instanceKeychainService) throws { + let attributes = [ + kSecClass: kSecClassGenericPassword, + kSecAttrService: instanceKeychainService, + kSecAttrAccount: identifier, + kSecValueData: token + ] as CFDictionary + + let status = SecItemAdd(attributes, nil) + guard status == errSecSuccess else { + if status == errSecDuplicateItem { + throw KeychainError.duplicateItem + } + throw KeychainError.unexpectedStatus(status) + } + } + + static func getKeychainDidToken(identifier: String, instanceKeychainService: String = instanceKeychainService) throws -> Data { + let query = [kSecClass: kSecClassGenericPassword, + kSecAttrService: instanceKeychainService, + kSecAttrAccount: identifier, + kSecMatchLimit: kSecMatchLimitOne, + kSecReturnData: true + ] as CFDictionary + + var res: AnyObject? + let status = SecItemCopyMatching(query, &res) + + guard status == errSecSuccess else { + if status == errSecItemNotFound { + throw KeychainError.itemNotFound + } + throw KeychainError.unexpectedStatus(status) + } + + return res as! Data + } + + static func updateKeychainDidToken(_ token: Data, identifier: String, instanceKeychainService: String = instanceKeychainService) throws { + let query = [ + kSecClass: kSecClassGenericPassword, + kSecAttrService: instanceKeychainService, + kSecAttrAccount: identifier + ] as CFDictionary + + let attributes = [ + kSecValueData: token + ] as CFDictionary + + let status = SecItemUpdate(query, attributes) + guard status == errSecSuccess else { + if status == errSecItemNotFound { + throw KeychainError.itemNotFound + } + throw KeychainError.unexpectedStatus(status) + } + } + + static func upsertKeychainDidToken(_ token: Data, identifier: String, instanceKeychainService: String = instanceKeychainService) throws { + do { + _ = try getKeychainDidToken(identifier: identifier, instanceKeychainService: instanceKeychainService) + try updateKeychainDidToken(token, identifier: identifier, instanceKeychainService: instanceKeychainService) + } catch KeychainError.itemNotFound { + try insertKeychainDidToken(token, identifier: identifier, instanceKeychainService: instanceKeychainService) + } + } + + public static func deleteKeychainDidToken(identifier: String, instanceKeychainService: String = instanceKeychainService) throws { + let query = [ + kSecClass: kSecClassGenericPassword, + kSecAttrService: instanceKeychainService, + kSecAttrAccount: identifier + ] as CFDictionary + + let status = SecItemDelete(query) + + if status == errSecItemNotFound { + print ("SDK Keychain errSecItemNotFound") + } else if status == errSecNoSuchKeychain { + print ("SDK Keychain errSecNoSuchKeychain") + } + + guard status == errSecSuccess || status == errSecItemNotFound else { + throw KeychainError.unexpectedStatus(status) + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift new file mode 100644 index 0000000..e4d9245 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift @@ -0,0 +1,25 @@ +import Foundation + +public protocol NetworkStatusObserver { + func startObserving() + func stopObserving() + func didChangeConnectionStatus(_ status: NetworkConnectionStatus) + func didChangeConnectionType(_ type: NetworkConnectionType?) +} + + +public extension NetworkStatusObserver { + internal var connectionObserverId: String { + get { + return String(unsafeBitCast(self, to: Int.self)) + } + } + + func startObserving() { + NetworkStatus.nManager.addObserver(observer: self) + } + + func stopObserving() { + NetworkStatus.nManager.removeObserver(observer: self) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift new file mode 100644 index 0000000..e4010eb --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift @@ -0,0 +1,48 @@ +import Foundation + +@available(iOS 13.0, macOS 10.15, *) +public class NetworkStatusObserverUI: ObservableObject { + + @Published + public var connectionStatus: NetworkConnectionStatus + + @Published + public var connectionType: NetworkConnectionType? + + private var hiddenObserver: HiddenObserver + + public init() { + self.hiddenObserver = HiddenObserver() + self.connectionStatus = .Offline + self.connectionType = .none + self.hiddenObserver.setExternalObserver(observer: self) + } + + class HiddenObserver: NetworkStatusObserver { + weak var externalObserver: NetworkStatusObserverUI? + + init() { + startObserving() + } + + func setExternalObserver(observer: NetworkStatusObserverUI) { + self.externalObserver = observer + } + + deinit { + stopObserving() + } + + public func didChangeConnectionStatus(_ status: NetworkConnectionStatus) { + DispatchQueue.main.async { + self.externalObserver?.connectionStatus = status + } + } + + public func didChangeConnectionType(_ type: NetworkConnectionType?) { + DispatchQueue.main.async { + self.externalObserver?.connectionType = type + } + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift new file mode 100644 index 0000000..dc7284f --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum NetworkConnectionStatus { + case Online + case Offline +} diff --git a/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift new file mode 100644 index 0000000..4ddc031 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift @@ -0,0 +1,21 @@ +import Foundation + +public enum NetworkConnectionType: Equatable, CustomStringConvertible { + case cellular(radioType: NetworkRadioType) + case wifi + case ethernet + case notdetected + + public var description: String { + switch self { + case .cellular(let radioType): + return "Cellular(" + radioType.description + ")" + case .wifi: + return "WiFi" + case .ethernet: + return "Ethernet" + case .notdetected: + return "AirplaneMode" + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift new file mode 100644 index 0000000..57d3114 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift @@ -0,0 +1,24 @@ +import Foundation + +public enum NetworkRadioType: CustomStringConvertible { + case notdeterminedcellular + case _2G + case _3G + case _4G + case _5G + + public var description: String { + switch self { + case .notdeterminedcellular: + return "NotDeterminedCellular" + case ._2G: + return "2G" + case ._3G: + return "3G" + case ._4G: + return "4G" + case ._5G: + return "5G" + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/Navigation.swift b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/Navigation.swift new file mode 100644 index 0000000..d7954f8 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/Navigation.swift @@ -0,0 +1,34 @@ +import Foundation +import UIKit + +public class DefaultNavigation: UINavigationController { + var isDark = false { + didSet { + setNeedsStatusBarAppearanceUpdate() + } + } + var hide = true { + didSet { + self.navigationBar.setBackgroundImage(UIImage(), for: .default) + self.navigationBar.backgroundColor = UIColor.clear + self.navigationBar.shadowImage = UIImage() + } + } + public override var preferredStatusBarStyle: UIStatusBarStyle { + return isDark ? .lightContent : .default + } +} + +class Navigation { + private let window: UIWindow? + init(window: UIWindow ) { + self.window = window + } + + func startApp() { + let root = DefaultNavigation(rootViewController: StoryViewController()) + window!.rootViewController = root + window!.makeKeyAndVisible() + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift new file mode 100644 index 0000000..adab458 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift @@ -0,0 +1,126 @@ +import Network +#if os(iOS) +import CoreTelephony +#endif + + +public class NetworkStatus { + + public static var nManager: NetworkStatus = NetworkStatus() + + private let monitor: NWPathMonitor + + public var semaphore: DispatchSemaphore? = DispatchSemaphore(value: 0) + + public var connectionStatus: NetworkConnectionStatus { + didSet { + for observer in observers.values { + observer.didChangeConnectionStatus(connectionStatus) + } + } + } + + public var connectionType: NetworkConnectionType? { + didSet { + for observer in observers.values { + observer.didChangeConnectionType(connectionType) + } + } + } + + private var observers: [String: NetworkStatusObserver] + + private init() { + connectionStatus = .Offline + connectionType = .none + observers = [:] + monitor = NWPathMonitor.init() + + monitor.pathUpdateHandler = { path in + self.setConnection(path: path) + } + + monitor.start(queue: DispatchQueue.global(qos: .default)) + + semaphore?.wait() + semaphore = nil + } + + private func setConnection(path: NWPath) { + var newConnectionStatus: NetworkConnectionStatus = .Offline + var newConnectionType: NetworkConnectionType? = nil + + guard path.status == .satisfied else { + newConnectionStatus = .Offline + newConnectionType = .none + if self.connectionStatus != newConnectionStatus { + self.connectionStatus = newConnectionStatus + } + if self.connectionType != newConnectionType { + self.connectionType = newConnectionType + } + semaphore?.signal() + return + } + + newConnectionStatus = .Online + + if path.usesInterfaceType(.cellular) { + #if os(iOS) + let networkInfo = CTTelephonyNetworkInfo() + guard let currentRadio = networkInfo.serviceCurrentRadioAccessTechnology?.values.first else { + newConnectionType = .cellular(radioType: .notdeterminedcellular) + return + } + switch currentRadio { + case CTRadioAccessTechnologyGPRS, CTRadioAccessTechnologyEdge, CTRadioAccessTechnologyCDMA1x: + newConnectionType = .cellular(radioType: ._2G) + case CTRadioAccessTechnologyWCDMA, CTRadioAccessTechnologyHSDPA, CTRadioAccessTechnologyHSUPA, CTRadioAccessTechnologyCDMAEVDORev0, CTRadioAccessTechnologyCDMAEVDORevA, CTRadioAccessTechnologyCDMAEVDORevB, CTRadioAccessTechnologyeHRPD: + newConnectionType = .cellular(radioType: ._3G) + case CTRadioAccessTechnologyLTE: + newConnectionType = .cellular(radioType: ._4G) + default: + if #available(iOS 14.1, *) { + switch currentRadio { + case CTRadioAccessTechnologyNRNSA, CTRadioAccessTechnologyNR: + newConnectionType = .cellular(radioType: ._5G) + default: + newConnectionType = .cellular(radioType: .notdeterminedcellular) + } + } else { + newConnectionType = .cellular(radioType: .notdeterminedcellular) + } + } + #else + newConnectionType = .cellular(radioType: .notdeterminedcellular) + #endif + } else if path.usesInterfaceType(.wifi) { + newConnectionType = .wifi + } else if path.usesInterfaceType(.wiredEthernet) { + newConnectionType = .ethernet + } + + if self.connectionStatus != newConnectionStatus { + self.connectionStatus = newConnectionStatus + } + + if self.connectionType != newConnectionType { + self.connectionType = newConnectionType + } + semaphore?.signal() + } + + internal func addObserver(observer: NetworkStatusObserver) { + observer.didChangeConnectionStatus(connectionStatus) + observer.didChangeConnectionType(connectionType) + observers[observer.connectionObserverId] = observer + } + + internal func removeObserver(observer: NetworkStatusObserver) { + observers[observer.connectionObserverId] = nil + } + + deinit { + monitor.cancel() + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift new file mode 100755 index 0000000..59b72b3 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift @@ -0,0 +1,239 @@ +import UIKit +import Foundation + +public class SdkGlobalHelper { + + public class var sharedInstance: SdkGlobalHelper { + struct Static { + static let instance: SdkGlobalHelper = SdkGlobalHelper() + } + return Static.instance + } + + init() { + } + + public struct ScreenSize { + static let SCREEN_WIDTH = UIScreen.main.bounds.size.width + static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height + static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) + static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) + } + + public struct DeviceType { + public static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0 + public static let IS_IPHONE_SE = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0 + public static let IS_IPHONE_8_PLUS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0 + public static let IS_IPHONE_XS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0 + public static let IS_IPHONE_XS_MAX = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 896.0 + public static let IS_IPHONE_14 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 844.0 + public static let IS_IPHONE_14_PRO = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 852.0 + public static let IS_IPHONE_14_PLUS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 926.0 + public static let IS_IPHONE_14_PRO_MAX = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 932.0 + } + + public func getSdkDocumentsDirectory() -> URL { + let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) + return paths[0] + } + + public func willDeviceHaveDynamicIsland() -> Bool { + if let simulatorModelIdentifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] { + let nameSimulator = simulatorModelIdentifier + return nameSimulator == "iPhone15,2" || nameSimulator == "iPhone15,3" || nameSimulator == "iPhone15,4" || nameSimulator == "iPhone15,5" || nameSimulator == "iPhone16,1" || nameSimulator == "iPhone16,2" ? true : false + } + + var sysinfo = utsname() + uname(&sysinfo) + let name = String(bytes: Data(bytes: &sysinfo.machine, count: Int(_SYS_NAMELEN)), encoding: .ascii)!.trimmingCharacters(in: .controlCharacters) + return name == "iPhone15,2" || name == "iPhone15,3" || name == "iPhone15,4" || name == "iPhone15,5" || name == "iPhone16,1" || name == "iPhone16,2" ? true : false + } + + public func saveVideoParamsToDictionary(parentSlideId: String, paramsDictionary: [String:String]) { + var stringValuesToSave: [String:String] = [:] + + for key in paramsDictionary.keys { + let valueToStore = paramsDictionary[key]! + let keyVideoStr: String = key + let durationVideoStr: String = valueToStore + + stringValuesToSave[keyVideoStr] = durationVideoStr + } + UserDefaults.standard.setValue(stringValuesToSave, forKeyPath: parentSlideId) + } + + func retrieveVideoCachedParamsDictionary(parentSlideId: String) -> [String:String] { + let savedDownloadedVideosValues: [String:String] = UserDefaults.standard.object(forKey: parentSlideId) as? [String : String] ?? [String:String]() + + var convertedDurationsDictionary:[String:String] = [:] + for key in savedDownloadedVideosValues.keys { + let keyVideoStr: String = key + let durationVideoStr: String = savedDownloadedVideosValues[key]! + convertedDurationsDictionary[keyVideoStr] = durationVideoStr + } + + return convertedDurationsDictionary + } +} + + +extension DispatchQueue { + private static var _onceTracker = [String]() + + class func onceTechService( + file: String = #file, + function: String = #function, + line: Int = #line, + block: () -> Void + ) { + let token = "\(file):\(function):\(line)" + onceTechService(token: token, block: block) + } + + class func onceTechService( + token: String, + block: () -> Void + ) { + objc_sync_enter(self) + defer { objc_sync_exit(self) } + + guard !_onceTracker.contains(token) else { + return + } + + _onceTracker.append(token) + block() + } +} + + +extension UIImage { + func withRoundedCorners(radius: CGFloat? = nil) -> UIImage? { + let maxRadius = min(size.width, size.height) / 2 + let cornerRadius: CGFloat + + if let radius = radius, radius > 0 && radius <= maxRadius { + cornerRadius = radius + } else { + cornerRadius = maxRadius + } + + UIGraphicsBeginImageContextWithOptions(size, false, scale) + + let rect = CGRect(origin: .zero, size: size) + UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius).addClip() + draw(in: rect) + + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return image + } +} + + +extension UIColor { + convenience init(red: Int, green: Int, blue: Int) { + assert(red >= 0 && red <= 255, "Invalid red component") + assert(green >= 0 && green <= 255, "Invalid green component") + assert(blue >= 0 && blue <= 255, "Invalid blue component") + + self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1.0) + } + + convenience init(rgb: Int) { + self.init( + red: (rgb >> 16) & 0xFF, + green: (rgb >> 8) & 0xFF, + blue: rgb & 0xFF + ) + } +} + + +extension UIColor { + public class func hexStringFromColor(color: UIColor) -> String { + let components = color.cgColor.components + + if components?.count == 2 { + let r: CGFloat = components?[0] ?? 0.0 + let g: CGFloat = components?[0] ?? 0.0 + let b: CGFloat = components?[0] ?? 0.0 + + let hexString = String.init(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255))) + //print(hexString) + return hexString + } else { + let r: CGFloat = components?[0] ?? 0.0 + let g: CGFloat = components?[1] ?? 0.0 + let b: CGFloat = components?[2] ?? 0.0 + + let hexString = String.init(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)), lroundf(Float(b * 255))) + //print(hexString) + return hexString + } + } + + public var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) { + var red: CGFloat = 0 + var green: CGFloat = 0 + var blue: CGFloat = 0 + var alpha: CGFloat = 0 + getRed(&red, green: &green, blue: &blue, alpha: &alpha) + + return (red, green, blue, alpha) + } + + + public static let sdkDefaultWhiteColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.9) + public static let sdkDefaultBlackColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.9) + public static let sdkDefaultOrangeColor = UIColor(red: 252/255, green: 107/255, blue: 63/255, alpha: 1.0) + public static let sdkDefaultBlueColor = UIColor(red: 23/255, green: 170/255, blue: 223/255, alpha: 1.0) + public static let sdkDefaultYellowColor = UIColor(red: 251/255, green: 184/255, blue: 0/255, alpha: 1.0) + public static let sdkDefaultGreenColor = UIColor(red: 94/255, green: 193/255, blue: 105/255, alpha: 1.0) +} + + +extension String { + func localizeUI(withComment comment: String? = nil) -> String { + return NSLocalizedString(self, comment: comment ?? "") + } +} + + +extension Int { + static func parseIntSymbols(from string: String) -> Int? { + Int(string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) + } +} + + +extension Error { + var errorCode:Int? { + return (self as NSError).code + } +} + + +extension UIView { + func fixInView(_ container: UIView!) { + translatesAutoresizingMaskIntoConstraints = false + frame = container.frame + container.addSubview(self) + NSLayoutConstraint(item: self, attribute: .leading, relatedBy: .equal, toItem: container, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true + NSLayoutConstraint(item: self, attribute: .trailing, relatedBy: .equal, toItem: container, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true + NSLayoutConstraint(item: self, attribute: .top, relatedBy: .equal, toItem: container, attribute: .top, multiplier: 1.0, constant: 0).isActive = true + NSLayoutConstraint(item: self, attribute: .bottom, relatedBy: .equal, toItem: container, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true + } +} + + +extension NSObject { + func safeRemoveObserver(_ observer: NSObject, forKeyPath keyPath: String) { + switch self.observationInfo { + case .some: + self.removeObserver(observer, forKeyPath: keyPath) + default: break + //debugPrint("SDK Error deleting Observer does not exist") + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift new file mode 100644 index 0000000..b2e5576 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift @@ -0,0 +1,63 @@ +import Foundation + +public class ManagedViewConfig { + public static let configurationKey = "com.sdk.configuration.managed" + public static let feedbackKey = "com.sdk.feedback.managed" + + public static let shared = ManagedViewConfig() + + public typealias GrabStateFunction = ([String: Any?]) -> Void + + private var configGrabStates = [GrabStateFunction]() + private var feedbackGrabStates = [GrabStateFunction]() + + init() { + NotificationCenter.default.addObserver(self, selector: #selector(ManagedViewConfig.didChange), name: UserDefaults.didChangeNotification, object: nil) + } + + public func addViewAppConfigChangedGrabState(_ appConfigChangedGrabState: @escaping GrabStateFunction) { + configGrabStates.append(appConfigChangedGrabState) + } + + public func addAppFeedbackChangedGrabState(_ appFeedbackChangedGrabState: @escaping GrabStateFunction) { + feedbackGrabStates.append(appFeedbackChangedGrabState) + } + + @objc + func didChange() { + if let configDict = UserDefaults.standard.dictionary(forKey: Self.configurationKey) { + for hook in configGrabStates { + hook(configDict) + } + } + if let feedbackDict = UserDefaults.standard.dictionary(forKey: Self.feedbackKey) { + for hook in feedbackGrabStates { + hook(feedbackDict) + } + } + } + + public func getConfigValue(forKey: String) -> Any? { + if let sdkConfig = UserDefaults.standard.dictionary(forKey: Self.configurationKey) { + return sdkConfig[forKey] + } + return nil + } + + public func getFeedbackValue(forKey: String) -> Any? { + if let sdkConfigFeedback = UserDefaults.standard.dictionary(forKey: Self.feedbackKey) { + return sdkConfigFeedback[forKey] + } + return nil + } + + public func updateStoredValue(_ value: Any, forKey: String) { + if var sdkConfigFeedback = UserDefaults.standard.dictionary(forKey: Self.feedbackKey) { + sdkConfigFeedback[forKey] = value + UserDefaults.standard.set(sdkConfigFeedback, forKey: Self.feedbackKey) + } else { + let feedbackDict = [forKey: value] + UserDefaults.standard.set(feedbackDict, forKey: Self.feedbackKey) + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift new file mode 100644 index 0000000..6b03eca --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift @@ -0,0 +1,125 @@ +import Foundation + +protocol SettingsManageable { + func settingsAddr() -> URL + func toDictionary() -> [String: Any?]? + func update() -> Bool + mutating func preload() -> Bool + mutating func preloadUsingSettingsFile() -> Bool + func delete() -> Bool + mutating func reset() -> Bool +} + + +extension SettingsManageable where Self: Codable { + + func settingsAddr() -> URL { + let cachesDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0] + return cachesDirectory.appendingPathComponent("\(Self.self).plist") + } + + func toDictionary() -> [String: Any?]? { + do { + if FileManager.default.fileExists(atPath: settingsAddr().path) { + let fileContents = try Data(contentsOf: settingsAddr()) + let dictionary = try PropertyListSerialization.propertyList(from: fileContents, options: .mutableContainersAndLeaves, format: nil) as? [String: Any?] + return dictionary + } + } catch { + print(error.localizedDescription) + } + + return nil + } + + func update() -> Bool { + do { + let encoded = try PropertyListEncoder().encode(self) + try encoded.write(to: settingsAddr()) + return true + } catch { + print(error.localizedDescription) + return false + } + } + + mutating func preload() -> Bool { + if FileManager.default.fileExists(atPath: settingsAddr().path) { + do { + let fileContents = try Data(contentsOf: settingsAddr()) + self = try PropertyListDecoder().decode(Self.self, from: fileContents) + return true + } catch { + print(error.localizedDescription) + return false + } + } else { + if update() { + backupSettingsFile() + return true + } else { + return false + } + } + } + + mutating func preloadUsingSettingsFile() -> Bool { + guard let originalSettingsURL = Bundle.main.url(forResource: "\(Self.self)", withExtension: "plist") else { + return false + } + + do { + if !FileManager.default.fileExists(atPath: settingsAddr().path) { + try FileManager.default.copyItem(at: originalSettingsURL, to: settingsAddr()) + } + + let fileContents = try Data(contentsOf: settingsAddr()) + self = try PropertyListDecoder().decode(Self.self, from: fileContents) + return true + } catch { + print(error.localizedDescription) + return false + } + } + + func delete() -> Bool { + do { + try FileManager.default.removeItem(at: settingsAddr()) + return true + } catch { + print(error.localizedDescription) + return false + } + } + + private func backupSettingsFile() { + do { + try FileManager.default.copyItem(at: settingsAddr(), to: settingsAddr().appendingPathExtension("init")) + } catch { + print(error.localizedDescription) + } + } + + private func restoreSettingsFile() -> Bool { + do { + try FileManager.default.copyItem(at: settingsAddr().appendingPathExtension("init"), to: settingsAddr()) + return true + } catch { + print(error.localizedDescription) + return false + } + } + + mutating func reset() -> Bool { + if delete() { + if !preloadUsingSettingsFile() { + if restoreSettingsFile() { + return preload() + } + } else { + return true + } + } + return false + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift new file mode 100644 index 0000000..96e3803 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift @@ -0,0 +1,46 @@ +import Foundation + +@propertyWrapper public struct ViewConfigPlain { + + private final class Listener { + + var subscriber: NSObjectProtocol? + var value: Value? + + func listenTo(store: UserDefaults, key: String, defaultValue: Value) { + if subscriber == nil { + ViewConfigService.configShared.use(userDefaults: store) + value = ViewConfigService.configShared.value(for: key, store) ?? defaultValue + + subscriber = NotificationCenter.default.addObserver(forName: .sdkConfigChanged, object: store, queue: nil) { [weak self] _ in + guard let self = self else { + return + } + self.value = ViewConfigService.configShared.value(for: key, store) ?? defaultValue + } + } + } + + deinit { + NotificationCenter.default.removeObserver(self, name: .sdkConfigChanged, object: nil) + } + } + + private var listener = Listener() + + private let defaultValue: Value + + public var wrappedValue: Value { + listener.value ?? defaultValue + } + + public init(wrappedValue defaultValue: Value, _ key: String, store: UserDefaults = UserDefaults.standard) { + self.defaultValue = defaultValue + listener.listenTo(store: store, key: key, defaultValue: defaultValue) + } + + public init(_ key: String, store: UserDefaults = UserDefaults.standard) where Value: ExpressibleByNilLiteral { + self.defaultValue = nil + listener.listenTo(store: store, key: key, defaultValue: nil) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift new file mode 100644 index 0000000..7e8ba08 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift @@ -0,0 +1,42 @@ +import Foundation + +extension Notification.Name { + public static let sdkConfigChanged = Self("sdkConfigChanged") +} + +class ViewConfigService { + static let configShared = ViewConfigService() + + private var dictionaries: [UserDefaults: [String: Any]] = [:] + private var observers: [UserDefaults: any NSObjectProtocol] = [:] + + func use(userDefaults: UserDefaults) { + + if dictionaries[userDefaults] == nil { + + dictionaries[userDefaults] = userDefaults.dictionary(forKey: ManagedViewConfig.configurationKey) ?? [:] + let center = NotificationCenter.default + observers[userDefaults] = center.addObserver(forName: UserDefaults.didChangeNotification, + object: userDefaults, + queue: .main) { [weak self] (note: Notification) in + guard let self = self else { + return + } + + if let defaults = note.object as? UserDefaults { + let newValues = defaults.dictionary(forKey: ManagedViewConfig.configurationKey) ?? [:] + let mustNotify = !newValues.isEmpty || !(self.dictionaries[defaults]?.isEmpty ?? true) + self.dictionaries[defaults] = newValues + + if mustNotify { + NotificationCenter.default.post(name: .sdkConfigChanged, object: defaults) + } + } + } + } + } + + func value(for key: String, _ defaults: UserDefaults) -> T? { + dictionaries[defaults]?[key] as? T + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift new file mode 100644 index 0000000..bc49b6e --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift @@ -0,0 +1,174 @@ +import Foundation +import UIKit + +public enum PromocodeBannerLocation { + case topLeft + case topRight + case bottomLeft + case bottomRight +} + +public class PromocodeBanner: UIView { + + static var SDK_OPEN: Bool = false + static var MAX_ALLOWED_BANNERS: Int = 999 + + internal static var OPEN_PROMOCODE_BANNERS: Int = 0 + + internal var location: PromocodeBannerLocation + + public var size: CGSize { + didSet { self.updateFrame() } + } + + public var padding: (CGFloat, CGFloat) { + didSet { self.updateFrame() } + } + + public var cornerRadius: CGFloat { + didSet { + self.layer.cornerRadius = cornerRadius + self.updateFrame() + self.updateSubviews() + } + } + + public var displayTime: Double + + public var animationDuration: Double + + public required init?(coder aDecoder: NSCoder) { + location = .bottomRight + size = CGSize(width: 100, height: 50) + padding = (20, 20) + cornerRadius = 0 + displayTime = 1 + animationDuration = 1 + super.init(coder: aDecoder) + + self.config() + } + + public init(location: PromocodeBannerLocation) { + self.location = location + self.size = CGSize(width: 100, height: 50) + self.padding = (20, 20) + self.cornerRadius = 0 + self.displayTime = 1 + self.animationDuration = 1 + + switch location { + case .topLeft: + super.init(frame: CGRect(x: padding.0, y: padding.1, width: size.width, height: size.height)) + break + case .topRight: + super.init(frame: CGRect(x: UIScreen.main.bounds.maxX - size.width - padding.0, y: padding.1, width: size.width, height: size.height)) + break + case .bottomLeft: + super.init(frame: CGRect(x: padding.0, y: UIScreen.main.bounds.height - size.height - padding.1, width: size.width, height: size.height)) + break + case .bottomRight: + super.init(frame: CGRect(x: UIScreen.main.bounds.maxX - size.width - padding.0, y: UIScreen.main.bounds.height - size.height - padding.1, width: size.width, height: size.height)) + break + } + + self.config() + } + + private func config() { + backgroundColor = .clear + } + + private func updateFrame() { + switch location { + case .topLeft: + self.frame = CGRect(x: padding.0, y: padding.1, width: size.width, height: size.height) + break + case .topRight: + self.frame = CGRect(x: UIScreen.main.bounds.maxX - size.width - padding.0, y: padding.1, width: size.width, height: size.height) + break + case .bottomLeft: + self.frame = CGRect(x: padding.0, y: UIScreen.main.bounds.height - size.height - padding.1, width: size.width, height: size.height) + break + case .bottomRight: + self.frame = CGRect(x: UIScreen.main.bounds.maxX - size.width - padding.0, y: UIScreen.main.bounds.height - size.height - padding.1, width: size.width, height: size.height) + break + } + } + + internal func updateSubviews() { + for view in subviews { + view.frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height) + view.layer.cornerRadius = self.cornerRadius + } + } + + public func setView(view: UIView) { + view.frame = CGRect(x: 0, y: 0, width: frame.width, height: frame.height) + view.clipsToBounds = true + addSubview(view) + } + + internal func startTimer() { + if displayTime == 0 { + return + } + + let _ = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(PromocodeBanner.decrementTimer(timer:)), userInfo: nil, repeats: true) + } + + @objc + private func decrementTimer(timer: Timer) { + if displayTime > 0 { + displayTime -= 1 + } else { + timer.invalidate() + dismiss() + } + } + + public func dismissWithoutAnimation() { + self.updateSubviews() + self.removeFromSuperview() + } + + public func dismiss() { + switch location { + case .topLeft: + UIView.animate(withDuration: self.animationDuration, animations: { + self.frame = CGRect(x: self.padding.0, y: self.padding.1, width: 0, height: self.size.height) + self.updateSubviews() + }, completion: { (b) in + self.removeFromSuperview() + }) + break + case .topRight: + UIView.animate(withDuration: self.animationDuration, animations: { + self.frame = CGRect(x: UIScreen.main.bounds.maxX - self.padding.0, y: self.padding.1, width: 0, height: self.size.height) + self.updateSubviews() + }, completion: { (b) in + self.removeFromSuperview() + }) + break + case .bottomLeft: + UIView.animate(withDuration: self.animationDuration, animations: { + self.frame = CGRect(x: self.padding.0, y: UIScreen.main.bounds.height - self.size.height - self.padding.1, width: 0, height: self.size.height) + self.updateSubviews() + }, completion: { (b) in + self.removeFromSuperview() + }) + break + case .bottomRight: + UIView.animate(withDuration: self.animationDuration, animations: { + self.frame = CGRect(x: UIScreen.main.bounds.width - self.padding.0, y: UIScreen.main.bounds.height - self.size.height - self.padding.1, width: 0, height: self.size.height) + self.updateSubviews() + }, completion: { (b) in + self.removeFromSuperview() + }) + break + } + + PromocodeBanner.SDK_OPEN = false + PromocodeBanner.OPEN_PROMOCODE_BANNERS -= 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift new file mode 100644 index 0000000..156beb2 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift @@ -0,0 +1,377 @@ +import QuartzCore +import UIKit + +@available(iOSApplicationExtension, unavailable) + +public protocol SdkPopupAlertViewScheme { + func SdkPopupAlertView() -> String +} + +public class SdkPopupAlertView: UIView { + public enum TextAlignment { + case left + case center + case right + } + + public enum Position { + case top + case centerCustom + case bottom + } + + override public var bounds: CGRect { + didSet { + setupRealShadow() + } + } + + private let position: Position + private var initialTransform: CGAffineTransform { + switch position { + case .top: + return CGAffineTransform(translationX: 0, y: -100) + case .centerCustom: + return CGAffineTransform(translationX: 0, y: -100) + case .bottom: + return CGAffineTransform(translationX: 0, y: 100) + } + } + private let hStack: UIStackView = { + let stackView = UIStackView() + stackView.alignment = .center + return stackView + }() + + private lazy var vStack: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.alignment = vStackAlignment + return stackView + }() + + private let titleLabel: UILabel = { + let label = UILabel() + label.numberOfLines = 0 //1 + + if #available(iOS 13.0, *) { + label.textColor = .black //.label + } else { + label.textColor = .black + } + return label + }() + + private var popupDefaultBackgroundColor: UIColor? { + return traitCollection.userInterfaceStyle == .dark ? lightBackgroundColor : lightBackgroundColor + } + + private var vStackAlignment: UIStackView.Alignment { + switch textAlignment { + case .left: + return .leading + case .center: + return .center + case .right: + return .trailing + } + } + + private var onTap: (() -> ())? + + public var autoRealHide = true + public var displayRealAlertTime: TimeInterval = 2.7 + public var showAnimationDuration = 0.3 + public var hideAnimationDuration = 0.3 + public var hideOnTap = true + + public var textAlignment: TextAlignment = .center { + didSet { + vStack.alignment = vStackAlignment + } + } + + public var titleTextColor: UIColor = .black { + didSet { + titleLabel.textColor = titleTextColor + } + } + + public var darkBackgroundColor = UIColor(red: 0.13, green: 0.13, blue: 0.13, alpha: 1.00) { + didSet { + backgroundColor = popupDefaultBackgroundColor + } + } + + public var lightBackgroundColor = UIColor(red: 0.99, green: 0.99, blue: 0.99, alpha: 1.00) { + didSet { + backgroundColor = popupDefaultBackgroundColor + } + } + + private var sdkPopupOverlayWindow: SdkPopupAlertViewWindow? + + public init(title: String, + titleFont: UIFont = .systemFont(ofSize: 17, weight: .semibold), + subtitle: String? = nil, + subtitleFont: UIFont = .systemFont(ofSize: 17, weight: .semibold), + icon: UIImage? = nil, + iconSpacing: CGFloat = 16, + position: Position = .top, + onTap: (() -> ())? = nil) { + + self.position = position + + super.init(frame: .zero) + + backgroundColor = popupDefaultBackgroundColor + + hStack.spacing = iconSpacing + + titleLabel.font = titleFont + titleLabel.textAlignment = .center + titleLabel.text = title + vStack.addArrangedSubview(titleLabel) + + if let icon = icon { + let iconImageView = UIImageView() + iconImageView.contentMode = .scaleAspectFit + iconImageView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + iconImageView.widthAnchor.constraint(equalToConstant: 28), + iconImageView.heightAnchor.constraint(equalToConstant: 28) + ]) + + if #available(iOS 13.0, *) { + iconImageView.tintColor = .black //.label + } else { + iconImageView.tintColor = .black + } + + iconImageView.image = icon + hStack.addArrangedSubview(iconImageView) + + } else { + + let iconImageView = UIImageView() + iconImageView.contentMode = .scaleAspectFit + iconImageView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + iconImageView.widthAnchor.constraint(equalToConstant: 26), + iconImageView.heightAnchor.constraint(equalToConstant: 26) + ]) + + if #available(iOS 13.0, *) { + iconImageView.tintColor = .black //.label + } else { + iconImageView.tintColor = .black + } + + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + let copyIcon = UIImage(named: "iconCopyDark", in: frameworkBundle, compatibleWith: nil)?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate) + iconImageView.image = copyIcon + hStack.addArrangedSubview(iconImageView) + } + + if let subtitle = subtitle { + let subtitleLabel = UILabel() + + if #available(iOS 13.0, *) { + subtitleLabel.textColor = .black + } else { + subtitleLabel.textColor = .lightGray + } + + subtitleLabel.textAlignment = .center + subtitleLabel.numberOfLines = 0 + subtitleLabel.font = subtitleFont + subtitleLabel.text = "\n" + subtitle + "\n" + vStack.addArrangedSubview(subtitleLabel) + } + + self.onTap = onTap + let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTap)) + addGestureRecognizer(tapGestureRecognizer) + + hStack.addArrangedSubview(vStack) + addSubview(hStack) + + transform = initialTransform + clipsToBounds = true + } + + func prepareForShowing() { + sdkPopupOverlayWindow = SdkPopupAlertViewWindow(SdkPopupAlertView: self) + setupRealdefaultConstraints(position: position) + setupRealStackViewdefaultConstraints() + sdkPopupOverlayWindow?.isHidden = false + } + + override public func layoutSubviews() { + super.layoutSubviews() + layer.cornerRadius = bounds.height / 2 + } + + public func showHapticFeedbackType(haptic: UINotificationFeedbackGenerator.FeedbackType? = nil) { + if let hapticType = haptic { + UINotificationFeedbackGenerator().notificationOccurred(hapticType) + } + show() + } + + public func show() { + if sdkPopupOverlayWindow == nil { + prepareForShowing() + } else { + return + } + UIView.animate(withDuration: showAnimationDuration, delay: 0.0, options: .curveEaseOut, animations: { + self.transform = .identity + }) { [self] _ in + if autoRealHide { + hide(after: displayRealAlertTime) + } + } + } + + public func hide(after time: TimeInterval = 0.0) { + DispatchQueue.main.asyncAfter(deadline: .now() + time) { + UIView.animate(withDuration: self.hideAnimationDuration, delay: 0, options: .curveEaseIn, animations: { [self] in + transform = initialTransform + }) { [self] _ in + removeFromSuperview() + sdkPopupOverlayWindow = nil + } + } + } + + public func hideImmediately() { + removeFromSuperview() + sdkPopupOverlayWindow = nil + } + + override public func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + backgroundColor = popupDefaultBackgroundColor + } + + private func setupRealdefaultConstraints(position: Position) { + guard let superview = superview else { + return + } + translatesAutoresizingMaskIntoConstraints = false + + var defaultConstraints = [ + centerXAnchor.constraint(equalTo: superview.centerXAnchor), + leadingAnchor.constraint(greaterThanOrEqualTo: superview.leadingAnchor, constant: 8), + trailingAnchor.constraint(lessThanOrEqualTo: superview.trailingAnchor, constant: -8), + heightAnchor.constraint(greaterThanOrEqualToConstant: 50) + ] + + switch position { + case .top: + if SdkGlobalHelper.DeviceType.IS_IPHONE_14 || SdkGlobalHelper.DeviceType.IS_IPHONE_14_PLUS || SdkGlobalHelper.DeviceType.IS_IPHONE_XS_MAX || SdkGlobalHelper.DeviceType.IS_IPHONE_XS || SdkGlobalHelper.DeviceType.IS_IPHONE_SE || SdkGlobalHelper.DeviceType.IS_IPHONE_8_PLUS || SdkGlobalHelper.DeviceType.IS_IPHONE_5 { + defaultConstraints += [ + topAnchor.constraint(equalTo: superview.layoutMarginsGuide.topAnchor, constant: 68), + bottomAnchor.constraint(lessThanOrEqualTo: superview.layoutMarginsGuide.bottomAnchor, constant: -8) + ] + } else { + defaultConstraints += [ + topAnchor.constraint(equalTo: superview.layoutMarginsGuide.topAnchor, constant: 90), + bottomAnchor.constraint(lessThanOrEqualTo: superview.layoutMarginsGuide.bottomAnchor, constant: -8) + ] + } + case .centerCustom: + defaultConstraints += [ + topAnchor.constraint(equalTo: superview.layoutMarginsGuide.topAnchor, constant: SdkConfiguration.stories.storiesSlideReloadPopupPositionY), + bottomAnchor.constraint(lessThanOrEqualTo: superview.layoutMarginsGuide.bottomAnchor, constant: -8) + ] + case .bottom: + defaultConstraints += [ + bottomAnchor.constraint(equalTo: superview.layoutMarginsGuide.bottomAnchor, constant: -8), + topAnchor.constraint(greaterThanOrEqualTo: superview.layoutMarginsGuide.topAnchor, constant: 8) + ] + } + NSLayoutConstraint.activate(defaultConstraints) + } + + private func setupRealStackViewdefaultConstraints() { + hStack.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + hStack.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 54), + hStack.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -54), + hStack.topAnchor.constraint(equalTo: topAnchor, constant: 8), + hStack.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8) + ]) + } + + private func setupRealShadow() { + layer.masksToBounds = false + layer.shadowOffset = CGSize(width: 0, height: 4) + layer.shadowColor = UIColor.black.withAlphaComponent(0.08).cgColor + layer.shadowRadius = 8 + layer.shadowOpacity = 1 + } + + @objc + private func didTap() { + if hideOnTap { + hide() + } + onTap?() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + + +@available(iOSApplicationExtension, unavailable) + +class SdkPopupAlertViewWindow: UIWindow { + init(SdkPopupAlertView: SdkPopupAlertView) { + if #available(iOS 13.0, *) { + if let activeForegroundScene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene { + super.init(windowScene: activeForegroundScene) + } else if let inactiveForegroundScene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundInactive }) as? UIWindowScene { + super.init(windowScene: inactiveForegroundScene) + } else { + super.init(frame: UIScreen.main.bounds) + } + } else { + super.init(frame: UIScreen.main.bounds) + } + rootViewController = UIViewController() + windowLevel = .alert + rootViewController?.view.addSubview(SdkPopupAlertView) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + if let rootViewController = self.rootViewController, + let SdkPopupAlertView = rootViewController.view.subviews.first as? SdkPopupAlertView { + return SdkPopupAlertView.frame.contains(point) + } + return false + } +} + + +extension RawRepresentable where RawValue == String { + public func SdkPopupAlertView() -> String { + let str = String(describing: type(of: self)) + rawValue + return str + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift new file mode 100644 index 0000000..c035a05 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift @@ -0,0 +1,149 @@ +import Foundation +import UIKit + +public extension UICollectionViewCell { + + func showInCellPromocodeBanner(promoBanner: PromocodeBanner) { + if PromocodeBanner.OPEN_PROMOCODE_BANNERS >= PromocodeBanner.MAX_ALLOWED_BANNERS { + return + } else { + PromocodeBanner.OPEN_PROMOCODE_BANNERS += 1 + } + + let needToSetup: CGRect = promoBanner.frame + + switch promoBanner.location { + case .topLeft: + promoBanner.frame = CGRect(x: promoBanner.frame.minX, y: promoBanner.frame.minY, width: 0, height: promoBanner.frame.height) + promoBanner.updateSubviews() + break + case .topRight: + promoBanner.frame = CGRect(x: promoBanner.frame.minX + promoBanner.frame.width, y: promoBanner.frame.minY, width: 0, height: promoBanner.frame.height) + promoBanner.updateSubviews() + break + case .bottomLeft: + promoBanner.frame = CGRect(x: promoBanner.frame.minX, y: promoBanner.frame.minY, width: 0, height: promoBanner.frame.height) + promoBanner.updateSubviews() + break + case .bottomRight: + promoBanner.frame = CGRect(x: promoBanner.frame.minX + promoBanner.frame.width, y: promoBanner.frame.minY, width: 0, height: promoBanner.frame.height) + promoBanner.updateSubviews() + break + } + + contentView.addSubview(promoBanner) + contentView.bringSubviewToFront(promoBanner) + + UIView.setAnimationCurve(UIView.AnimationCurve.easeOut) + switch promoBanner.location { + case .topLeft: + UIView.animate(withDuration: promoBanner.animationDuration, animations: { + promoBanner.frame = CGRect(x: promoBanner.frame.minX, y: promoBanner.frame.minY, width: needToSetup.width, height: promoBanner.frame.height) + promoBanner.updateSubviews() + }, completion: { (b) in + promoBanner.startTimer() + }) + break + case .topRight: + UIView.animate(withDuration: promoBanner.animationDuration, animations: { + promoBanner.frame = CGRect(x: needToSetup.minX, y: promoBanner.frame.minY, width: needToSetup.width, height: promoBanner.frame.height) + promoBanner.updateSubviews() + }, completion: { (b) in + promoBanner.startTimer() + }) + break + case .bottomLeft: + UIView.animate(withDuration: promoBanner.animationDuration, animations: { + promoBanner.frame = CGRect(x: promoBanner.frame.minX, y: promoBanner.frame.minY, width: needToSetup.width, height: promoBanner.frame.height) + promoBanner.updateSubviews() + }, completion: { (b) in + promoBanner.startTimer() + }) + break + case .bottomRight: + UIView.animate(withDuration: promoBanner.animationDuration, animations: { + promoBanner.frame = CGRect(x: needToSetup.minX, y: promoBanner.frame.minY, width: needToSetup.width, height: promoBanner.frame.height) + promoBanner.updateSubviews() + }, completion: { (b) in + promoBanner.startTimer() + }) + break + } + + promoBanner.frame = needToSetup + } +} + + +public extension UIViewController { + + func showInViewPromocodeBanner(promoBanner: PromocodeBanner) { + if PromocodeBanner.OPEN_PROMOCODE_BANNERS >= PromocodeBanner.MAX_ALLOWED_BANNERS { + return + } else { + PromocodeBanner.OPEN_PROMOCODE_BANNERS += 1 + } + + let needToSetup: CGRect = promoBanner.frame + + switch promoBanner.location { + case .topLeft: + promoBanner.frame = CGRect(x: promoBanner.frame.minX, y: promoBanner.frame.minY, width: 0, height: promoBanner.frame.height) + promoBanner.updateSubviews() + break + case .topRight: + promoBanner.frame = CGRect(x: promoBanner.frame.minX + promoBanner.frame.width, y: promoBanner.frame.minY, width: 0, height: promoBanner.frame.height) + promoBanner.updateSubviews() + break + case .bottomLeft: + promoBanner.frame = CGRect(x: promoBanner.frame.minX, y: promoBanner.frame.minY, width: 0, height: promoBanner.frame.height) + promoBanner.updateSubviews() + break + case .bottomRight: + promoBanner.frame = CGRect(x: promoBanner.frame.minX + promoBanner.frame.width, y: promoBanner.frame.minY, width: 0, height: promoBanner.frame.height) + promoBanner.updateSubviews() + break + } + + self.view.addSubview(promoBanner) + self.view.bringSubviewToFront(promoBanner) + + UIView.setAnimationCurve(UIView.AnimationCurve.easeOut) + switch promoBanner.location { + case .topLeft: + UIView.animate(withDuration: promoBanner.animationDuration, animations: { + promoBanner.frame = CGRect(x: promoBanner.frame.minX, y: promoBanner.frame.minY, width: needToSetup.width, height: promoBanner.frame.height) + promoBanner.updateSubviews() + }, completion: { (b) in + promoBanner.startTimer() + }) + break + case .topRight: + UIView.animate(withDuration: promoBanner.animationDuration, animations: { + promoBanner.frame = CGRect(x: needToSetup.minX, y: promoBanner.frame.minY, width: needToSetup.width, height: promoBanner.frame.height) + promoBanner.updateSubviews() + }, completion: { (b) in + promoBanner.startTimer() + }) + break + case .bottomLeft: + UIView.animate(withDuration: promoBanner.animationDuration, animations: { + promoBanner.frame = CGRect(x: promoBanner.frame.minX, y: promoBanner.frame.minY, width: needToSetup.width, height: promoBanner.frame.height) + promoBanner.updateSubviews() + }, completion: { (b) in + promoBanner.startTimer() + }) + break + case .bottomRight: + UIView.animate(withDuration: promoBanner.animationDuration, animations: { + promoBanner.frame = CGRect(x: needToSetup.minX, y: promoBanner.frame.minY, width: needToSetup.width, height: promoBanner.frame.height) + promoBanner.updateSubviews() + }, completion: { (b) in + promoBanner.startTimer() + }) + break + } + + promoBanner.frame = needToSetup + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift new file mode 100644 index 0000000..a98382c --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift @@ -0,0 +1,54 @@ +import UIKit + +extension UIView { + private struct AssociatedObjectKey { + static var isC = "isC" + static var path = "coverablePath" + } + + @IBInspectable + open var isC: Bool { + get { + let settedValue = objc_getAssociatedObject(self, AssociatedObjectKey.isC) as? Bool + return settedValue ?? engh + } + set { + objc_setAssociatedObject(self, + AssociatedObjectKey.isC, + newValue, + .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + public var coverablePath: UIBezierPath? { + get { + let settedCoverablePath = objc_getAssociatedObject(self, + AssociatedObjectKey.path) as? UIBezierPath + return settedCoverablePath ?? (self as? Coverable)?.defaultCoverablePath + } + set { + objc_setAssociatedObject(self, + AssociatedObjectKey.path, + newValue, + .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + private var engh: Bool { + return bounds.width > 5 && bounds.height > 5 + } + + fileprivate var sub: UIBezierPath { + return coverableSubviews() + .reduce(UIBezierPath(), { totalBezierPath, coverableView in + coverableView.addCoverablePath(to: totalBezierPath, superview: self) + return totalBezierPath + }) + } + +} + + +extension UIImageView: Coverable { + // Coverable +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift new file mode 100644 index 0000000..9a5ebaa --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift @@ -0,0 +1,59 @@ +import UIKit + +public protocol Coverable { + var defaultCoverablePath: UIBezierPath? { get } +} + +typealias CoverableView = UIView & Coverable + +extension Coverable where Self: UIView { + + func makeCoverablePath(superview: UIView? = nil) -> UIBezierPath? { + guard let superview = superview ?? self.superview else { + return nil + } + + layoutIfNeeded() + let offsetPoint = convert(bounds, to: superview).origin + let relativePath = coverablePath ?? UIBezierPath() + relativePath.translate(to: offsetPoint) + return relativePath + } + + func addCoverablePath(to totalCoverablePath: UIBezierPath, superview: UIView? = nil) { + guard let coverablePath = makeCoverablePath(superview: superview) else { + return + } + totalCoverablePath.append(coverablePath) + } + + public var defaultCoverablePath: UIBezierPath? { + return UIBezierPath(roundedRect: bounds, + cornerRadius: layer.cornerRadius) + } +} + + +extension Array where Element: CoverableView { + var coverablePath: UIBezierPath { + return reduce(UIBezierPath(), { totalPath, cell in + cell.addCoverablePath(to: totalPath) + return totalPath + }) + } +} + + +extension UIView { + func coverableSubviews() -> [CoverableView] { + var foundedViews = [CoverableView]() + subviews.forEach { view in + if let coverableView = view as? CoverableView & UIView, coverableView.isC { + foundedViews.append(coverableView) + } else { + foundedViews += view.coverableSubviews() + } + } + return foundedViews + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift new file mode 100755 index 0000000..b522606 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift @@ -0,0 +1,211 @@ +import UIKit + +open class LoadingPlaceholderView: UIView { + + public struct gradientConfiguration { + + public var width: Double = 0.2 + public var animationDuration: TimeInterval = 0.7 + public var backgroundColor: UIColor = .clear + public var primaryColor: UIColor = .clear + public var secondaryColor: UIColor = .clear + + fileprivate mutating func mainGradCnfgColor(_ color: UIColor) { + backgroundColor = color.withBrightness(brightness: 0.98) + primaryColor = color.withBrightness(brightness: 0.88) + secondaryColor = color.withBrightness(brightness: 0.75) + } + + init(color: UIColor) { + mainGradCnfgColor(color) + } + } + + open var promocodeDuration: TimeInterval = 1.75 + open var promocodeGradient = gradientConfiguration(color: .white) + + open var gradientColor: UIColor = .clear { + didSet { + promocodeGradient.mainGradCnfgColor(gradientColor) + } + } + + private var viewToCover: UIView? + private var maskLayer = CAShapeLayer() + private var gradientLayer = CAGradientLayer() + private var viewToConverObservation: NSKeyValueObservation? + private var isCovering: Bool { + return superview != nil + } + + public func cover(_ viewToCover: UIView, animated: Bool = true) { + viewToCover.layoutIfNeeded() + setupView(viewToCover: viewToCover) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { [weak self] in + self?.startLoading(animated: animated) + } + } + + public func uncover(animated: Bool = true) { + guard isCovering else { + return + } + + fadeOut(animated: animated) + let dispatchTime: DispatchTime = .now() + promocodeDuration + DispatchQueue.main.asyncAfter(deadline: dispatchTime) { [weak self] in + self?.removeGradientAndMask() + self?.removeFromSuperview() + } + } + + deinit { + if let observer = viewToConverObservation { + observer.invalidate() + removeObserver(observer, forKeyPath: "bounds") + } + viewToConverObservation = nil + } + + private func setupView(viewToCover: UIView) { + self.viewToCover = viewToCover + self.frame = viewToCover.bounds + viewToConverObservation = observe(\.bounds) { [weak self] _, _ in + if self?.isCovering == true { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + self?.setupMaskLayerIfNeeded() + self?.setupGradientLayerIfNeeded() + } + } + } + } + + private func startLoading(animated: Bool) { + guard !isCovering, let viewToCover = viewToCover else { + return + } + + viewToCover.addSubview(self) + translatesAutoresizingMaskIntoConstraints = false + frame = viewToCover.bounds + NSLayoutConstraint.activate([ + topAnchor.constraint(equalTo: viewToCover.topAnchor), + bottomAnchor.constraint(equalTo: viewToCover.bottomAnchor), + leftAnchor.constraint(equalTo: viewToCover.leftAnchor), + rightAnchor.constraint(equalTo: viewToCover.rightAnchor) + ]) + setupMaskLayerIfNeeded() + setupGradientLayerIfNeeded() + setupGradientLayerAnimation() + fadeIn(animated: animated) + } + + private func setupMaskLayerIfNeeded() { + guard let superview = superview else { + return + } + + maskLayer.frame = superview.bounds + let toalBezierPath = superview + .coverableSubviews() + .reduce(UIBezierPath(), { totalBezierPath, coverableView in + coverableView.addCoverablePath(to: totalBezierPath, superview: superview) + return totalBezierPath + }) + maskLayer.path = toalBezierPath.cgPath + maskLayer.fillColor = UIColor.red.cgColor + layer.addSublayer(maskLayer) + } + + private func setupGradientLayerIfNeeded() { + guard let superview = superview else { + return + } + + gradientLayer.frame = CGRect(x: 0, + y: 0, + width: superview.bounds.size.width, + height: superview.bounds.size.height) + superview.layer.addSublayer(gradientLayer) + gradientLayer.startPoint = CGPoint(x: -1 - promocodeGradient.width*2, y: 0) + gradientLayer.endPoint = CGPoint(x: 1 + promocodeGradient.width*2, y: 0) + + gradientLayer.colors = [ + promocodeGradient.backgroundColor.cgColor, + promocodeGradient.primaryColor.cgColor, + promocodeGradient.secondaryColor.cgColor, + promocodeGradient.primaryColor.cgColor, + promocodeGradient.backgroundColor.cgColor + ] + + let startLocations = [NSNumber(value: Double(gradientLayer.startPoint.x)), + NSNumber(value: Double(gradientLayer.startPoint.x)), + NSNumber(value: 0), + NSNumber(value: promocodeGradient.width), + NSNumber(value: 1 + promocodeGradient.width)] + + gradientLayer.locations = startLocations + gradientLayer.cornerRadius = superview.layer.cornerRadius + layer.addSublayer(gradientLayer) + gradientLayer.mask = maskLayer + } + + private func setupGradientLayerAnimation() { + let gradientAnimation = CABasicAnimation(keyPath: "locations") + gradientAnimation.fromValue = gradientLayer.locations + gradientAnimation.toValue = [NSNumber(value: 0), + NSNumber(value: 1), + NSNumber(value: 1), + NSNumber(value: 1 + promocodeGradient.width), + NSNumber(value: 1 + promocodeGradient.width)] + + gradientAnimation.repeatCount = .infinity + gradientAnimation.isRemovedOnCompletion = false + gradientAnimation.duration = promocodeGradient.animationDuration + gradientLayer.add(gradientAnimation, forKey: "locations") + } + + private func fadeIn(animated: Bool) { + guard + animated + else { + self.alpha = 1 + return + } + let opacityAnimation = CABasicAnimation(keyPath: "opacity") + opacityAnimation.fromValue = alpha + opacityAnimation.toValue = 1 + opacityAnimation.duration = promocodeDuration + gradientLayer.add(opacityAnimation, forKey: "opacityAnimationIn") + + UIView.animate(withDuration: promocodeDuration) { + self.alpha = 1 + } + } + + private func fadeOut(animated: Bool) { + guard + animated + else { + self.alpha = 0 + return + } + + let opacityAnimation = CABasicAnimation(keyPath: "opacity") + opacityAnimation.fromValue = alpha + opacityAnimation.toValue = 0 + opacityAnimation.duration = promocodeDuration + + gradientLayer.add(opacityAnimation, forKey: "opacityAnimationOut") + + UIView.animate(withDuration: promocodeDuration) { + self.alpha = 0 + } + } + + private func removeGradientAndMask() { + gradientLayer.removeAllAnimations() + gradientLayer.removeFromSuperlayer() + maskLayer.removeFromSuperlayer() + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift new file mode 100644 index 0000000..51b0ff5 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift @@ -0,0 +1,28 @@ +import UIKit + +extension UIBezierPath { + + static func multiLinePath(numberOfLines: Int, + spacing: CGFloat, + bounds: CGRect) -> UIBezierPath { + let numberOfLinesFloat = CGFloat(numberOfLines) + let height = bounds.height + let lineHeight = CGFloat((height - ((numberOfLinesFloat - 1) * spacing))/numberOfLinesFloat) + let totalPath = UIBezierPath() + for index in 0.. CALayer { + let containerLayer = createContainerLayer(size) + let path = createStarPath(starPoints, size: size, lineWidth: lineWidth) + + let shapeLayer = createShapeLayer(path.cgPath, lineWidth: lineWidth, fillColor: fillColor, strokeColor: strokeColor, size: size) + containerLayer.addSublayer(shapeLayer) + + return containerLayer + } + + static func create(image: UIImage, size: Double) -> CALayer { + let containerLayer = createContainerLayer(size) + let imageLayer = createContainerLayer(size) + + containerLayer.addSublayer(imageLayer) + imageLayer.contents = image.cgImage + imageLayer.contentsGravity = CALayerContentsGravity.resizeAspect + + return containerLayer + } + + static func createShapeLayer(_ path: CGPath, lineWidth: Double, fillColor: UIColor, strokeColor: UIColor, size: Double) -> CALayer { + let layer = CAShapeLayer() + layer.anchorPoint = CGPoint() + layer.contentsScale = UIScreen.main.scale + layer.strokeColor = strokeColor.cgColor + layer.fillColor = fillColor.cgColor + layer.lineWidth = CGFloat(lineWidth) + layer.bounds.size = CGSize(width: size, height: size) + layer.masksToBounds = true + layer.path = path + layer.isOpaque = true + return layer + } + + static func createContainerLayer(_ size: Double) -> CALayer { + let layer = CALayer() + layer.contentsScale = UIScreen.main.scale + layer.anchorPoint = CGPoint() + layer.masksToBounds = true + layer.bounds.size = CGSize(width: size, height: size) + layer.isOpaque = true + return layer + } + + static func createStarPath(_ starPoints: [CGPoint], size: Double, lineWidth: Double) -> UIBezierPath { + + let lineWidthLocal = lineWidth + ceil(lineWidth * 0.3) + let sizeWithoutLineWidth = size - lineWidthLocal * 2 + + let points = scaleStar(starPoints, factor: sizeWithoutLineWidth / 100, + lineWidth: lineWidthLocal) + + let path = UIBezierPath() + path.move(to: points[0]) + let remainingPoints = Array(points[1.. [CGPoint] { + return starPoints.map { point in + return CGPoint( + x: point.x * CGFloat(factor) + CGFloat(lineWidth), + y: point.y * CGFloat(factor) + CGFloat(lineWidth) + ) + } + } +} + + +struct RecommendationsStarsAccessibility { + + static func update(_ view: UIView, rating: Double, text: String?, starsSetupSettings: RecommendationsStarsSettings) { + view.isAccessibilityElement = true + + view.accessibilityTraits = starsSetupSettings.reloadOnUserTouch ? UIAccessibilityTraits.adjustable : UIAccessibilityTraits.none + + var accessibilityLabel = "Rating" + + if let text = text, text != "" { + accessibilityLabel += " \(text)" + } + + view.accessibilityLabel = accessibilityLabel + + view.accessibilityValue = accessibilityValue(view, rating: rating, starsSetupSettings: starsSetupSettings) + } + + static func accessibilityValue(_ view: UIView, rating: Double, starsSetupSettings: RecommendationsStarsSettings) -> String { + let accessibilityRating = RecommendationsStarsRating.showRatingStFromPreciseStRating(rating, fillMode: starsSetupSettings.fillMode, summaryRecommendationsStars: starsSetupSettings.summaryRecommendationsStars) + + let isInteger = (accessibilityRating * 10).truncatingRemainder(dividingBy: 10) == 0 + + if isInteger { + return "\(Int(accessibilityRating))" + } else { + let roundedToFirstDecimalPlace = Double( round(10 * accessibilityRating) / 10 ) + return "\(roundedToFirstDecimalPlace)" + } + } + + static func accessibilityIncrement(_ rating: Double, starsSetupSettings: RecommendationsStarsSettings) -> Double { + var increment: Double = 0 + + switch starsSetupSettings.fillMode { + case .full: + increment = ceil(rating) - rating + if increment == 0 { + increment = 1 + } + + case .half, .precise: + increment = (ceil(rating * 2) - rating * 2) / 2 + if increment == 0 { + increment = 0.5 + } + } + + if rating >= Double(starsSetupSettings.summaryRecommendationsStars) { increment = 0 } + + let roundedToFirstDecimalPlace = Double( round(10 * increment) / 10 ) + return roundedToFirstDecimalPlace + } + + static func accessibilityDecrement(_ rating: Double, starsSetupSettings: RecommendationsStarsSettings) -> Double { + var increment: Double = 0 + + switch starsSetupSettings.fillMode { + case .full: + increment = rating - floor(rating) + if increment == 0 { + increment = 1 + } + + case .half, .precise: + increment = (rating * 2 - floor(rating * 2)) / 2 + if increment == 0 { + increment = 0.5 + } + } + + if rating <= starsSetupSettings.minStTchRating { increment = 0 } + + let roundedToFirstDecimalPlace = Double( round(10 * increment) / 10 ) + return roundedToFirstDecimalPlace + } +} + + +class RecommendationsStarsText { + class func position(_ layer: CALayer, starsSize: CGSize, textMargin: Double) { + layer.position.x = starsSize.width + CGFloat(textMargin) + let yOffset = (starsSize.height - layer.bounds.height) / 2 + layer.position.y = yOffset + } +} + + +struct RecommendationsStarsDefaultSettings { + + init() {} + + static let sColor = SdkConfiguration.recommendations.widgetStarsColor.hexToRGB() + static let defaultStarsColor = UIColor(red: sColor.red, green: sColor.green, blue: sColor.blue, alpha: 1) // UIColor(red: 255/255, green: 149/255, blue: 0/255, alpha: 1) + + static let emptyBorderColor = defaultStarsColor + static let emptyBorderWidth: Double = 4 / Double(UIScreen.main.scale) + + static let filledBorderColor = defaultStarsColor + static let filledBorderWidth: Double = 1 / Double(UIScreen.main.scale) + + static let emptyColor = UIColor.clear + static let filledColor = defaultStarsColor + + static let fillMode = StarFillMode.full + static let rating: Double = 2.718281828 + static let rateStMargin: Double = 2 + + static let starPoints: [CGPoint] = [ + CGPoint(x: 49.5, y: 0.0), + CGPoint(x: 60.5, y: 35.0), + CGPoint(x: 99.0, y: 35.0), + CGPoint(x: 67.5, y: 58.0), + CGPoint(x: 78.5, y: 92.0), + CGPoint(x: 49.5, y: 71.0), + CGPoint(x: 20.5, y: 92.0), + CGPoint(x: 31.5, y: 58.0), + CGPoint(x: 0.0, y: 35.0), + CGPoint(x: 38.5, y: 35.0) + ] + + static var starSize: Double = 21 + static let summaryRecommendationsStars = 5 + static let textColor = UIColor(red: 127/255, green: 127/255, blue: 127/255, alpha: 1) + static let textFont = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.footnote) + static let textMargin: Double = 5 + static var textSize: Double { + get { + return Double(textFont.pointSize) + } + } + + static let minStTchRating: Double = 1 + static let passUserTchToSuperview = true + static let reloadOnUserTouch = true +} + + +class RecommendationsStarsSize { + class func calculateSizeToFitLayers(_ layers: [CALayer]) -> CGSize { + var size = CGSize() + + for layer in layers { + if layer.frame.maxX > size.width { + size.width = layer.frame.maxX + } + if layer.frame.maxY > size.height { + size.height = layer.frame.maxY + } + } + + return size + } +} + + +class RecommendationsStarsLayers { + class func createRecommendstarViewLayer(_ rating: Double, starsSetupSettings: RecommendationsStarsSettings, isactionRightStarsToLeft: Bool) -> [CALayer] { + + var ratingRetranslator = RecommendationsStarsRating.numberOfFilledRateStars(rating, totalNumberOfStars: starsSetupSettings.summaryRecommendationsStars) + var starViewLayer = [CALayer]() + + for _ in (0.. CALayer { + + if rateStFillLevel >= 1 { + return createRecommendStarLayer(true, starsSetupSettings: starsSetupSettings) + } + + if rateStFillLevel == 0 { + return createRecommendStarLayer(false, starsSetupSettings: starsSetupSettings) + } + + return createPartialStar(rateStFillLevel, starsSetupSettings: starsSetupSettings, isactionRightStarsToLeft: isactionRightStarsToLeft) + } + + class func createPartialStar(_ rateStFillLevel: Double, starsSetupSettings: RecommendationsStarsSettings, isactionRightStarsToLeft: Bool) -> CALayer { + let filledStar = createRecommendStarLayer(true, starsSetupSettings: starsSetupSettings) + let emptyStar = createRecommendStarLayer(false, starsSetupSettings: starsSetupSettings) + + let parentLayer = CALayer() + parentLayer.contentsScale = UIScreen.main.scale + parentLayer.bounds = CGRect(origin: CGPoint(), size: filledStar.bounds.size) + parentLayer.anchorPoint = CGPoint() + parentLayer.addSublayer(emptyStar) + parentLayer.addSublayer(filledStar) + + if isactionRightStarsToLeft { + let rotationScope = CATransform3DMakeRotation(CGFloat(Double.pi), 0, 1, 0) + filledStar.transform = CATransform3DTranslate(rotationScope, -filledStar.bounds.size.width, 0, 0) + } + + filledStar.bounds.size.width *= CGFloat(rateStFillLevel) + + return parentLayer + } + + private class func createRecommendStarLayer(_ isFilled: Bool, starsSetupSettings: RecommendationsStarsSettings) -> CALayer { + if let image = isFilled ? starsSetupSettings.filledImage : starsSetupSettings.emptyImage { + return RecommendStarLayer.create(image: image, size: starsSetupSettings.starSize) + } + + let fillColor = isFilled ? starsSetupSettings.filledColor : starsSetupSettings.emptyColor + let strokeColor = isFilled ? starsSetupSettings.filledBorderColor : starsSetupSettings.emptyBorderColor + + return RecommendStarLayer.create(starsSetupSettings.starPoints, + size: starsSetupSettings.starSize, + lineWidth: isFilled ? starsSetupSettings.filledBorderWidth : starsSetupSettings.emptyBorderWidth, + fillColor: fillColor, + strokeColor: strokeColor) + } + + class func poseRecommendstarViewLayer(_ layers: [CALayer], rateStMargin: Double) { + var positionX:CGFloat = 0 + + for layer in layers { + layer.position.x = positionX + positionX += layer.bounds.width + CGFloat(rateStMargin) + } + } +} + + +class RecommendationsStarsLayerHelper { + class func crStarsTextLayer(_ text: String, font: UIFont, color: UIColor) -> CATextLayer { + let size = NSString(string: text).size(withAttributes: [NSAttributedString.Key.font: font]) + + let layer = CATextLayer() + layer.bounds = CGRect(origin: CGPoint(), size: size) + layer.anchorPoint = CGPoint() + + layer.string = text + layer.font = CGFont(font.fontName as CFString) + layer.fontSize = font.pointSize + layer.foregroundColor = color.cgColor + layer.contentsScale = UIScreen.main.scale + + return layer + } +} + + +struct RecommendationsStarsTouch { + static func didUserTchRating(_ position: CGFloat, starsSetupSettings: RecommendationsStarsSettings) -> Double { + var rating = starRecommendationsPreRating(position: Double(position), + numberOfStars: starsSetupSettings.summaryRecommendationsStars, + starSize: starsSetupSettings.starSize, + rateStMargin: starsSetupSettings.rateStMargin) + + if starsSetupSettings.fillMode == .half { + rating += 0.20 + } + + if starsSetupSettings.fillMode == .full { + rating += 0.45 + } + + rating = RecommendationsStarsRating.showRatingStFromPreciseStRating(rating, fillMode: starsSetupSettings.fillMode, summaryRecommendationsStars: starsSetupSettings.summaryRecommendationsStars) + + rating = max(starsSetupSettings.minStTchRating, rating) + + return rating + } + + static func starRecommendationsPreRating(position: Double, numberOfStars: Int, starSize: Double, rateStMargin: Double) -> Double { + if position < 0 { + return 0 + + } + var positionRemainder = position; + + var rating: Double = Double(Int(position / (starSize + rateStMargin))) + + if Int(rating) > numberOfStars { + return Double(numberOfStars) + } + + positionRemainder -= rating * (starSize + rateStMargin) + + if positionRemainder > starSize { + rating += 1 + } else { + rating += positionRemainder / starSize + } + + return rating + } +} + + +struct RecommendationsStarsRating { + static func rateStFillLevel(ratingRemainder: Double, fillMode: StarFillMode) -> Double { + var result = ratingRemainder + + if result > 1 { + result = 1 + } + + if result < 0 { + result = 0 + } + + return roundFillLevel(result, fillMode: fillMode) + } + + static func roundFillLevel(_ rateStFillLevel: Double, fillMode: StarFillMode) -> Double { + switch fillMode { + case .full: + return Double(round(rateStFillLevel)) + case .half: + return Double(round(rateStFillLevel * 2) / 2) + case .precise : + return rateStFillLevel + } + } + + static func showRatingStFromPreciseStRating(_ starRecommendationsPreRating: Double, fillMode: StarFillMode, summaryRecommendationsStars: Int) -> Double { + let starFloorNumber = floor(starRecommendationsPreRating) + let singleStarRemainder = starRecommendationsPreRating - starFloorNumber + + var displayedRating = starFloorNumber + rateStFillLevel( + ratingRemainder: singleStarRemainder, fillMode: fillMode) + + displayedRating = min(Double(summaryRecommendationsStars), displayedRating) + displayedRating = max(0, displayedRating) + + return displayedRating + } + + static func numberOfFilledRateStars(_ rating: Double, totalNumberOfStars: Int) -> Double { + if rating > Double(totalNumberOfStars) { + return Double(totalNumberOfStars) + } + + if rating < 0 { + return 0 + } + + return rating + } +} + + +public struct RecommendationsStarsSettings { + + public static var `default`: RecommendationsStarsSettings { + return RecommendationsStarsSettings() + } + + public init() {} + + public var emptyBorderColor = RecommendationsStarsDefaultSettings.emptyBorderColor + + public var emptyBorderWidth: Double = RecommendationsStarsDefaultSettings.emptyBorderWidth + + public var filledBorderColor = RecommendationsStarsDefaultSettings.filledBorderColor + + public var filledBorderWidth: Double = RecommendationsStarsDefaultSettings.filledBorderWidth + + public var emptyColor = RecommendationsStarsDefaultSettings.emptyColor + + public var filledColor = RecommendationsStarsDefaultSettings.filledColor + + public var fillMode = RecommendationsStarsDefaultSettings.fillMode + + public var rateStMargin: Double = RecommendationsStarsDefaultSettings.rateStMargin + + public var starPoints: [CGPoint] = RecommendationsStarsDefaultSettings.starPoints + + public var starSize: Double = RecommendationsStarsDefaultSettings.starSize + + public var summaryRecommendationsStars = RecommendationsStarsDefaultSettings.summaryRecommendationsStars + + public var filledImage: UIImage? = nil + + public var emptyImage: UIImage? = nil + + public var textColor = RecommendationsStarsDefaultSettings.textColor + + public var textFont = RecommendationsStarsDefaultSettings.textFont + + public var textMargin: Double = RecommendationsStarsDefaultSettings.textMargin + + public var minStTchRating: Double = RecommendationsStarsDefaultSettings.minStTchRating + + public var passUserTchToSuperview = RecommendationsStarsDefaultSettings.passUserTchToSuperview + + public var reloadOnUserTouch = RecommendationsStarsDefaultSettings.reloadOnUserTouch +} + + +struct RecommendationsStarsTouchTarget { + static func optimize(_ bounds: CGRect) -> CGRect { + let recommendedHitSize: CGFloat = 44 + + var hitWidthIncrease:CGFloat = recommendedHitSize - bounds.width + var hitHeightIncrease:CGFloat = recommendedHitSize - bounds.height + + if hitWidthIncrease < 0 { + hitWidthIncrease = 0 + } + if hitHeightIncrease < 0 { + hitHeightIncrease = 0 + } + + let extendedBounds: CGRect = bounds.insetBy(dx: -hitWidthIncrease / 2, dy: -hitHeightIncrease / 2) + + return extendedBounds + } +} + + +struct actionRightStarsToLeft { + static func isactionRightStarsToLeft(_ view: UIView) -> Bool { + return false + } +} + + +@IBDesignable open class RecommendationsStarsView: UIView { + + @IBInspectable open var rating: Double = RecommendationsStarsDefaultSettings.rating { + didSet { + if oldValue != rating { + update() + } + } + } + + @IBInspectable open var text: String? { + didSet { + if oldValue != text { + update() + } + } + } + + open var starsSetupSettings: RecommendationsStarsSettings = .default { + didSet { + update() + } + } + + private var viewSize = CGSize() + + open override func awakeFromNib() { + super.awakeFromNib() + + update() + } + + public convenience init(starsSetupSettings: RecommendationsStarsSettings = .default) { + self.init(frame: .zero, starsSetupSettings: starsSetupSettings) + } + + override public convenience init(frame: CGRect) { + self.init(frame: frame, starsSetupSettings: .default) + } + + public init(frame: CGRect, starsSetupSettings: RecommendationsStarsSettings) { + super.init(frame: frame) + self.starsSetupSettings = starsSetupSettings + + update() + + improvePerformance() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + improvePerformance() + } + + private func improvePerformance() { + layer.shouldRasterize = true + layer.rasterizationScale = UIScreen.main.scale + + isOpaque = true + } + + open func update() { + var layers = RecommendationsStarsLayers.createRecommendstarViewLayer( + rating, + starsSetupSettings: starsSetupSettings, + isactionRightStarsToLeft: actionRightStarsToLeft.isactionRightStarsToLeft(self) + ) + if let text = text { + let textLayer = crStarsTextLayer(text, layers: layers) + layers = addTextLayer(textLayer: textLayer, layers: layers) + } + + layer.sublayers = layers + updateSize(layers) + updateAccessibility() + } + + private func crStarsTextLayer(_ text: String, layers: [CALayer]) -> CALayer { + let textLayer = RecommendationsStarsLayerHelper.crStarsTextLayer(text, font: starsSetupSettings.textFont, color: starsSetupSettings.textColor) + + let starsSize = RecommendationsStarsSize.calculateSizeToFitLayers(layers) + + if actionRightStarsToLeft.isactionRightStarsToLeft(self) { + RecommendationsStarsText.position(textLayer, starsSize: CGSize(width: 0, height: starsSize.height), textMargin: 0) + } else { + RecommendationsStarsText.position(textLayer, starsSize: starsSize, textMargin: starsSetupSettings.textMargin) + } + + layer.addSublayer(textLayer) + return textLayer + } + + private func addTextLayer(textLayer: CALayer, layers: [CALayer]) -> [CALayer] { + var allLayers = layers + if actionRightStarsToLeft.isactionRightStarsToLeft(self) { + for starLayer in layers { + starLayer.position.x += textLayer.bounds.width + CGFloat(starsSetupSettings.textMargin); + } + + allLayers.insert(textLayer, at: 0) + } else { + allLayers.append(textLayer) + } + + return allLayers + } + + private func updateSize(_ layers: [CALayer]) { + viewSize = RecommendationsStarsSize.calculateSizeToFitLayers(layers) + invalidateIntrinsicContentSize() + + frame.size = intrinsicContentSize + } + + override open var intrinsicContentSize:CGSize { + return viewSize + } + + open func prepareForReuse() { + previousRatingForDidTouchCallback = -123.192 + } + + private func updateAccessibility() { + RecommendationsStarsAccessibility.update(self, rating: rating, text: text, starsSetupSettings: starsSetupSettings) + } + + open override func accessibilityIncrement() { + super.accessibilityIncrement() + + rating += RecommendationsStarsAccessibility.accessibilityIncrement(rating, starsSetupSettings: starsSetupSettings) + didTouchRecommendationsStars?(rating) + didFinishTouchingRecommendationsStars?(rating) + } + + open override func accessibilityDecrement() { + super.accessibilityDecrement() + + rating -= RecommendationsStarsAccessibility.accessibilityDecrement(rating, starsSetupSettings: starsSetupSettings) + didTouchRecommendationsStars?(rating) + didFinishTouchingRecommendationsStars?(rating) + } + + open var didTouchRecommendationsStars: ((Double)->())? + + open var didFinishTouchingRecommendationsStars: ((Double)->())? + + open override func touchesBegan(_ touches: Set, with event: UIEvent?) { + if starsSetupSettings.passUserTchToSuperview { super.touchesBegan(touches, with: event) } + guard let location = touchLocationFromBeginningOfRating(touches) else { + return + } + onDidTouch(location) + } + + open override func touchesMoved(_ touches: Set, with event: UIEvent?) { + if starsSetupSettings.passUserTchToSuperview { super.touchesMoved(touches, with: event) } + guard let location = touchLocationFromBeginningOfRating(touches) else { + return + } + onDidTouch(location) + } + + func touchLocationFromBeginningOfRating(_ touches: Set) -> CGFloat? { + guard let touch = touches.first else { + return nil + } + var location = touch.location(in: self).x + + if actionRightStarsToLeft.isactionRightStarsToLeft(self) { location = bounds.width - location } + return location + } + + open override func touchesEnded(_ touches: Set, with event: UIEvent?) { + if starsSetupSettings.passUserTchToSuperview { + super.touchesEnded(touches, with: event) + } + didFinishTouchingRecommendationsStars?(rating) + } + + open override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + if starsSetupSettings.passUserTchToSuperview { + super.touchesCancelled(touches, with: event) + } + didFinishTouchingRecommendationsStars?(rating) + } + + func onDidTouch(_ locationX: CGFloat) { + let calculatedTouchRating = RecommendationsStarsTouch.didUserTchRating(locationX, starsSetupSettings: starsSetupSettings) + + if starsSetupSettings.reloadOnUserTouch { + rating = calculatedTouchRating + } + + if calculatedTouchRating == previousRatingForDidTouchCallback { + return + } + + didTouchRecommendationsStars?(calculatedTouchRating) + previousRatingForDidTouchCallback = calculatedTouchRating + } + + private var previousRatingForDidTouchCallback: Double = -123.192 + + override open func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + let oprimizedBounds = RecommendationsStarsTouchTarget.optimize(bounds) + return oprimizedBounds.contains(point) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift new file mode 100644 index 0000000..081616c --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift @@ -0,0 +1,1333 @@ +import UIKit.UIFont +import Foundation + +public protocol SdkConfigurationProtocol: AnyObject {} + +public typealias sdkFontPath = URL +public typealias sdkFontName = String +public typealias sdkFontExtension = String +public typealias sdkFontClass = (url: sdkFontPath, name: sdkFontName) + +open class SdkConfiguration: SdkConfigurationProtocol { + + public static let stories: SdkConfiguration = SdkConfiguration() + + public static let recommendations: SdkConfiguration = SdkConfiguration() + + public init() {} + + public var allLoadedFonts: [sdkFontClass] = [] + + //Sdk main stories block default settings + var iconSize: CGFloat = 76 + var iconBorderWidth: CGFloat = 2.3 + var iconMarginX: CGFloat = 18 + var iconMarginBottom: CGFloat = 8 + var iconNotViewedBorderColor: String = "" + var iconNotViewedBorderColorDarkMode: String = "" + var iconViewedBorderColor: String = "" + var iconViewedBorderColorDarkMode: String = "" + var iconViewedTransparency: CGFloat = 1.0 + var iconPlaceholderColor: String = "#d6d6d6" + var iconPlaceholderColorDarkMode: String = "#d6d6d6" + var iconAnimatedLoaderColor: String = "#5ec169" + var labelWidth: CGFloat = 76 + var pinColor: String = "" + var pinColorDarkMode: String = "" + var closeIconColor: String = "#ffffff" + var iconDisplayFormatSquare = false //default square icon false + + var defaultIconNotViewedBorderColor: String = "#fd7c50" + var defaultIconViewedBorderColor: String = "#fdc2a1" + var defaultIconViewedTransparency: CGFloat = 1.0 + var defaultIconPinColor: String = "#fd7c50" + + public var storiesBlockNumberOfLines: Int = 0 + public var storiesBlockCharWrapping = false + public var storiesBlockCharCountWrap: Int = 10 + public var defaultShowProductsButtonText: String = "See all products" + public var defaultHideProductsButtonText: String = "Hide products" + + var defaultButtonCornerRadius: CGFloat = -1 + var productsButtonCornerRadius: CGFloat = -1 + + //Sdk Promocode default settings + public var defaultCopyToClipboardMessageText: String = "Copied" + public var defaultCopyToClipboardMessageWidth: CGFloat = 150 + + //Sdk Recommendations Widget settings + public var widgetFontName: String? = nil + public var widgetBackgroundColor: String = "#ffffff" + public var widgetBackgroundColorDarkMode: String = "#000000" + public var widgetCellBackgroundColor: String = "#ffffff" + public var widgetCellBackgroundColorDarkMode: String = "#000000" + public var widgetBorderWidth: CGFloat = 1 + public var widgetBorderColor: String = "#d3d3d3" + public var widgetBorderColorDarkMode: String = "#d3d3d3" + public var widgetBorderTransparent: CGFloat = 0.5 + public var widgetCornerRadius: CGFloat = 9 + public var widgetStarsColor: String = "#ff9500" + public var widgetCartButtonTextColor: String = "#ffffff" + public var widgetCartButtonTextColorDarkMode: String = "#000000" + public var widgetCartButtonBackgroundColor: String = "#000000" + public var widgetCartButtonBackgroundColorDarkMode: String = "#ffffff" + public var widgetAddToCartButtonText: String = "Add to cart" + public var widgetRemoveFromCartButtonText: String = "Remove from cart" + public var widgetAddToCartButtonFontSize: CGFloat? = 17.0 + public var widgetRemoveFromCartButtonFontSize: CGFloat? = 14.0 + public var widgetFavoritesIconColor: String = "#000000" + public var widgetFavoritesIconColorDarkMode: String = "#ffffff" + public var widgetCartButtonNeedOpenWebUrl = false + public var widgetPreloadIndicatorColor: String = "#000000" + public var widgetNoReviewsDefaultText: String = "No reviews" + + //Sdk Stories Block collection cell indicator + public var storiesBlockPreloadIndicatorDisabled = false + + //Sdk Stories Slide default indicator + public var storiesSlideReloadIndicatorDisabled = false + public var storiesSlideReloadIndicatorBackgroundColor: String = "#ffffff" + public var storiesSlideReloadIndicatorSize: CGFloat = 76.0 + public var storiesSlideReloadIndicatorBorderLineWidth: CGFloat = 3 + public var storiesSlideReloadIndicatorSegmentCount = Int(Double(Int.random(in: 10..<11))) + public var storiesSlideReloadIndicatorAnimationDuration: Double = 1 + public var storiesSlideReloadIndicatorRotationDuration: Double = 17 + + //Sdk Stories Slide reload settings + public var storiesSlideReloadManually = false + public var storiesSlideReloadTimeoutInterval: TimeInterval = 10 + + //Sdk Stories Slide popup settings + public var storiesSlideReloadPopupMessageError: String = "Failed to retrieve data. Please check your connection and try again" + public var storiesSlideReloadPopupMessageFontSize: CGFloat = 17 + public var storiesSlideReloadPopupMessageFontWeight: UIFont.Weight = .medium + public var storiesSlideReloadPopupPositionY: CGFloat = 120 + public var storiesSlideReloadPopupMessageDisplayTime: TimeInterval = 2.5 + + //Sdk reachability popup postion settings + public enum storiesSlideReloadPopupPosition: String, SdkPopupAlertViewScheme { + case top + case centerCustom + case bottom + } + + public func registerFont(fileName: String, fileExtension: String) { + let pathForResourceString = Bundle.main.path(forResource: fileName, + ofType: fileExtension) + guard pathForResourceString != nil else { + print("SDK Failed locate custom font \(fileName) in App Bundle") + return + } + + if pathForResourceString != nil { + let fontData = NSData(contentsOfFile: pathForResourceString!) + let dataProvider = CGDataProvider(data: fontData!) + let fontRef = CGFont(dataProvider!) + var errorRef: Unmanaged? = nil + + if (CTFontManagerRegisterGraphicsFont(fontRef!, &errorRef) == false) { + print("SDK Error registering font") + } else { + print("SDK Success registering font") + } + } + + SdkFontInjector.manager.registerFontNameWithExtension(fileName: fileName, fileExtension: fileExtension) + } + + public func registerFont(fileNameWithoutExtension: String) { + var parsedFont: (sdkFontName, sdkFontExtension)? + + if fileNameWithoutExtension.contains(SdkFontInjector.sdkSupportedFontExtensions.trueType.rawValue) || fileNameWithoutExtension.contains(SdkFontInjector.sdkSupportedFontExtensions.openType.rawValue) { + parsedFont = SdkConfiguration.fontExt(fromName: fileNameWithoutExtension) + } else { + var tmpName = fileNameWithoutExtension + "." + SdkFontInjector.sdkSupportedFontExtensions.trueType.rawValue + parsedFont = SdkConfiguration.fontExt(fromName: tmpName) + if parsedFont == nil { + tmpName = fileNameWithoutExtension + "." + SdkFontInjector.sdkSupportedFontExtensions.openType.rawValue + parsedFont = SdkConfiguration.fontExt(fromName: tmpName) + } + } + + if let parsedFont = parsedFont { + let pathForResourceString = Bundle.main.path(forResource: parsedFont.0, ofType: parsedFont.1) + if pathForResourceString != nil { + let fontData = NSData(contentsOfFile: pathForResourceString!) + let dataProvider = CGDataProvider(data: fontData!) + let fontRef = CGFont(dataProvider!) + var errorRef: Unmanaged? = nil + + if (CTFontManagerRegisterGraphicsFont(fontRef!, &errorRef) == false) { + print("SDK Error registering font") + } else { + print("SDK Success registering font") + } + } + } + } + + public func setStoriesBlock(fontName: String? = nil, + fontSize: CGFloat? = nil, + textColor: String? = nil, + textColorDarkMode: String? = nil, + backgroundColor: String? = nil, + backgroundColorDarkMode: String? = nil, + iconSize: CGFloat? = nil, + iconBorderWidth: CGFloat? = nil, + iconMarginX: CGFloat? = nil, + iconMarginBottom: CGFloat? = nil, + iconNotViewedBorderColor: String? = nil, + iconNotViewedBorderColorDarkMode: String? = nil, + iconViewedBorderColor: String? = nil, + iconViewedBorderColorDarkMode: String? = nil, + iconViewedTransparency: CGFloat? = nil, + iconAnimatedLoaderColor: String? = nil, + iconPlaceholderColor: String? = nil, + iconPlaceholderColorDarkMode: String? = nil, + iconDisplayFormatSquare: Bool? = false, + labelWidth: CGFloat? = nil, + pinColor: String? = nil, + pinColorDarkMode: String? = nil, + closeIconColor: String? = nil) { + + let uiBlockTextColorLight = UIColor(hexString: textColor ?? UIColor.sdkDefaultBlackColor.toHexString()) + let uiBlockBackgroundColorLight = UIColor(hexString: backgroundColor ?? UIColor.white.toHexString()) + let uiBlockTextColorDark = UIColor(hexString: textColorDarkMode ?? UIColor.white.toHexString()) + let uiBlockBackgroundColorDark = UIColor(hexString: backgroundColorDarkMode ?? UIColor.black.toHexString()) + + storiesBlockTextColorChanged_Light = uiBlockTextColorLight + storiesBlockTextColorChanged_Dark = uiBlockTextColorDark + + storiesBlockBackgroundColorChanged_Light = uiBlockBackgroundColorLight + storiesBlockBackgroundColorChanged_Dark = uiBlockBackgroundColorDark + + var fontProvidedBySdk = UIFont(name: storiesBlockFontNameConstant, size: storiesBlockMinimumFontSizeConstant) + + if fontName != nil { + if fontName == storiesBlockFontNameConstant { + storiesBlockFontNameChanged = storiesBlockFontNameConstant + } else { + storiesBlockFontNameChanged = fontName + } + + fontProvidedBySdk = UIFont(name: storiesBlockFontNameChanged!, size: storiesBlockMinimumFontSizeChanged ?? 14.0) + + if fontSize != nil { + if fontSize == storiesBlockMinimumFontSizeConstant { + storiesBlockMinimumFontSizeChanged = storiesBlockMinimumFontSizeConstant + } else { + storiesBlockMinimumFontSizeChanged = fontSize + fontProvidedBySdk = UIFont(name: storiesBlockFontNameChanged!, size: storiesBlockMinimumFontSizeChanged ?? 14.0) + } + } else { + storiesBlockMinimumFontSizeChanged = 0.0 + } + } else { + if fontSize != nil { + if fontSize == storiesBlockMinimumFontSizeConstant { + storiesBlockMinimumFontSizeChanged = storiesBlockMinimumFontSizeConstant + } else { + storiesBlockMinimumFontSizeChanged = fontSize + fontProvidedBySdk = UIFont(name: storiesBlockFontNameConstant, size: storiesBlockMinimumFontSizeChanged ?? 14.0) + } + } else { + storiesBlockMinimumFontSizeChanged = 0.0 + } + } + + if (fontProvidedBySdk == nil) { + fontProvidedBySdk = .systemFont(ofSize: 14.0) + } + + SdkStyle.shared.register(colorScheme: lightSdkStyleApperance(storiesBlockSelectFontName: fontProvidedBySdk!, + storiesBlockSelectFontSize: storiesBlockMinimumFontSizeChanged!, + storiesBlockFontColor: uiBlockTextColorLight, + storiesBlockBackgroundColor: uiBlockBackgroundColorLight, + defaultButtonSelectFontName: fontProvidedBySdk!, + defaultButtonSelectFontSize: storiesBlockMinimumFontSizeChanged!, + defaultButtonFontColor: .white, + defaultButtonBackgroundColor: .black, + productsButtonSelectFontName: fontProvidedBySdk!, + productsButtonSelectFontSize: storiesBlockMinimumFontSizeChanged!, + productsButtonFontColor: .black, + productsButtonBackgroundColor: .white), + for: SdkStyleApperanceTypes.storiesBlockLight) + + SdkStyle.shared.register(colorScheme: darkSdkStyleApperance(storiesBlockSelectFontName: fontProvidedBySdk!, + storiesBlockSelectFontSize: storiesBlockMinimumFontSizeChanged!, + storiesBlockFontColor: uiBlockTextColorDark, + storiesBlockBackgroundColor: uiBlockBackgroundColorDark, + defaultButtonSelectFontName: fontProvidedBySdk!, + defaultButtonSelectFontSize: storiesBlockMinimumFontSizeChanged!, + defaultButtonFontColor: .black, + defaultButtonBackgroundColor: .white, + productsButtonSelectFontName: fontProvidedBySdk!, + productsButtonSelectFontSize: storiesBlockMinimumFontSizeChanged!, + productsButtonFontColor: .black, + productsButtonBackgroundColor: .white), + for: SdkStyleApperanceTypes.storiesBlockDark) + + if iconSize != nil { + self.iconSize = iconSize! + } + if iconBorderWidth != nil { + self.iconBorderWidth = iconBorderWidth! + } + if iconMarginX != nil { + self.iconMarginX = iconMarginX! + } + if iconMarginBottom != nil { + self.iconMarginBottom = iconMarginBottom! + } + if iconNotViewedBorderColor != nil { + self.iconNotViewedBorderColor = iconNotViewedBorderColor! + } + if iconNotViewedBorderColorDarkMode != nil { + self.iconNotViewedBorderColorDarkMode = iconNotViewedBorderColorDarkMode! + } + if iconViewedBorderColor != nil { + self.iconViewedBorderColor = iconViewedBorderColor! + } + if iconViewedBorderColorDarkMode != nil { + self.iconViewedBorderColorDarkMode = iconViewedBorderColorDarkMode! + } + if iconViewedTransparency != nil { + self.iconViewedTransparency = iconViewedTransparency! + } + if iconAnimatedLoaderColor != nil { + self.iconAnimatedLoaderColor = iconAnimatedLoaderColor! + } + if iconPlaceholderColor != nil { + self.iconPlaceholderColor = iconPlaceholderColor! + } + if iconPlaceholderColorDarkMode != nil { + self.iconPlaceholderColorDarkMode = iconPlaceholderColorDarkMode! + } + if labelWidth != nil { + self.labelWidth = labelWidth! + } + if pinColor != nil { + self.pinColor = pinColor! + } + if pinColorDarkMode != nil { + self.pinColorDarkMode = pinColorDarkMode! + } + if closeIconColor != nil { + self.closeIconColor = closeIconColor! + } + + if iconDisplayFormatSquare != nil { + self.iconDisplayFormatSquare = iconDisplayFormatSquare ?? false + } + + if SdkConfiguration.isDarkMode { + SdkStyle.shared.switchApppearance(to: SdkStyleApperanceTypes.storiesBlockDark, animated: false) + } else { + SdkStyle.shared.switchApppearance(to: SdkStyleApperanceTypes.storiesBlockLight, animated: false) + } + } + + public func setSlideDefaultButton(fontName: String? = nil, + fontSize: CGFloat? = nil, + textColor: String? = nil, + backgroundColor: String? = nil, + textColorDarkMode: String? = nil, + backgroundColorDarkMode: String? = nil, + cornerRadius: CGFloat? = nil) { + + let slideDefaultButtonTextColorLight = UIColor(hexString: textColor ?? UIColor.sdkDefaultBlackColor.toHexString()) + let slideDefaultButtonTextColorDark = UIColor(hexString: textColorDarkMode ?? UIColor.white.toHexString()) + + let defaultTextColor = UIColor.hexStringFromColor(color: slideDefaultButtonTextColorConstant_Light) + let convertedTextColor = textColor?.hexToRGB() ?? defaultTextColor.hexToRGB() + if textColor != nil { + slideDefaultButtonTextColorChanged_Light = UIColor(red: convertedTextColor.red, green: convertedTextColor.green, blue: convertedTextColor.blue, alpha: 1) + } else { + slideDefaultButtonTextColorChanged_Light = nil + slideDefaultButtonTextColorConstant_Light = UIColor(red: convertedTextColor.red, green: convertedTextColor.green, blue: convertedTextColor.blue, alpha: 1) + } + + let defaultTextColorDark = UIColor.hexStringFromColor(color: slideDefaultButtonTextColorConstant_Dark) + let convertedTextColorDark = textColorDarkMode?.hexToRGB() ?? defaultTextColorDark.hexToRGB() + if textColor != nil { + slideDefaultButtonTextColorChanged_Dark = UIColor(red: convertedTextColorDark.red, green: convertedTextColorDark.green, blue: convertedTextColorDark.blue, alpha: 1) + } else { + slideDefaultButtonTextColorChanged_Dark = nil + } + + let defaultBackgroundColorLight = UIColor.hexStringFromColor(color: slideDefaultButtonBackgroundColorConstant_Light) + let convertedDefaultButtonBackgroundColorLight = backgroundColor?.hexToRGB() ?? defaultBackgroundColorLight.hexToRGB() + if backgroundColor != nil { + slideDefaultButtonBackgroundColorChanged_Light = UIColor(red: convertedDefaultButtonBackgroundColorLight.red, green: convertedDefaultButtonBackgroundColorLight.green, blue: convertedDefaultButtonBackgroundColorLight.blue, alpha: 1) + } else { + slideDefaultButtonBackgroundColorChanged_Light = nil + } + + let defaultBackgroundColorDark = UIColor.hexStringFromColor(color: slideDefaultButtonBackgroundColorConstant_Dark) + let convertedDefaultButtonBackgroundColorDark = backgroundColorDarkMode?.hexToRGB() ?? defaultBackgroundColorDark.hexToRGB() + if backgroundColorDarkMode != nil { + slideDefaultButtonBackgroundColorChanged_Dark = UIColor(red: convertedDefaultButtonBackgroundColorDark.red, green: convertedDefaultButtonBackgroundColorDark.green, blue: convertedDefaultButtonBackgroundColorDark.blue, alpha: 1) + } else { + slideDefaultButtonBackgroundColorChanged_Dark = nil + } + + var slideButtonFontBySdk = UIFont(name: slideDefaultButtonFontNameConstant, size: slideDefaultButtonFontSizeConstant) + if fontName != nil { + if fontName == slideDefaultButtonFontNameConstant { + slideDefaultButtonFontNameChanged = slideDefaultButtonFontNameConstant + } else { + slideDefaultButtonFontNameChanged = fontName + } + slideButtonFontBySdk = UIFont(name: slideDefaultButtonFontNameChanged!, size: slideDefaultButtonFontSizeChanged ?? 14.0) + + if fontSize != nil { + if fontSize == slideDefaultButtonFontSizeConstant { + slideDefaultButtonFontSizeChanged = slideDefaultButtonFontSizeConstant + } else { + slideDefaultButtonFontSizeChanged = fontSize + slideButtonFontBySdk = UIFont(name: slideDefaultButtonFontNameChanged!, size: fontSize ?? 14.0) + } + } else { + slideDefaultButtonFontSizeChanged = 0.0 + } + } else { + if fontSize != nil { + if fontSize == slideDefaultButtonFontSizeConstant { + slideDefaultButtonFontSizeChanged = slideDefaultButtonFontSizeConstant + } else { + slideDefaultButtonFontSizeChanged = fontSize + slideButtonFontBySdk = UIFont(name: slideDefaultButtonFontNameConstant, size: slideDefaultButtonFontSizeChanged ?? 14.0) + } + } else { + slideDefaultButtonFontSizeChanged = 0.0 + } + } + + var storedStoriesBlockSelectFontName = SdkStyle.shared.currentColorScheme?.storiesBlockSelectFontName + if storedStoriesBlockSelectFontName == nil { + storedStoriesBlockSelectFontName = .systemFont(ofSize: 15.0, weight: .semibold) + } + let storedStoriesBlockFontColor = SdkStyle.shared.currentColorScheme?.storiesBlockFontColor ?? .black + let storedStoriesBlockBackgroundColor = SdkStyle.shared.currentColorScheme?.storiesBlockBackgroundColor ?? .white + + if (slideButtonFontBySdk == nil) { + slideButtonFontBySdk = .systemFont(ofSize: 16.0) + } + if (storiesBlockMinimumFontSizeChanged == nil) { + storiesBlockMinimumFontSizeChanged = 14.0 + } + + if cornerRadius != nil { + self.defaultButtonCornerRadius = cornerRadius! + } + + SdkStyle.shared.register(colorScheme: + lightSdkStyleApperance(storiesBlockSelectFontName: storedStoriesBlockSelectFontName!, + storiesBlockSelectFontSize: storiesBlockMinimumFontSizeChanged!, + storiesBlockFontColor: storedStoriesBlockFontColor, + storiesBlockBackgroundColor: storedStoriesBlockBackgroundColor, + + defaultButtonSelectFontName: slideButtonFontBySdk!, + defaultButtonSelectFontSize: slideDefaultButtonFontSizeChanged!, + defaultButtonFontColor: slideDefaultButtonTextColorLight, + defaultButtonBackgroundColor: slideDefaultButtonBackgroundColorChanged_Light ?? .white, + + productsButtonSelectFontName: slideButtonFontBySdk!, + productsButtonSelectFontSize: slideDefaultButtonFontSizeChanged!, + productsButtonFontColor: .black, + productsButtonBackgroundColor: .white + ), + for: SdkStyleApperanceTypes.storiesBlockLight) + + SdkStyle.shared.register(colorScheme: + darkSdkStyleApperance(storiesBlockSelectFontName: storedStoriesBlockSelectFontName!, + storiesBlockSelectFontSize: storiesBlockMinimumFontSizeChanged!, + storiesBlockFontColor: storedStoriesBlockFontColor, + storiesBlockBackgroundColor: storedStoriesBlockBackgroundColor, + + defaultButtonSelectFontName: slideButtonFontBySdk!, + defaultButtonSelectFontSize: slideDefaultButtonFontSizeChanged!, + defaultButtonFontColor: slideDefaultButtonTextColorDark, + defaultButtonBackgroundColor: slideDefaultButtonBackgroundColorChanged_Dark ?? .white, + + productsButtonSelectFontName: slideButtonFontBySdk!, + productsButtonSelectFontSize: 12.0, + productsButtonFontColor: .black, + productsButtonBackgroundColor: .white + ), + for: SdkStyleApperanceTypes.storiesBlockDark) + + + if SdkConfiguration.isDarkMode { + SdkStyle.shared.switchApppearance(to: SdkStyleApperanceTypes.storiesBlockDark, animated: false) + } else { + SdkStyle.shared.switchApppearance(to: SdkStyleApperanceTypes.storiesBlockLight, animated: false) + } + } + + public func setSlideProductsButton(fontName: String? = nil, + fontSize: CGFloat? = nil, + textColor: String? = nil, + backgroundColor: String? = nil, + textColorDarkMode: String? = nil, + backgroundColorDarkMode: String? = nil, + cornerRadius: CGFloat? = nil) { + + if fontName != nil { + if fontName == slideProductsButtonFontNameConstant { + slideProductsButtonFontNameChanged = nil + } else { + slideProductsButtonFontNameChanged = fontName + } + } + + let defaultTextColor = UIColor.hexStringFromColor(color: slideProductsButtonTextColorConstant_Light) + let convertedTextColor = textColor?.hexToRGB() ?? defaultTextColor.hexToRGB() + slideProductsButtonTextColorChanged_Light = UIColor(red: convertedTextColor.red, green: convertedTextColor.green, blue: convertedTextColor.blue, alpha: 1) + + let defaultTextColorDark = UIColor.hexStringFromColor(color: slideProductsButtonTextColorConstant_Dark) + let convertedTextColorDark = textColorDarkMode?.hexToRGB() ?? defaultTextColorDark.hexToRGB() + slideProductsButtonTextColorChanged_Dark = UIColor(red: convertedTextColorDark.red, green: convertedTextColorDark.green, blue: convertedTextColorDark.blue, alpha: 1) + + let defaultBackgroundColor = UIColor.hexStringFromColor(color: slideProductsButtonBackgroundColorConstant_Light) + let convertedBackgroundColor = backgroundColor?.hexToRGB() ?? defaultBackgroundColor.hexToRGB() + if backgroundColor != nil { + slideProductsButtonBackgroundColorChanged_Light = UIColor(red: convertedBackgroundColor.red, green: convertedBackgroundColor.green, blue: convertedBackgroundColor.blue, alpha: 1) + } else { + slideProductsButtonBackgroundColorChanged_Light = nil + } + + let defaultBackgroundColorDark = UIColor.hexStringFromColor(color: slideProductsButtonBackgroundColorConstant_Dark) + let convertedBackgroundColorDark = backgroundColorDarkMode?.hexToRGB() ?? defaultBackgroundColorDark.hexToRGB() + if backgroundColor != nil { + slideProductsButtonBackgroundColorChanged_Dark = UIColor(red: convertedBackgroundColorDark.red, green: convertedBackgroundColorDark.green, blue: convertedBackgroundColorDark.blue, alpha: 1) + } else { + slideProductsButtonBackgroundColorChanged_Dark = nil + } + + let convertedFontSize = fontSize ?? slideProductsButtonFontSizeConstant + if fontSize != nil { + slideProductsButtonFontSizeChanged = convertedFontSize + } else { + slideProductsButtonFontSizeChanged = nil + } + + if cornerRadius != nil { + self.productsButtonCornerRadius = cornerRadius! + } + } + + public func setProductsCard(fontName: String? = nil, + showProductsButtonText: String? = "See all products", + hideProductsButtonText: String? = "Hide products") { + if fontName != nil { + if fontName == slideProductsHideButtonFontNameConstant { + slideProductsHideButtonFontNameChanged = nil + } else { + slideProductsHideButtonFontNameChanged = fontName + } + } + defaultShowProductsButtonText = showProductsButtonText! + defaultHideProductsButtonText = hideProductsButtonText! + } + + public func setWidgetBlock(widgetFontName: String? = nil, + widgetBackgroundColor: String? = nil, + widgetBackgroundColorDarkMode: String? = nil, + widgetCellBackgroundColor: String? = nil, + widgetCellBackgroundColorDarkMode: String? = nil, + widgetBorderWidth: CGFloat? = nil, + widgetBorderColor: String? = nil, + widgetBorderColorDarkMode: String? = nil, + widgetBorderTransparent: CGFloat? = nil, + widgetCornerRadius: CGFloat? = nil, + widgetStarsColor: String? = nil, + widgetAddToCartButtonText: String? = nil, + widgetRemoveFromCartButtonText: String? = nil, + widgetAddToCartButtonFontSize: CGFloat? = nil, + widgetRemoveFromCartButtonFontSize: CGFloat? = nil, + widgetCartButtonTextColor: String? = nil, + widgetCartButtonTextColorDarkMode: String? = nil, + widgetCartButtonBackgroundColor: String? = nil, + widgetCartButtonBackgroundColorDarkMode: String? = nil, + widgetCartButtonNeedOpenWebUrl: Bool? = false, + widgetFavoritesIconColor: String? = nil, + widgetFavoritesIconColorDarkMode: String? = nil, + widgetPreloadIndicatorColor: String? = nil, + widgetNoReviewDefaultMessage: String? = "No reviews") { + + if widgetFontName != nil { + self.widgetFontName = widgetFontName! + } + if widgetBackgroundColor != nil { + self.widgetBackgroundColor = widgetBackgroundColor! + } + if widgetBackgroundColorDarkMode != nil { + self.widgetBackgroundColorDarkMode = widgetBackgroundColorDarkMode! + } + if widgetCellBackgroundColor != nil { + self.widgetCellBackgroundColor = widgetCellBackgroundColor! + } + if widgetCellBackgroundColorDarkMode != nil { + self.widgetCellBackgroundColorDarkMode = widgetCellBackgroundColorDarkMode! + } + if widgetBorderWidth != nil { + self.widgetBorderWidth = widgetBorderWidth! + } + if widgetBorderColor != nil { + self.widgetBorderColor = widgetBorderColor! + } + if widgetBorderColorDarkMode != nil { + self.widgetBorderColorDarkMode = widgetBorderColorDarkMode! + } + if widgetBorderTransparent != nil { + self.widgetBorderTransparent = widgetBorderTransparent! + } + if widgetCornerRadius != nil { + self.widgetCornerRadius = widgetCornerRadius! + } + if widgetStarsColor != nil { + self.widgetStarsColor = widgetStarsColor! + } + if widgetAddToCartButtonText != nil { + self.widgetAddToCartButtonText = widgetAddToCartButtonText! + } + if widgetRemoveFromCartButtonText != nil { + self.widgetRemoveFromCartButtonText = widgetRemoveFromCartButtonText! + } + if widgetAddToCartButtonFontSize != nil { + self.widgetAddToCartButtonFontSize = widgetAddToCartButtonFontSize! + } + if widgetRemoveFromCartButtonFontSize != nil { + self.widgetRemoveFromCartButtonFontSize = widgetRemoveFromCartButtonFontSize! + } + if widgetCartButtonTextColor != nil { + self.widgetCartButtonTextColor = widgetCartButtonTextColor! + } + if widgetCartButtonTextColorDarkMode != nil { + self.widgetCartButtonTextColorDarkMode = widgetCartButtonTextColorDarkMode! + } + if widgetCartButtonBackgroundColor != nil { + self.widgetCartButtonBackgroundColor = widgetCartButtonBackgroundColor! + } + if widgetCartButtonBackgroundColorDarkMode != nil { + self.widgetCartButtonBackgroundColorDarkMode = widgetCartButtonBackgroundColorDarkMode! + } + if widgetCartButtonNeedOpenWebUrl != nil { + self.widgetCartButtonNeedOpenWebUrl = widgetCartButtonNeedOpenWebUrl! + } + if widgetFavoritesIconColor != nil { + self.widgetFavoritesIconColor = widgetFavoritesIconColor! + } + if widgetFavoritesIconColorDarkMode != nil { + self.widgetFavoritesIconColorDarkMode = widgetFavoritesIconColorDarkMode! + } + if widgetPreloadIndicatorColor != nil { + self.widgetPreloadIndicatorColor = widgetPreloadIndicatorColor! + } + if widgetNoReviewDefaultMessage != nil { + self.widgetNoReviewsDefaultText = widgetNoReviewDefaultMessage! + } + } + + public var promoCodeSlideFontNameChanged: String? + public var promoCodeSlideFontNameConstant: String { + get { + return "San Francisco (System Font)" + } + set { + promoCodeSlideFontNameChanged = newValue + } + } + + public var promoCodeSlideFontSizeChanged: CGFloat? + public var promoCodeSlideFontSizeConstant: CGFloat { + get { + return 14.0 + } + set { + promoCodeSlideFontSizeChanged = newValue + } + } + + public var promoProductTitleTextColorLightMode: UIColor? + public var promoCodeSlideFontColorConstant_Light: UIColor { + get { + return .white + } + set { + promoProductTitleTextColorLightMode = newValue + } + } + + public var promoProductTitleTextColorDarkMode: UIColor? + public var promoCodeSlideFontColorConstant_Dark: UIColor { + get { + return .white + } + set { + promoProductTitleTextColorDarkMode = newValue + } + } + + public var bannerOldPriceSectionFontColor: UIColor? + public var bannerOldPriceSectionFontColorConstant: UIColor { + get { + return .white + } + set { + bannerOldPriceSectionFontColor = newValue + } + } + + public var bannerPriceSectionFontColor: UIColor? + public var bannerPriceSectionFontColorConstant: UIColor { + get { + return .white + } + set { + bannerPriceSectionFontColor = newValue + } + } + + public var bannerPromocodeSectionFontColor: UIColor? + public var bannerPromocodeSectionFontColorConstant: UIColor { + get { + return .white + } + set { + bannerPromocodeSectionFontColor = newValue + } + } + + public var bannerPriceSectionBackgroundColor: UIColor? + public var bannerPriceSectionBackgroundConstant: UIColor { + get { + return .orange + } + set { + bannerPriceSectionBackgroundColor = newValue + } + } + + public var bannerPromocodeSectionBackgroundColor: UIColor? + public var bannerPromocodeSectionBackgroundColorConstant: UIColor { + get { + return .orange + } + set { + bannerPromocodeSectionBackgroundColor = newValue + } + } + + public var bannerDiscountSectionBackgroundColor: UIColor? + public var bannerDiscountSectionBackgroundConstant: UIColor { + get { + return .yellow + } + set { + bannerDiscountSectionBackgroundColor = newValue + } + } + + public func setPromocodeCard(productBannerFontName: String? = nil, + productTitleFontSize: CGFloat? = nil, + productTitleTextColor: String? = nil, + productTitleTextColorDarkMode: String? = nil, + productBannerOldPriceSectionFontColor: String? = nil, + productBannerPriceSectionFontColor: String? = nil, + productBannerPriceSectionBackgroundColor: String? = nil, + productBannerPromocodeSectionFontColor: String? = nil, + productBannerPromocodeSectionBackgroundColor: String? = nil, + productBannerDiscountSectionBackgroundColor: String? = nil, + productBannerPromocodeCopyToClipboardMessage: String? = "Copied") { + + if productBannerFontName != nil { + if productBannerFontName == promoCodeSlideFontNameConstant { + promoCodeSlideFontNameChanged = nil + } else { + promoCodeSlideFontNameChanged = productBannerFontName + } + } + + let convertedFontSize = productTitleFontSize ?? promoCodeSlideFontSizeConstant + if productTitleFontSize != nil { + promoCodeSlideFontSizeChanged = convertedFontSize + } else { + promoCodeSlideFontSizeConstant = 16.0 + } + + let uipromoProductTitleTextColorLightMode = UIColor(hexString: productTitleTextColor ?? UIColor.white.toHexString()) + let uipromoProductTitleTextColorDarkMode = UIColor(hexString: productTitleTextColorDarkMode ?? UIColor.white.toHexString()) + + promoProductTitleTextColorLightMode = uipromoProductTitleTextColorLightMode + promoProductTitleTextColorDarkMode = uipromoProductTitleTextColorDarkMode + + let uiOldProductBannerPriceSectionFontColor = UIColor(hexString: productBannerOldPriceSectionFontColor ?? UIColor.sdkDefaultWhiteColor.toHexString()) + + let uiProductBannerPriceSectionFontColor = UIColor(hexString: productBannerPriceSectionFontColor ?? UIColor.sdkDefaultWhiteColor.toHexString()) + let uiProductBannerPromocodeSectionFontColor = UIColor(hexString: productBannerPromocodeSectionFontColor ?? UIColor.sdkDefaultWhiteColor.toHexString()) + let uiProductBannerPriceSectionBackgroundColor = UIColor(hexString: productBannerPriceSectionBackgroundColor ?? UIColor.sdkDefaultOrangeColor.toHexString()) + let uiProductBannerPromocodeSectionBackgroundColor = UIColor(hexString: productBannerPromocodeSectionBackgroundColor ?? UIColor.sdkDefaultBlueColor.toHexString()) + + bannerOldPriceSectionFontColor = uiOldProductBannerPriceSectionFontColor + bannerPriceSectionFontColor = uiProductBannerPriceSectionFontColor + bannerPromocodeSectionFontColor = uiProductBannerPromocodeSectionFontColor + + bannerPriceSectionBackgroundColor = uiProductBannerPriceSectionBackgroundColor + bannerPromocodeSectionBackgroundColor = uiProductBannerPromocodeSectionBackgroundColor + + let uiDiscountBannerSectionBackgroundColor = UIColor(hexString: productBannerDiscountSectionBackgroundColor ?? UIColor.sdkDefaultYellowColor.toHexString()) + bannerDiscountSectionBackgroundColor = uiDiscountBannerSectionBackgroundColor + + defaultCopyToClipboardMessageText = productBannerPromocodeCopyToClipboardMessage! + //defaultCopyToClipboardMessageWidth = copyToClipboardWidth! + } + + final class func fontExt(fromName name: String) -> (sdkFontName, sdkFontExtension) { + let components = name.split{$0 == "."}.map { String($0) } + return (components[0], components[1]) + } + + public struct lightSdkStyleApperance: SdkStyleColorScheme, SdkStyleViewColorScheme, SdkStyleLabelColorScheme, SdkStyleButtonColorScheme, SdkStyleTableViewColorScheme, SdkStyleCustomColorScheme { + + public var storiesBlockSelectFontName: UIFont + public var storiesBlockSelectFontSize: CGFloat + public var storiesBlockFontColor: UIColor + public var storiesBlockBackgroundColor: UIColor + + public var defaultButtonSelectFontName: UIFont + public var defaultButtonSelectFontSize: CGFloat + public var defaultButtonFontColor: UIColor + public var defaultButtonBackgroundColor: UIColor + + public var productsButtonSelectFontName: UIFont + public var productsButtonSelectFontSize: CGFloat + public var productsButtonFontColor: UIColor + public var productsButtonBackgroundColor: UIColor + + public let storiesBack = UIColor.lightGray + public let viewControllerBackground = UIColor.white + public let navigationBarStyle = UIBarStyle.default + public let navigationBarBackgroundColor = UIColor.white + public let navigationBarTextColor = UIColor.black + public let viewBackgroundColor = UIColor.magenta + public let labelTextColor = UIColor.black + public let buttonTintColor = UIColor.blue + + public let tableViewBackgroundColor = UIColor.lightGray + public var tableViewSeparatorColor = UIColor.gray + public let headerBackgroundColor = UIColor.white + public let headerTextColorColor = UIColor.black + public let cellBackgroundColor = UIColor.white + public let cellTextColorColor = UIColor.black + public let cellSubTextColorColor = UIColor.darkGray + + public let customColors = [CustomTableCellColors.cellBackground.SdkApperanceViewScheme() : UIColor.magenta, + CustomTableCellColors.cellTextColor.SdkApperanceViewScheme() : UIColor.purple] + } + + public struct darkSdkStyleApperance: SdkStyleColorScheme, SdkStyleViewColorScheme, SdkStyleLabelColorScheme, SdkStyleButtonColorScheme, SdkStyleTableViewColorScheme, SdkStyleCustomColorScheme { + + public var storiesBlockSelectFontName: UIFont + public var storiesBlockSelectFontSize: CGFloat + public var storiesBlockFontColor: UIColor + public var storiesBlockBackgroundColor: UIColor + + public var defaultButtonSelectFontName: UIFont + public var defaultButtonSelectFontSize: CGFloat + public var defaultButtonFontColor: UIColor + public var defaultButtonBackgroundColor: UIColor + + public var productsButtonSelectFontName: UIFont + public var productsButtonSelectFontSize: CGFloat + public var productsButtonFontColor: UIColor + public var productsButtonBackgroundColor: UIColor + + public let viewControllerBackground = UIColor.black + public let navigationBarStyle = UIBarStyle.black + public let navigationBarBackgroundColor = UIColor.black + public let navigationBarTextColor = UIColor.white + public let viewBackgroundColor = UIColor.yellow + public let labelTextColor = UIColor.white + public let buttonTintColor = UIColor.blue + + public let tableViewBackgroundColor = UIColor.darkGray + public var tableViewSeparatorColor = UIColor.gray + public let headerBackgroundColor = UIColor.black + public let headerTextColorColor = UIColor.white + public let cellBackgroundColor = UIColor.black + public let cellTextColorColor = UIColor.white + public let cellSubTextColorColor = UIColor.lightGray + + public let customColors = [CustomTableCellColors.cellBackground.SdkApperanceViewScheme() : UIColor.purple, + CustomTableCellColors.cellTextColor.SdkApperanceViewScheme() : UIColor.magenta ] + } + + public struct customSdkStyleApperance: SdkStyleColorScheme, SdkStyleViewColorScheme, SdkStyleLabelColorScheme, SdkStyleButtonColorScheme, SdkStyleTableViewColorScheme, SdkStyleCustomColorScheme { + + public var storiesBlockSelectFontName: UIFont + public var storiesBlockSelectFontSize: CGFloat + public var storiesBlockFontColor: UIColor + public var storiesBlockBackgroundColor: UIColor + + public var defaultButtonSelectFontName: UIFont + public var defaultButtonSelectFontSize: CGFloat + public var defaultButtonFontColor: UIColor + public var defaultButtonBackgroundColor: UIColor + + public var productsButtonSelectFontName: UIFont + public var productsButtonSelectFontSize: CGFloat + public var productsButtonFontColor: UIColor + public var productsButtonBackgroundColor: UIColor + + public let storiesBack = UIColor.lightGray + public var viewControllerBackground = UIColor.blue + public let navigationBarStyle = UIBarStyle.black + public let navigationBarBackgroundColor = UIColor.blue + public let navigationBarTextColor = UIColor.white + public let viewBackgroundColor = UIColor.black + public let labelTextColor = UIColor.white + public let buttonTintColor = UIColor.blue + + public let tableViewBackgroundColor = UIColor.lightGray + public var tableViewSeparatorColor = UIColor.gray + public let headerBackgroundColor = UIColor.white + public let headerTextColorColor = UIColor.black + public let cellBackgroundColor = UIColor.white + public let cellTextColorColor = UIColor.black + public let cellSubTextColorColor = UIColor.darkGray + + public let customColors = [CustomTableCellColors.cellBackground.SdkApperanceViewScheme() : UIColor.magenta, + CustomTableCellColors.cellTextColor.SdkApperanceViewScheme() : UIColor.purple] + } + + public enum SdkStyleApperanceTypes: String, SdkApperanceViewScheme { + case storiesBlockLight + case storiesBlockDark + case slideDefaultButtonLight + case slideDefaultButtonDark + case slideProductsButtonLight + case slideProductsButtonDark + case productsCardLight + case productsCardDark + case custom + } + + public static var isDarkMode: Bool { + if #available(iOS 13.0, *) { + return UITraitCollection.current.userInterfaceStyle == .dark + } else { + return false + } + } + + public func getInstalledFontsFrom(bundle: Bundle = .main, + completion: (([String]) -> Void)? = nil) { + getInstalledFontsFrom(at: bundle.bundleURL, completion: completion) + } + + public func getInstalledFontsFrom(at url: URL?, + completion: (([String]) -> Void)? = nil) { + + guard let url = url else { completion?([]) + return + } + + var loadedForSDKFonts: [sdkFontClass] = [] + loadedForSDKFonts += SdkConfiguration.loadFonts(at: url) + loadedForSDKFonts += SdkConfiguration.loadFontsFromBundles(at: url) + + let alreadyLoaded = allLoadedFonts.map { $0.url } + let justLoaded = loadedForSDKFonts.map { $0.url } + for i in 0 ..< justLoaded.count { + let justLoadedUrl = justLoaded[i] + if alreadyLoaded.firstIndex(of: justLoadedUrl) == nil { + allLoadedFonts.append(loadedForSDKFonts[i]) + } + } + + completion?(loadedForSDKFonts.map { $0.name }) + } + + public enum CustomTableCellColors: String, SdkApperanceViewScheme { + case cellBackground + case cellTextColor + } + + public var storiesBlockFontNameChanged: String? + public var storiesBlockFontNameConstant: String { + get { + return "San Francisco (System Font)" + } + set { + storiesBlockFontNameChanged = newValue + } + } + + public var storiesBlockMinimumFontSizeChanged: CGFloat? + public var storiesBlockMinimumFontSizeConstant: CGFloat { + get { + return 7.0 + } + set { + storiesBlockMinimumFontSizeChanged = newValue + } + } + + public var storiesBlockTextColorChanged_Light: UIColor? + public var storiesBlockTextColorConstant_Light: UIColor { + get { + return .black + } + set { + storiesBlockTextColorChanged_Light = newValue + } + } + + public var storiesBlockTextColorChanged_Dark: UIColor? + public var storiesBlockTextColorConstant_Dark: UIColor { + get { + return .black + } + set { + storiesBlockTextColorChanged_Dark = newValue + } + } + + public var storiesBlockBackgroundColorChanged_Light: UIColor? + public var storiesBlockBackgroundColorConstant_Light: UIColor { + get { + return .white + } + set { + storiesBlockBackgroundColorChanged_Light = newValue + } + } + + public var storiesBlockBackgroundColorChanged_Dark: UIColor? + public var storiesBlockBackgroundColorConstant_Dark: UIColor { + get { + return .black + } + set { + storiesBlockBackgroundColorChanged_Dark = newValue + } + } + + public var slideDefaultButtonFontNameChanged: String? + public var slideDefaultButtonFontNameConstant: String { + get { + return "San Francisco (System Font)" + } + set { + slideDefaultButtonFontNameChanged = newValue + } + } + + public var slideDefaultButtonFontSizeChanged: CGFloat? + public var slideDefaultButtonFontSizeConstant: CGFloat { + get { + return 14.0 + } + set { + slideDefaultButtonFontSizeChanged = newValue + } + } + + public var slideDefaultButtonTextColorChanged_Light: UIColor? + public var slideDefaultButtonTextColorConstant_Light: UIColor { + get { + return .black + } + set { + slideDefaultButtonTextColorChanged_Light = newValue + } + } + + public var slideDefaultButtonTextColorChanged_Dark: UIColor? + public var slideDefaultButtonTextColorConstant_Dark: UIColor { + get { + return .black + } + set { + slideDefaultButtonTextColorChanged_Dark = newValue + } + } + + public var slideDefaultButtonBackgroundColorChanged_Light: UIColor? + public var slideDefaultButtonBackgroundColorConstant_Light: UIColor { + get { + return .white + } + set { + slideDefaultButtonBackgroundColorChanged_Light = newValue + } + } + + public var slideDefaultButtonBackgroundColorChanged_Dark: UIColor? + public var slideDefaultButtonBackgroundColorConstant_Dark: UIColor { + get { + return .white + } + set { + slideDefaultButtonBackgroundColorChanged_Dark = newValue + } + } + + public var slideProductsButtonFontNameChanged: String? + public var slideProductsButtonFontNameConstant: String { + get { + return "San Francisco (System Font)" } + set { + slideProductsButtonFontNameChanged = newValue } + } + + public var slideProductsButtonFontSizeChanged: CGFloat? + public var slideProductsButtonFontSizeConstant: CGFloat { + get { + return 14.0 + } + set { + slideProductsButtonFontSizeChanged = newValue + } + } + + public var slideProductsButtonTextColorChanged_Light: UIColor? + public var slideProductsButtonTextColorConstant_Light: UIColor { + get { + return .black + } + set { + slideProductsButtonTextColorChanged_Light = newValue + } + } + + public var slideProductsButtonTextColorChanged_Dark: UIColor? + public var slideProductsButtonTextColorConstant_Dark: UIColor { + get { + return .black + } + set { + slideProductsButtonTextColorChanged_Dark = newValue + } + } + + public var slideProductsButtonBackgroundColorChanged_Light: UIColor? + public var slideProductsButtonBackgroundColorConstant_Light: UIColor { + get { + return .white + } + set { + slideProductsButtonBackgroundColorChanged_Light = newValue + } + } + + public var slideProductsButtonBackgroundColorChanged_Dark: UIColor? + public var slideProductsButtonBackgroundColorConstant_Dark: UIColor { + get { + return .white + } + set { + slideProductsButtonBackgroundColorChanged_Dark = newValue + } + } + + public var slideProductsHideButtonFontNameChanged: String? + public var slideProductsHideButtonFontNameConstant: String { + get { + return "San Francisco (System Font)" + } + set { + slideProductsButtonFontNameChanged = newValue + } + } + + public var bootRegisteredFontChanged: UIFont? + public var bootRegisteredFontConstant: UIFont { + get { + return .systemFont(ofSize: 14.0) + } + set { + bootRegisteredFontChanged = newValue + } + } + + public class func customFont(name: String, size: CGFloat) -> UIFont { + let sizeWithOffset = size + guard let sFont = UIFont(name: name, size: sizeWithOffset) else { + UIFont.familyNames.forEach({ familyName in + let fontNames = UIFont.fontNames(forFamilyName: familyName) + print(familyName, fontNames) + }) + print("SDK Error Font not found: \(name)") + return UIFont.systemFont(ofSize: 15.0) + } + return sFont + } +} + + +private extension SdkConfiguration { + class func loadFonts(at url: URL) -> [sdkFontClass] { + var loadedFonts: [sdkFontClass] = [] + + do { + let contents = try FileManager.default.contentsOfDirectory( + at: url, + includingPropertiesForKeys: nil, + options: [.skipsHiddenFiles] + ) + + let alreadyLoaded = SdkConfiguration.stories.allLoadedFonts.map { $0.url } + for font in fonts(contents) { + if let idx = alreadyLoaded.firstIndex(of: font.url) { + loadedFonts.append(SdkConfiguration.stories.allLoadedFonts[idx]) + } else if let lf = loadFont(font) { + loadedFonts.append(lf) + } + } + } catch let error as NSError { + print("SDK There was an error loading fonts. Path: \(url). Error: \(error)") + } + return loadedFonts + } + + class func loadFontsFromBundles(at url: URL) -> [sdkFontClass] { + var loadedFonts: [sdkFontClass] = [] + + do { + let contents = try FileManager.default.contentsOfDirectory( + at: url, + includingPropertiesForKeys: nil, + options: [.skipsHiddenFiles] + ) + + for item in contents { + guard item.absoluteString.contains(".bundle") else {continue} + loadedFonts += loadFonts(at: item) + } + } catch let error as NSError { + print("SDK There was an error accessing bundle with url. Path: \(url). Error: \(error) ") + } + return loadedFonts + } + + class func loadFont(_ font: sdkFontClass) -> sdkFontClass? { + let fileURL: sdkFontPath = font.url + let name = font.name + var nowLoadedFontName: String? + var sdkRef: CGFont? + var error: Unmanaged? + + if let data = try? Data(contentsOf: fileURL) as CFData, + let sdkDataProvider = CGDataProvider(data: data) { + workaroundDeadlock() + + sdkRef = CGFont(sdkDataProvider) + + if CTFontManagerRegisterGraphicsFont(sdkRef!, &error) { + if let postScriptName = sdkRef?.postScriptName { + print("SDK Successfully loaded custom font: '\(postScriptName)'.") + nowLoadedFontName = String(postScriptName) + } + } else if let error = error?.takeRetainedValue() { + let errorDescription = CFErrorCopyDescription(error) + print("SDK Already installed custom font '\(name)': \(String(describing: errorDescription))") + } + } else { + guard let error = error?.takeRetainedValue() else { + print("SDK Failed to load font '\(name)'.") + return nil + } + let errorDescription = CFErrorCopyDescription(error) + print("SDK Failed to load font '\(name)': \(String(describing: errorDescription))") + } + + if let sdkLfn = nowLoadedFontName { + return (fileURL, sdkLfn) + } + return nil + } + + class func workaroundDeadlock() { + _ = UIFont.systemFont(ofSize: 7) + } +} + + +extension SdkConfiguration { + class func fonts(_ contents: [URL]) -> [sdkFontClass] { + var fonts = [sdkFontClass]() + for fontUrl in contents { + if let fontName = font(fontUrl) { + fonts.append((fontUrl, fontName)) + } + } + return fonts + } + + class func font(_ fontUrl: URL) -> sdkFontName? { + let name = fontUrl.lastPathComponent + let comps = name.components(separatedBy: ".") + if comps.count < 2 { + return nil + } + + let fname = comps[0 ..< comps.count - 1].joined(separator: ".") + return SdkFontInjector.sdkSupportedFontExtensions(comps.last!) != nil ? fname : nil + } +} + + +extension UIColor { + convenience init(hexString: String) { + let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) + var int = UInt32() + Scanner(string: hex).scanHexInt32(&int) + let a, r, g, b: UInt32 + switch hex.count { + case 3: + (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) + case 6: + (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) + case 8: + (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) + default: + (a, r, g, b) = (255, 0, 0, 0) + } + self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) + } + + convenience init(hexString: String, alpha: CGFloat = 1.0) { + let hexString: String = hexString.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + let scanner = Scanner(string: hexString) + if (hexString.hasPrefix("#")) { + scanner.scanLocation = 1 + } + + var color: UInt32 = 0 + scanner.scanHexInt32(&color) + let mask = 0x000000FF + let r = Int(color >> 16) & mask + let g = Int(color >> 8) & mask + let b = Int(color) & mask + + let red = CGFloat(r) / 255.0 + let green = CGFloat(g) / 255.0 + let blue = CGFloat(b) / 255.0 + + self.init(red: red, green: green, blue: blue, alpha: alpha) + } + + func toHexString() -> String { + var r:CGFloat = 0 + var g:CGFloat = 0 + var b:CGFloat = 0 + var a:CGFloat = 0 + getRed(&r, green: &g, blue: &b, alpha: &a) + + let rgb: Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0 + return String(format:"#%06x", rgb) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift new file mode 100644 index 0000000..532f887 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift @@ -0,0 +1,22 @@ +import UIKit + +public extension RawRepresentable where Self: Hashable { + + static var allCases: AnySequence { + typealias S = Self + return AnySequence { () -> AnyIterator in + var raw = 0 + return AnyIterator { + let current: Self = withUnsafePointer(to: &raw) { $0.withMemoryRebound(to: S.self, capacity: 1) { $0.pointee } } + guard current.hashValue == raw else { + return nil + } + + raw += 1 + print("\(current)") + return current + } + } + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift new file mode 100644 index 0000000..92cd6ae --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift @@ -0,0 +1,15 @@ +import UIKit + +public enum SdkDynamicFont: String, SdkFontPackage { + + case regular = "Inter" + + public var fontPath: String { + return "" + } + + public var fontExtension: FontExtension { + return .ttf + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift new file mode 100644 index 0000000..7892188 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift @@ -0,0 +1,135 @@ +import UIKit + +public protocol SdkFontPackage: Hashable, RawRepresentable { + static func dynamicFont(textStyle: SdkFontTextStyleImplement, weight: UIFont.Weight) -> UIFont + static func font(ofSize size: CGFloat, weight: UIFont.Weight) -> UIFont +} + +public enum FontExtension: String { + case ttf = ".ttf" + case otf = ".otf" + case fnt = ".fnt" +} + +open class SdkFontInjector: NSObject { + + public static let manager: SdkFontInjector = SdkFontInjector() + + public static var lastestRegisterFontFamilyName: String? + public static var registeredFont: [String: [UIFont.Weight : String]] = [:] + + static internal func font(ofSize size: CGFloat, weight: UIFont.Weight = .regular) -> UIFont? { + guard let registeredFontName = lastestRegisterFontFamilyName, + let fonts = registeredFont[registeredFontName], + fonts.values.count > 0 else { + return nil + } + let postScriptedName = fonts[weight] ?? fonts[.regular] ?? Array(fonts.values)[0] + return UIFont(name: postScriptedName, size: size) + } + + public enum sdkSupportedFontExtensions: String { + case trueType = "ttf" + case openType = "otf" + + init?(_ ver: String?) { + if sdkSupportedFontExtensions.trueType.rawValue == ver { + self = .trueType + } else if sdkSupportedFontExtensions.openType.rawValue == ver { + self = .openType + } else { + return nil + } + } + } + + public func registerFontNameWithExtension(fileName: String, fileExtension: String) { + var parsedFont: (sdkFontName, sdkFontExtension)? + + if fileName.contains(sdkSupportedFontExtensions.trueType.rawValue) || fileName.contains(sdkSupportedFontExtensions.openType.rawValue) { + parsedFont = SdkConfiguration.fontExt(fromName: fileName) + } else { + var tmpName = fileName + "." + sdkSupportedFontExtensions.trueType.rawValue + parsedFont = SdkConfiguration.fontExt(fromName: tmpName) + if parsedFont == nil { + tmpName = fileName + "." + sdkSupportedFontExtensions.openType.rawValue + parsedFont = SdkConfiguration.fontExt(fromName: tmpName) + } + } + + if parsedFont != nil { + let pathForResourceString = Bundle.main.path(forResource: fileName, ofType: fileExtension) + if pathForResourceString != nil { + let fontData = NSData(contentsOfFile: pathForResourceString!) + let dataProvider = CGDataProvider(data: fontData!) + let fontRef = CGFont(dataProvider!) + var errorRef: Unmanaged? = nil + + if (CTFontManagerRegisterGraphicsFont(fontRef!, &errorRef) == false) { + print("SDK Error registering font") + } else { + let fontName = fontRef!.postScriptName as String? + let fontWeightName = "\(String(describing: fontName))".split(separator: ".").last + for fontWeight in UIFont.Weight.all { + if let key = fontWeight.key, key == fontWeightName! { + if SdkFontInjector.registeredFont[fontName!] == nil { + SdkFontInjector.registeredFont[fontName!] = [:] + } + } + //SdkFontInjector.registeredFont[fontName!]?[fontWeight] = fontName + } + SdkFontInjector.registeredFont[fontName!]?[UIFont.Weight.regular] = fontName + print("SDK Success registering font") + SdkFontInjector.lastestRegisterFontFamilyName = fontName + } + } + } + } +} + + +extension SdkFontPackage { + public static func dynamicFont(textStyle: SdkFontTextStyleImplement, weight: UIFont.Weight = .regular) -> UIFont { + return UIFont.dynamicFont(style: textStyle, weight: weight, ofFont: Self.self) + } + + public static func font(ofSize size: CGFloat, weight: UIFont.Weight = .regular) -> UIFont { + return UIFont.staicFont(ofSize: size, weight: weight) + } +} + + +extension SdkFontPackage where Self.RawValue == String { + var fileName: String { + return rawValue + } + + static var familyName: String { + return "\(self)" + } +} + + +extension UIFont.Weight { + static var mappingKeys: [UIFont.Weight: String] { + return [.ultraLight: "ultraLight", + .thin: "thin", + .light: "light", + .regular: "regular", + .medium: "medium", + .semibold: "semibold", + .bold: "bold", + .heavy: "heavy", + .black: "black"] + } + + static var all: [UIFont.Weight] { + return Array(mappingKeys.keys) + } + + var key: String? { + return UIFont.Weight.mappingKeys[self] + } + +} + diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift new file mode 100644 index 0000000..989ba2a --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift @@ -0,0 +1,64 @@ +import UIKit + +public enum SdkFontTextStyleImplement: Int { + + case largeTitleDefault = 0 + case largeTitle + case mediumTitle + case smallTitle + case headline + case body + case callout + case subheadline + case footnote + case caption1 + case caption2 + + internal var systemSdkFontTextStyleImplement: UIFont.TextStyle? { + return [SdkFontTextStyleImplement.largeTitle: UIFont.TextStyle.title1, + SdkFontTextStyleImplement.mediumTitle: UIFont.TextStyle.title2, + SdkFontTextStyleImplement.smallTitle: UIFont.TextStyle.title3, + SdkFontTextStyleImplement.headline: UIFont.TextStyle.headline, + SdkFontTextStyleImplement.body: UIFont.TextStyle.body, + SdkFontTextStyleImplement.callout: UIFont.TextStyle.callout, + SdkFontTextStyleImplement.subheadline: UIFont.TextStyle.subheadline, + SdkFontTextStyleImplement.footnote: UIFont.TextStyle.footnote, + SdkFontTextStyleImplement.caption1: UIFont.TextStyle.caption1, + SdkFontTextStyleImplement.caption2: UIFont.TextStyle.caption2][self] + } + + public var dynamicPointSize: CGFloat { + if let systemSdkFontTextStyleImplement = systemSdkFontTextStyleImplement { + + return UIFont.preferredFont(forTextStyle: systemSdkFontTextStyleImplement).pointSize + + } else if self == .largeTitle { + let titleFontSize = UIFont.preferredFont(forTextStyle: .title1).pointSize + + if let title1SizingMapper = [38, 43, 48, 53, 58].firstIndex(of: titleFontSize) { + return [44, 48, 52, 56, 60][title1SizingMapper] + } + return 52 + } + return 16 + } + +} + + +extension UIFont { + class func dynamicFont(style: SdkFontTextStyleImplement, + weight: UIFont.Weight = .regular, + ofFont font: T.Type? = nil) -> UIFont { + return UIFont.staicFont(ofSize: style.dynamicPointSize, weight: weight) + } + + internal class func staicFont(ofSize size: CGFloat, weight: UIFont.Weight) -> UIFont { + if let font = SdkFontInjector.font(ofSize: size, weight: weight) { + return font + } + + return UIFont.systemFont(ofSize: size, weight: weight) + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift new file mode 100644 index 0000000..203458f --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift @@ -0,0 +1,93 @@ +import UIKit + +open class UISdkWrapLabel: UILabel { + + @IBInspectable + public var maximumFontSizeBySdk: CGFloat = 40 + + @IBInspectable + public var minimumFontSizeBySdk: CGFloat = 1 + + public convenience init() { + self.init(frame: CGRect.zero) + } + + public override init(frame: CGRect) { + super.init(frame: frame) + self.commonInit() + } + + public required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + open override func awakeFromNib() { + super.awakeFromNib() + self.commonInit() + } + + open func commonInit() { + self.adjustsFontSizeToFitWidth = false + } + + open override func layoutSubviews() { + super.layoutSubviews() + self.adjustFontSize() + self.setMinimumScaleFactorBySdk() + } + + private func adjustFontSize() { + if self.maximumFontSizeBySdk < self.minimumFontSizeBySdk { + print("SDK Warning maximumFontSizeBySdk should be greater minimumFontSizeBySdk") + self.minimumFontSizeBySdk = self.maximumFontSizeBySdk + } + + let additionalLbl = self.getAdditionalLbl() + + var adjustmentSdkResultFontSize: CGFloat = self.minimumFontSizeBySdk + var currentMax: Int = Int(self.maximumFontSizeBySdk) + var currentMin: Int = Int(self.minimumFontSizeBySdk) + + repeat { + var middleValue = currentMin + ((currentMax - currentMin) / 2) + + additionalLbl.font = additionalLbl.font.withSize(CGFloat(middleValue)) + additionalLbl.bounds = CGRect.zero + additionalLbl.sizeToFit() + + if additionalLbl.bounds.width > self.bounds.width { + + if currentMax == middleValue { + middleValue -= 1 + } + + currentMax = middleValue + } else { + adjustmentSdkResultFontSize = CGFloat(middleValue) + + if currentMin == middleValue { + middleValue += 1 + } + + currentMin = middleValue + } + + } while currentMin <= currentMax + + self.font = self.font.withSize(adjustmentSdkResultFontSize) + } + + private func getAdditionalLbl() -> UILabel { + + let additionalLbl = UILabel() + additionalLbl.font = self.font + additionalLbl.numberOfLines = 0 + additionalLbl.text = self.text?.replacingOccurrences(of: " ", with: "\n") + return additionalLbl + } + + private func setMinimumScaleFactorBySdk() { + let currentFontSize = self.font.pointSize + self.minimumScaleFactor = self.minimumFontSizeBySdk / currentFontSize + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift new file mode 100644 index 0000000..eff0e7d --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift @@ -0,0 +1,13 @@ +import Foundation + +public protocol SdkApperanceViewScheme { + func SdkApperanceViewScheme() -> String +} + + +extension RawRepresentable where RawValue == String { + public func SdkApperanceViewScheme() -> String { + let str = String(describing: type(of: self)) + rawValue + return str + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift new file mode 100644 index 0000000..d0c9f62 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift @@ -0,0 +1,180 @@ +import UIKit + +public class SdkStyle: NSObject { + + public static var shared: SdkStyle = { + return SdkStyle() + }() + + private static let animationDuration = 0.2 + + private struct WeakViewControllerContainer { + weak var viewController: UIViewController? + } + + private var viewControllers: [WeakViewControllerContainer] = [] + + public var colorSchemes: [String: SdkStyleColorScheme] = [:] + public var currentColorScheme: SdkStyleColorScheme? = nil + public var currentStoriesBlockColorScheme: sdkElement_storiesBlockColorScheme? = nil + public var fonts: [String: SdkStyleCustomFonts] = [:] + public var currentFonts: SdkStyleCustomFonts? = nil + + private override init() { + super.init() + } + + public static let configure: Void = { + UIView.swizzleWillMove + UIViewController.swizzleViewDidLoad + }() + + public func register(colorScheme: SdkStyleColorScheme, for key: SdkApperanceViewScheme) { + colorSchemes[key.SdkApperanceViewScheme()] = colorScheme + } + + public func register(fonts: SdkStyleCustomFonts, for key: SdkApperanceViewScheme) { + self.fonts[key.SdkApperanceViewScheme()] = fonts + } + + public func switchApppearance(to key: SdkApperanceViewScheme, animated: Bool) { + guard let colorScheme = colorSchemes[key.SdkApperanceViewScheme()] else { + return + } + + currentColorScheme = colorScheme + + for viewControllerContainer in viewControllers { + if let viewController = viewControllerContainer.viewController { + viewController.applyColorScheme(colorScheme, animated: animated) + } + } + } + + public func switchFontSize(to key: SdkApperanceViewScheme) { + guard let fonts = fonts[key.SdkApperanceViewScheme()] else { + return + } + + currentFonts = fonts + + for viewControllerContainer in viewControllers { + if let viewController = viewControllerContainer.viewController { + viewController.applySdkCustomFonts(fonts) + } + } + } + + public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if let view = object as? UIView, + keyPath == #keyPath(UIView.isHidden) { + if let currentColorScheme = currentColorScheme { + view.downcastColorScheme(currentColorScheme, animated: false) + } + if let currentFonts = currentFonts { + view.downcastSdkAllFonts(currentFonts) + } + } + } + + internal func registerViewController(_ viewController: UIViewController) { + print("SDK SdkStyle registers view controller: \(String(describing: type(of: viewController)))") + if blacklist.contains(String(describing: type(of: viewController))) { + return + } + + viewControllers.append(WeakViewControllerContainer(viewController: viewController)) + + if let currentColorScheme = currentColorScheme { + viewController.applyColorScheme(currentColorScheme, animated: false) + } + if let currentFonts = currentFonts { + viewController.applySdkCustomFonts(currentFonts) + } + } + + internal static func applySdkStyleApperance(animated: Bool, block: @escaping (() -> Void)) { + if animated { + UIView.animate(withDuration: animationDuration, animations: block) + } + else { + block() + } + } + + fileprivate var blacklist: [String] = [] + + public func blackListVC(_ type: UIViewController.Type) { + blacklist.append(String(describing: type)) + } + + public func blackListVC(name: String) { + blacklist.append(name) + } +} + + +extension UIView { + @objc + func apppear_willMove(toSuperview newSuperview: UIView?) { + apppear_willMove(toSuperview: newSuperview) + + + let blacklisted: Bool + if let parentVC = self.parentViewController, + SdkStyle.shared.blacklist.contains(String(describing: type(of: parentVC))) { + blacklisted = true + } + else { + blacklisted = false + } + + + if !blacklisted, + newSuperview != nil { + if let currentColorScheme = SdkStyle.shared.currentColorScheme { + downcastColorScheme(currentColorScheme, animated: false) + } + if let currentFonts = SdkStyle.shared.currentFonts { + downcastSdkAllFonts(currentFonts) + } + } + + if self is UITableViewCell { + if newSuperview != nil { + addObserver(SdkStyle.shared, forKeyPath: #keyPath(UIView.isHidden), options: [.new], context: nil) + } + else { + removeObserver(SdkStyle.shared, forKeyPath: #keyPath(UIView.isHidden)) + } + } + } + + fileprivate static let swizzleWillMove: Void = { + let originalMethod = class_getInstanceMethod(UIView.self, #selector(willMove(toSuperview:))) + let swizzledMethod = class_getInstanceMethod(UIView.self, #selector(apppear_willMove(toSuperview:))) + + if let originalMethod = originalMethod, + let swizzledMethod = swizzledMethod { + method_exchangeImplementations(originalMethod, swizzledMethod) + } + }() +} + + +extension UIViewController { + @objc + func apppear_viewDidLoad() { + apppear_viewDidLoad() + SdkStyle.shared.registerViewController(self) + } + + fileprivate static let swizzleViewDidLoad: Void = { + let originalMethod = class_getInstanceMethod(UIViewController.self, #selector(viewDidLoad)) + let swizzledMethod = class_getInstanceMethod(UIViewController.self, #selector(apppear_viewDidLoad)) + if let originalMethod = originalMethod, + let swizzledMethod = swizzledMethod { + method_exchangeImplementations(originalMethod, swizzledMethod) + } + }() +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift new file mode 100644 index 0000000..64f3879 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift @@ -0,0 +1,96 @@ +import UIKit + +public class SdkFontFamily { + + private func mostSimilarFontName(regularName: String, usage: String) -> String? { + for familyName in UIFont.familyNames { + for fontName in UIFont.fontNames(forFamilyName: familyName) { + guard fontName.lowercased() != regularName.lowercased() + "-" + usage.lowercased() else { + return fontName + } + + guard fontName.lowercased() != regularName.lowercased() + "_" + usage.lowercased() else { + return fontName + } + + guard fontName.lowercased() != regularName.lowercased() + " " + usage.lowercased() else { + return fontName + } + + guard fontName.lowercased() != regularName.lowercased() + usage.lowercased() else { + return fontName + } + } + } + return nil + } + + internal lazy var ultraLight: String = { + return mostSimilarFontName(regularName: regular, usage: "UltraLight") ?? thin // ?? light ?? regular + }() + + internal lazy var thin: String = { + return mostSimilarFontName(regularName: regular, usage: "thin") ?? light // ?? regular + }() + + internal lazy var light: String = { + return mostSimilarFontName(regularName: regular, usage: "light") ?? regular + }() + + internal let regular: String + + internal lazy var oblique: String = { + return mostSimilarFontName(regularName: regular, usage: "Oblique") ?? regular + }() + + internal lazy var medium: String = { + return mostSimilarFontName(regularName: regular, usage: "medium") ?? regular + }() + + internal lazy var semibold: String = { + return mostSimilarFontName(regularName: regular, usage: "semibold") ?? medium // ?? regular + }() + + internal lazy var bold: String = { + return mostSimilarFontName(regularName: regular, usage: "bold") ?? semibold // ?? medium ?? regular + }() + + internal lazy var emphasized: String = { + return mostSimilarFontName(regularName: regular, usage: "emphasized") ?? bold // ?? medium ?? regular + }() + + internal lazy var heavy: String = { + return mostSimilarFontName(regularName: regular, usage: "heavy") ?? bold // ?? semibold ?? medium ?? regular + }() + + internal lazy var black: String = { + return mostSimilarFontName(regularName: regular, usage: "black") ?? heavy // ?? bold ?? semibold ?? medium ?? regular + }() + + public init(regular: String, + ultraLight: String? = nil, + thin: String? = nil, + light: String? = nil, + oblique: String? = nil, + medium: String? = nil, + semibold: String? = nil, + bold: String? = nil, + emphasized: String? = nil, + heavy: String? = nil, + black: String? = nil) { + + self.regular = regular + + if let ultraLight = ultraLight { self.ultraLight = ultraLight } + if let thin = thin { self.thin = thin } + if let light = light { self.light = light } + if let oblique = oblique { self.oblique = oblique } + if let medium = medium { self.medium = medium } + if let semibold = semibold { self.semibold = semibold } + if let bold = bold { self.bold = bold } + if let emphasized = emphasized { self.emphasized = emphasized } + if let heavy = heavy { self.heavy = heavy } + if let black = black { self.black = black } + + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift new file mode 100644 index 0000000..f4b1ce1 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift @@ -0,0 +1,34 @@ +import Foundation + +public typealias fontInstaller = SdkFontInstaller + +public class SdkFontInstaller { + + public class func exchange(classMethod orginalSystemMethod: Selector, of originalSystemClass: AnyClass?, with customSystemMethod: Selector, of customSystemClass: AnyClass?) { + + guard let originalSystemMethod = class_getClassMethod(originalSystemClass, orginalSystemMethod) else { + return assertionFailure("SDK Original class method not found") + } + + guard let customSystemMethod = class_getClassMethod(customSystemClass, customSystemMethod) else { + return assertionFailure("SDK Custom class method not found") + } + + method_exchangeImplementations(originalSystemMethod, customSystemMethod) + } + + + public class func exchange(instanceMethod orginalSystemMethod: Selector, of originalSystemClass: AnyClass?, with customSystemMethod: Selector, of customSystemClass: AnyClass?) { + + guard let originalSystemMethod = class_getInstanceMethod(originalSystemClass, orginalSystemMethod) else { + return assertionFailure("SDK Original instance method not found") + } + + guard let customSystemMethod = class_getInstanceMethod(customSystemClass, customSystemMethod) else { + return assertionFailure("SDK Custom instance method not found") + } + + method_exchangeImplementations(originalSystemMethod, customSystemMethod) + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift new file mode 100644 index 0000000..a238341 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift @@ -0,0 +1,160 @@ +import UIKit +import Foundation + +public protocol sdkStyleManagerProtocol { + func setStoriesViewFont(fontName: String) + func isDeviceDarkModeEnabled() -> Bool + func getSession() -> String +} + +@objc +public extension UIApplication { + + func setStoriesViewFont(fontName: String) { + _ = { + $0.isUserInteractionEnabled = true + $0.font = UIFont(name: fontName, size: 14) + }(UILabel.appearance()) + } + + func setStoriesViewBackgroundColor(color: UIColor) { + _ = { + $0.backgroundColor = .white + }(UICollectionView.appearance()) + } + + func setupFullAppearanceTheme(_ tintColor: UIColor, barTintColor: UIColor) { + _ = { + $0.barTintColor = barTintColor + $0.tintColor = tintColor + $0.titleTextAttributes = [.foregroundColor: tintColor, + ] + }(UINavigationBar.appearance()) + + _ = { + $0.tintColor = nil + }(UINavigationBar.appearance(whenContainedInInstancesOf: [UIDocumentBrowserViewController.self])) + + _ = { + $0.setTitleTextAttributes([.font: UIFont.systemFont(ofSize: 17), ], for: .normal) + $0.setTitleTextAttributes([.font: UIFont.systemFont(ofSize: 15), ], for: .highlighted) + }(UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self])) + + _ = { + $0.setTitleTextAttributes([.foregroundColor: UIColor.black], for: .normal) + }(UIBarButtonItem.appearance(whenContainedInInstancesOf: [UIImagePickerController.self])) + + _ = { + $0.setTitleColor(.black, for: .normal) + $0.titleLabel?.adjustsFontSizeToFitWidth = true + $0.titleLabel?.minimumScaleFactor = 1.0 + $0.imageView?.contentMode = .scaleAspectFit + $0.isExclusiveTouch = true + $0.adjustsImageWhenHighlighted = false + }(UIButton.appearance()) + + if let aClass = NSClassFromString("UICalloutBarButton")! as? UIButton.Type { + aClass.appearance().setTitleColor(.white, for: .normal) + } + + _ = { + $0.autoresizingMask = [.flexibleWidth, .flexibleHeight] + $0.showsHorizontalScrollIndicator = false + $0.keyboardDismissMode = .onDrag + $0.contentInsetAdjustmentBehavior = .never + }(UIScrollView.appearance()) + + _ = { + $0.separatorInset = .zero + $0.separatorStyle = .singleLine + $0.rowHeight = 60 + $0.backgroundColor = .groupTableViewBackground + $0.estimatedRowHeight = 0.0 + $0.estimatedSectionHeaderHeight = 0.0 + $0.estimatedSectionFooterHeight = 0.0 + }(UITableView.appearance()) + + _ = { + $0.layoutMargins = .zero + $0.separatorInset = .zero + $0.selectionStyle = .none + $0.backgroundColor = .white + }(UITableViewCell.appearance()) + + _ = { + $0.scrollsToTop = false + $0.isPagingEnabled = true + $0.bounces = false + }(UICollectionView.appearance()) + + _ = { + $0.layoutMargins = .zero + $0.backgroundColor = .white + }(UICollectionViewCell.appearance()) + + _ = { + $0.isUserInteractionEnabled = true + }(UIImageView.appearance()) + + _ = { + $0.isUserInteractionEnabled = true + }(UILabel.appearance()) + + _ = { + $0.pageIndicatorTintColor = barTintColor + $0.currentPageIndicatorTintColor = tintColor + $0.isUserInteractionEnabled = true + $0.hidesForSinglePage = true + }(UIPageControl.appearance()) + + _ = { + $0.progressTintColor = barTintColor + $0.trackTintColor = .clear + }(UIProgressView.appearance()) + + _ = { + $0.minimumTrackTintColor = tintColor + $0.autoresizingMask = .flexibleWidth + }(UISlider.appearance()) + + _ = { + $0.onTintColor = tintColor + $0.autoresizingMask = .flexibleWidth + }(UISwitch.appearance()) + } + + var sdkCurrentKeyWindow: UIWindow? { + get { + if #available(iOS 13.0, *) { + return UIApplication.shared.windows.filter({ $0.isKeyWindow }).first + } + return UIApplication.shared.keyWindow ?? UIApplication.shared.windows.first + } + } + + var sdkCurrentViewController: UIViewController? { + guard let rootViewController = UIApplication.shared.keyWindow?.rootViewController else { + return nil + } + + if let presentedViewController = rootViewController.presentedViewController { + if let navigationController = presentedViewController as? UINavigationController { + return navigationController.topViewController + } + return presentedViewController + } + + if let navigationController = rootViewController as? UINavigationController { + return navigationController.topViewController + } + + if let tabBarController = rootViewController as? UITabBarController { + if let navigationController = tabBarController.selectedViewController as? UINavigationController{ + return navigationController.topViewController + } + return tabBarController.viewControllers?.first + } + return nil + + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift @@ -0,0 +1 @@ + diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift new file mode 100644 index 0000000..4600bba --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift @@ -0,0 +1,65 @@ +import UIKit + +public protocol sdkElement_storiesBlockColorScheme { + var storiesBlockBackgroundColor: UIColor { get set } +} + +public protocol SdkStyleColorScheme { + var storiesBlockSelectFontName: UIFont { get set } + var storiesBlockSelectFontSize: CGFloat { get set } + var storiesBlockFontColor: UIColor { get set } + var storiesBlockBackgroundColor: UIColor { get set } + + var defaultButtonSelectFontName: UIFont { get set } + var defaultButtonSelectFontSize: CGFloat { get set } + var defaultButtonFontColor: UIColor { get set } + var defaultButtonBackgroundColor: UIColor { get set } + + var productsButtonSelectFontName: UIFont { get set } + var productsButtonSelectFontSize: CGFloat { get set } + var productsButtonFontColor: UIColor { get set } + var productsButtonBackgroundColor: UIColor { get set } + + var viewControllerBackground: UIColor { get } + var navigationBarStyle: UIBarStyle { get } + var navigationBarBackgroundColor: UIColor { get } + var navigationBarTextColor: UIColor { get } +} + +public protocol SdkStyleViewColorScheme { + var viewBackgroundColor: UIColor { get } +} + +public protocol SdkStyleLabelColorScheme { + var labelTextColor: UIColor { get } +} + +public protocol SdkStyleButtonColorScheme { + var buttonTintColor: UIColor { get } +} + +public protocol SdkStyleTableViewColorScheme { + var tableViewBackgroundColor: UIColor { get } + var tableViewSeparatorColor: UIColor { get } + var headerBackgroundColor: UIColor { get } + var headerTextColorColor: UIColor { get } + var cellBackgroundColor: UIColor { get } + var cellTextColorColor: UIColor { get } + var cellSubTextColorColor: UIColor { get } +} + +public protocol SdkStyleCollectionViewColorScheme { + var collectionViewBackgroundColor: UIColor { get } + var cellBackgroundColor: UIColor { get } + var cellTextColorColor: UIColor { get } + var cellSubTextColorColor: UIColor { get } +} + +public protocol SdkStyleDatePickerColorScheme { + var datePickerTextColor: UIColor { get } +} + +public protocol SdkStyleRefreshControlColorScheme { + var refreshControlTintColor: UIColor { get } + var refreshControlTextColor: UIColor { get } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift new file mode 100644 index 0000000..a0803a0 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift @@ -0,0 +1,192 @@ +import UIKit + +protocol SdkStyleColorSchemeAwareView { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme) + + var shouldDowncastColorScheme: Bool { get } +} + + +extension SdkStyleColorSchemeAwareView { + var shouldDowncastColorScheme: Bool { + return false + } +} + + +extension UILabel: SdkStyleColorSchemeAwareView { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme) { + guard let labelColorScheme = colorScheme as? SdkStyleLabelColorScheme else { + return + } + + if skipColorScheme { + return + } + + textColor = labelColorScheme.labelTextColor + } +} + + +extension UIButton: SdkStyleColorSchemeAwareView { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme) { + guard let buttonColorScheme = colorScheme as? SdkStyleButtonColorScheme else { + return + } + + if skipColorScheme { + return + } + + tintColor = buttonColorScheme.buttonTintColor + } +} + + +extension UITableView: SdkStyleColorSchemeAwareView { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme) { + guard let tableViewColorScheme = colorScheme as? SdkStyleTableViewColorScheme else { + return + } + + if skipColorScheme { + return + } + + backgroundColor = tableViewColorScheme.tableViewBackgroundColor + } + + var shouldDowncastColorScheme: Bool { + return true + } +} + + +extension UICollectionView: SdkStyleColorSchemeAwareView { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme) { + guard let collectionViewColorScheme = colorScheme as? SdkStyleCollectionViewColorScheme else { + return + } + + if skipColorScheme { + return + } + + backgroundColor = collectionViewColorScheme.collectionViewBackgroundColor + } + + var shouldDowncastColorScheme: Bool { + return true + } +} + + +extension UITableViewCell: SdkStyleColorSchemeAwareView { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme) { + guard let tableViewColorScheme = colorScheme as? SdkStyleTableViewColorScheme else { + return + } + + if skipColorScheme { + return + } + + backgroundColor = tableViewColorScheme.cellBackgroundColor + textLabel?.textColor = tableViewColorScheme.cellTextColorColor + detailTextLabel?.textColor = tableViewColorScheme.cellSubTextColorColor + } + + var shouldDowncastColorScheme: Bool { + return true + } +} + + +extension UITableViewHeaderFooterView: SdkStyleColorSchemeAwareView { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme) { + guard let tableViewColorScheme = colorScheme as? SdkStyleTableViewColorScheme else { + return + } + + if skipColorScheme { + return + } + + backgroundView?.backgroundColor = tableViewColorScheme.headerBackgroundColor + textLabel?.textColor = tableViewColorScheme.headerTextColorColor + } +} + + +extension UIDatePicker: SdkStyleColorSchemeAwareView { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme) { + guard let datePickerColorScheme = colorScheme as? SdkStyleDatePickerColorScheme else { + return + } + + if skipColorScheme { + return + } + + setValue(datePickerColorScheme.datePickerTextColor, forKey: "textColor") + } +} + + +extension UIRefreshControl: SdkStyleColorSchemeAwareView { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme) { + guard let refreshControlColorScheme = colorScheme as? SdkStyleRefreshControlColorScheme else { + return + } + + if skipColorScheme { + return + } + + tintColor = refreshControlColorScheme.refreshControlTintColor + titleColor = refreshControlColorScheme.refreshControlTextColor + + updateTitle() + } + + private struct AssociatedKey { + static var key = "titleColor" + } + + public var titleColor: UIColor? { + get { + return objc_getAssociatedObject(self, AssociatedKey.key) as? UIColor + } + set { + objc_setAssociatedObject(self, AssociatedKey.key, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) + updateTitle() + } + } + + public var title: String? { + get { + return attributedTitle?.string + } + set { + guard let newTitle = newValue else { + attributedTitle = nil + return + } + + attributedTitle = NSAttributedString(string: newTitle) + updateTitle() + } + } + + private func updateTitle() { + guard let titleColor = titleColor, + let title = attributedTitle?.string else { + return + } + + let attrTitle = NSAttributedString(string: title, + attributes: [NSAttributedString.Key.foregroundColor: titleColor]) + attributedTitle = attrTitle + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift new file mode 100644 index 0000000..0cca1cd --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift @@ -0,0 +1,145 @@ +import UIKit + +protocol SdkStyleColorSchemeAwareViewController { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme, animated: Bool) +} + + +extension UIViewController: SdkStyleColorSchemeAwareViewController { + func applyColorScheme(_ colorScheme: SdkStyleColorScheme, animated: Bool) { + view.downcastColorScheme(colorScheme, animated: animated) + + SdkStyle.applySdkStyleApperance(animated: animated) { + if let customColorScheme = colorScheme as? SdkStyleCustomColorScheme, + let customColorSchemeAwareSelf = self as? SdkStyleCustomColorSchemeAwareViewController { + customColorSchemeAwareSelf.applyCustomColorScheme(customColorScheme) + } + else if let tableVC = self as? UITableViewController, + let tableViewColorScheme = colorScheme as? SdkStyleTableViewColorScheme { + tableVC.tableView.backgroundColor = tableViewColorScheme.tableViewBackgroundColor + tableVC.tableView.separatorColor = tableViewColorScheme.tableViewSeparatorColor + } + else if let collectionVC = self as? UICollectionViewController, + let collectionViewColorScheme = colorScheme as? SdkStyleCollectionViewColorScheme { + collectionVC.collectionView.backgroundColor = collectionViewColorScheme.collectionViewBackgroundColor + } + else { + if self.view.backgroundColor != nil, + self.view.backgroundColor != UIColor.clear { + self.view.backgroundColor = colorScheme.viewControllerBackground + } + } + + + if self.applyNavBarColors { + self.applyNavigationBarColorScheme(colorScheme) + } + } + } + + func applyNavigationBarColorScheme(_ colorScheme: SdkStyleColorScheme) { + self.navigationController?.navigationBar.barStyle = colorScheme.navigationBarStyle + self.navigationController?.navigationBar.tintColor = colorScheme.navigationBarTextColor + self.navigationController?.navigationBar.barTintColor = colorScheme.navigationBarBackgroundColor + } +} + + +extension UIView { + func downcastColorScheme(_ colorScheme: SdkStyleColorScheme, animated: Bool) { + + if let customColorScheme = colorScheme as? SdkStyleCustomColorScheme, + let customColorSchemeAwareSelf = self as? SdkStyleCustomColorSchemeAwareView { + SdkStyle.applySdkStyleApperance(animated: animated) { + customColorSchemeAwareSelf.applyCustomColorScheme(customColorScheme) + } + if !customColorSchemeAwareSelf.shouldDowncastCustomColorScheme { + return + } + } + + if let colorSchemeAwareSelf = self as? SdkStyleColorSchemeAwareView { + SdkStyle.applySdkStyleApperance(animated: animated) { + colorSchemeAwareSelf.applyColorScheme(colorScheme) + } + + if !colorSchemeAwareSelf.shouldDowncastColorScheme { + return + } + } + + for subview in subviews { + subview.downcastColorScheme(colorScheme, animated: animated) + } + + if type(of: self) == UIView.self, + parentViewController?.view != self, + let viewColorScheme = colorScheme as? SdkStyleViewColorScheme, + backgroundColor != UIColor.clear { + + SdkStyle.applySdkStyleApperance(animated: animated) { + self.backgroundColor = viewColorScheme.viewBackgroundColor + } + } + } +} + + +extension UIView { + var parentViewController: UIViewController? { + var parentResponder: UIResponder? = self + while parentResponder != nil { + parentResponder = parentResponder!.next + if let viewController = parentResponder as? UIViewController { + return viewController + } + } + return nil + } +} + + +extension UIView { + private struct AssociatedKey { + static var key = "skipColorScheme" + } + + public var skipColorScheme: Bool { + get { + return objc_getAssociatedObject(self, AssociatedKey.key) as? Bool ?? false + } + set { + if newValue { + objc_setAssociatedObject(self, AssociatedKey.key, true, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + else { + if let obj = objc_getAssociatedObject(self, AssociatedKey.key) as? Bool { + objc_removeAssociatedObjects(obj) + } + } + } + } +} + + +extension UIViewController { + private struct AssociatedKey { + static var key = "applyNavBarColors" + } + + public var applyNavBarColors: Bool { + get { + return objc_getAssociatedObject(self, AssociatedKey.key) as? Bool ?? true + } + set { + if newValue { + objc_setAssociatedObject(self, AssociatedKey.key, true, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + else { + if let obj = objc_getAssociatedObject(self, AssociatedKey.key) as? Bool { + objc_removeAssociatedObjects(obj) + } + } + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift new file mode 100644 index 0000000..25a3100 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift @@ -0,0 +1,14 @@ +import UIKit + +public protocol SdkStyleCustomColorScheme { + var customColors: [String : UIColor] { get } +} + + +extension SdkStyleCustomColorScheme { + public subscript(key: SdkApperanceViewScheme) -> UIColor { + get { + return customColors[key.SdkApperanceViewScheme()] ?? UIColor.black + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift new file mode 100644 index 0000000..4d43d80 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift @@ -0,0 +1,15 @@ +import UIKit + +public protocol SdkStyleCustomColorSchemeAwareView { + func applyCustomColorScheme(_ colorScheme: SdkStyleCustomColorScheme) + + var shouldDowncastCustomColorScheme: Bool { get } +} + + +extension SdkStyleCustomColorSchemeAwareView { + public var shouldDowncastCustomColorScheme: Bool { + return false + } +} + diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift new file mode 100644 index 0000000..97d7a1c --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol SdkStyleCustomColorSchemeAwareViewController { + func applyCustomColorScheme(_ colorScheme: SdkStyleCustomColorScheme) +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift new file mode 100644 index 0000000..0436091 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift @@ -0,0 +1,5 @@ +import UIKit + +public protocol SdkStyleCustomFontsAwareView { + func applySdkCustomFonts(_ fonts: SdkStyleCustomFonts) +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift new file mode 100644 index 0000000..0347f3b --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift @@ -0,0 +1,34 @@ +import UIKit + +protocol SdkStyleCustomFontsAwareViewController { + func applySdkCustomFonts(_ fonts: SdkStyleCustomFonts) +} + + +extension UIViewController: SdkStyleCustomFontsAwareViewController { + func applySdkCustomFonts(_ fonts: SdkStyleCustomFonts) { + if let tableVC = self as? UITableViewController { + for cell in tableVC.tableView.visibleCells { + cell.downcastSdkAllFonts(fonts) + } + tableVC.tableView.reloadData() + } + else { + view.downcastSdkAllFonts(fonts) + } + } +} + + +extension UIView { + func downcastSdkAllFonts(_ fonts: SdkStyleCustomFonts) { + if let sdkCustomFontsAwareSelf = self as? SdkStyleCustomFontsAwareView { + sdkCustomFontsAwareSelf.applySdkCustomFonts(fonts) + return + } + + for subview in subviews { + subview.downcastSdkAllFonts(fonts) + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift new file mode 100644 index 0000000..97ac2a9 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift @@ -0,0 +1,18 @@ +import UIKit + +public protocol SdkStyleCustomFonts { + var customFonts: [String : UIFont] { get set } +} + + +extension SdkStyleCustomFonts { + public subscript(key: SdkApperanceViewScheme) -> UIFont { + get { + return customFonts[key.SdkApperanceViewScheme()] ?? UIFont.systemFont(ofSize: UIFont.systemFontSize) + } + set { + + } + + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift new file mode 100644 index 0000000..31b3e5d --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift @@ -0,0 +1,54 @@ +import Foundation + +public class GenericDataTask: SessionDataTaskProtocol { + + public var sessionTask: URLSessionTask + public var sessionData: Data? + public let sessionIdentifier: Int + + public init(sessionTask: URLSessionTask, sessionData: Data? = nil, sessionIdentifier: Int? = nil) { + self.sessionTask = sessionTask + self.sessionData = sessionData + self.sessionIdentifier = sessionIdentifier ?? sessionTask.taskIdentifier + } + + public var sessionTaskElement: T? { + return sessionDecodable as? T + } + + public var sessionTaskElements: [T] { + return sessionDecodables as? [T] ?? [] + } + + public var sessionDecodable: Decodable? { + do { + guard let sessionData = sessionData else { + return nil + } + + return try JSONDecoder().decode(T.self, from: sessionData) + } catch let error { + debugPrint(error) + return nil + } + } + + public var sessionDecodables: [Decodable] { + do { + guard let data = sessionData else { + return [] + } + + return try JSONDecoder().decode([T].self, from: data) + } catch let error { + debugPrint(error) + return [] + } + } + + public func sessionUpdate(newData: Data) -> SessionDataTaskProtocol { + sessionData = sessionUpdate(data: sessionData, newData: newData) + return self + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SessionQueue/RequestOperation.swift b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/RequestOperation.swift new file mode 100644 index 0000000..2baa06d --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/RequestOperation.swift @@ -0,0 +1,132 @@ +import Foundation + +public enum HTTPMethod: String { + case get = "GET" + case post = "POST" + case put = "PUT" + case delete = "DELETE" + case options = "OPTIONS" + case patch = "PATCH" +} + +public class RequestOperation: SessionOperation { + + public enum RequestError: Error { + case urlError + case operationCancelled + } + + public typealias RequestClosure = (Bool, HTTPURLResponse?, Data?, Error?) -> Void + + public static var globalCachePolicy: URLRequest.CachePolicy = .useProtocolCachePolicy + + private(set) public var task: URLSessionDataTask? + + private(set) public var url: URL? + + private(set) public var query: String = "" + + private(set) public var completeURL: URL? + + private(set) public var timeout: TimeInterval = 10 + + private(set) public var cachePolicy: URLRequest.CachePolicy = globalCachePolicy + + private(set) public var method: HTTPMethod = .get + private(set) public var headers: [String: String] = [:] + private(set) public var body: Data = Data() + + private(set) public var completionHandler: RequestClosure? + + internal var session: URLSession { + return URLSession.shared + } + + private(set) public var request: URLRequest! + + private override init(executionBlock: (() -> Void)? = nil) { + super.init(executionBlock: nil) + } + + public convenience init(url: String, query: [String: String] = [:], timeout: TimeInterval = 10, method: HTTPMethod = .get, cachePolicy: URLRequest.CachePolicy = globalCachePolicy, headers: [String: String] = [:], sdkBody: Data = Data(), completionHandler: RequestClosure? = nil) { + + self.init() + + self.query = SdkQueryBuilder.build(query: query) + + self.url = URL(string: url) + self.completeURL = URL(string: url + self.query) + self.timeout = timeout + self.method = method + self.cachePolicy = cachePolicy + self.headers = headers + self.body = sdkBody + self.completionHandler = completionHandler + } + + public override func execute() { + guard !self.isCancelled else { + if let completionHandler = self.completionHandler { + completionHandler(false, nil, nil, RequestError.operationCancelled) + } + + self.finish() + return + } + + guard let url = self.completeURL else { + if let completionHandler = self.completionHandler { + completionHandler(false, nil, nil, RequestError.urlError) + } + + self.finish() + return + } + + request = URLRequest(url: url, cachePolicy: self.cachePolicy, timeoutInterval: self.timeout) + request.httpMethod = method.rawValue + request.httpBody = body + + for header in self.headers { + request.addValue(header.value, forHTTPHeaderField: header.key) + } + + self.task = self.session.dataTask(with: request) { data, response, error in + if let completionHandler = self.completionHandler { + if let httpResponse = response as? HTTPURLResponse { + var error: Error? = error + let success: Bool = httpResponse.statusCode >= 200 && httpResponse.statusCode < 400 && !self.isCancelled + + if self.isCancelled { + error = RequestError.operationCancelled + } + + completionHandler(success, httpResponse, data, error) + } else { + completionHandler(false, nil, data, error) + } + } + + self.finish() + } + self.task?.resume() + } + + public override func cancel() { + super.cancel() + + self.task?.cancel() + } + + public override func pause() { + super.pause() + + self.task?.suspend() + } + + public override func resume() { + super.resume() + + self.task?.resume() + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift new file mode 100644 index 0000000..5008030 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift @@ -0,0 +1,17 @@ +import Foundation + +internal struct SdkQueryBuilder { + + internal static func build(query: [String: String]) -> String { + var finalCombinatedQuery: String = "" + for (index, parameter) in query.enumerated() { + guard let parameterKey = parameter.key.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed), let parameterValue = parameter.value.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { + continue + } + + finalCombinatedQuery += index == 0 ? "?" : "&" + finalCombinatedQuery += parameterKey + "=" + parameterValue + } + return finalCombinatedQuery + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift new file mode 100644 index 0000000..c09dd08 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift @@ -0,0 +1,25 @@ +import Foundation + +public protocol SessionDataTaskProtocol { + var sessionTask: URLSessionTask { get } + var sessionData: Data? { get } + var sessionIdentifier: Int { get } + var sessionDecodable: Decodable? { get } + var sessionDecodables: [Decodable] { get } + func sessionUpdate(newData: Data) -> SessionDataTaskProtocol + func sessionUpdate(data: Data? , newData: Data) -> Data +} + + +extension SessionDataTaskProtocol { + + public func sessionUpdate(data: Data? , newData: Data) -> Data { + if var currentData = data { + currentData.append(newData) + return currentData + } + + return newData + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionOperation.swift b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionOperation.swift new file mode 100644 index 0000000..ca19e67 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionOperation.swift @@ -0,0 +1,69 @@ +import Foundation + +open class SessionOperation: Operation { + public var executionBlock: (() -> Void)? + + public init(executionBlock: (() -> Void)? = nil) { + super.init() + self.executionBlock = executionBlock + } + + open override var isAsynchronous: Bool { + return true + } + + private var _executing = false { + willSet { + willChangeValue(forKey: "isExecuting") + } + didSet { + didChangeValue(forKey: "isExecuting") + } + } + + open override var isExecuting: Bool { + return _executing + } + + private var _finished = false { + willSet { + willChangeValue(forKey: "isFinished") + } + didSet { + didChangeValue(forKey: "isFinished") + } + } + + open override var isFinished: Bool { + return _finished + } + + open override func start() { + _executing = true + execute() + } + + open func execute() { + if let executionBlock = executionBlock { + executionBlock() + self.finish() + } + } + + public func finish() { + _executing = false + _finished = true + } + + open func pause() {} + + open func resume() {} + + public func addToSharedQueuer() { + SessionQueue.manager.addOperation(self) + } + + public func addToQueue(_ queue: SessionQueue) { + queue.addOperation(self) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionQueue.swift b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionQueue.swift new file mode 100644 index 0000000..9a176e5 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/SessionQueue.swift @@ -0,0 +1,99 @@ +import Foundation + +open class SessionQueue { + + public static let manager: SessionQueue = SessionQueue(name: "datatasks.sessionQueue") + + //Sample usage with parameters + //private let sessionQueue = SessionQueue.manager + //private let sessionQueue = SessionQueue(name: "datatasks.sessionQueue") + //private let sessionQueue = SessionQueue(name: "datatasks.sessionQueue", maxConcurrentOperationCount: 100) + + public var operationCount: Int { + return self.queue.operationCount + } + + public var operations: [Operation] { + return self.queue.operations + } + + public var qos: QualityOfService { + return .background + } + + public var maxConcurrentOperationCount: Int { + get { + return self.queue.maxConcurrentOperationCount + } + set { + self.queue.maxConcurrentOperationCount = newValue + } + } + + public var isExecuting: Bool { + return !self.queue.isSuspended + } + + public let queue: OperationQueue = OperationQueue() + + public init(name: String, maxConcurrentOperationCount: Int = Int.max) { + self.queue.name = name + self.maxConcurrentOperationCount = maxConcurrentOperationCount + } + + public func addOperation(_ operation: @escaping () -> Void) { + self.queue.addOperation(operation) + } + + public func addOperation(_ operation: Operation) { + self.queue.addOperation(operation) + } + + public func addListOfOperations(_ operations: [Operation], completionHandler: (() -> Void)? = nil) { + for (index, operation) in operations.enumerated() { + if index > 0 { + operation.addDependency(operations[index - 1]) + } + + self.addOperation(operation) + } + + guard let completionHandler = completionHandler else { + return + } + + let completionOperation = BlockOperation(block: completionHandler) + if !operations.isEmpty { + completionOperation.addDependency(operations[operations.count - 1]) + } + self.addOperation(completionOperation) + } + + public func addListOfOperations(_ operations: Operation..., completionHandler: (() -> Void)? = nil) { + self.addListOfOperations(operations, completionHandler: completionHandler) + } + + public func cancelAll() { + self.queue.cancelAllOperations() + } + + public func pause() { + self.queue.isSuspended = true + + for operation in self.queue.operations where operation is SessionOperation { + (operation as? SessionOperation)?.pause() + } + } + + public func resume() { + self.queue.isSuspended = false + + for operation in self.queue.operations where operation is SessionOperation { + (operation as? SessionOperation)?.resume() + } + } + + public func waitUntilAllOperationsAreFinished() { + self.queue.waitUntilAllOperationsAreFinished() + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift new file mode 100644 index 0000000..12e2439 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift @@ -0,0 +1,108 @@ +import Foundation + +struct Post: Codable { + let userId: Int + let id: Int + let title: String +} + +public class URLSessionQueue: NSObject, URLSessionDataDelegate { + + private let queue = DispatchQueue(label: "urlsession.datatasks.queue") + + private var dataTasks: [SessionDataTaskProtocol] = [] + + public var taskCompleted: ((_ task: SessionDataTaskProtocol, _ error: Error?) -> Void)? + + public var allTasksCompletedHandler: ((_ tasks: [SessionDataTaskProtocol]) -> Void)? + + open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> InputStream?)? + + open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, (InputStream?) -> Void) -> Void)? + + lazy var session: URLSession = { + let sessionConfiguration = URLSessionConfiguration.default + sessionConfiguration.timeoutIntervalForRequest = 3 + sessionConfiguration.waitsForConnectivity = true + sessionConfiguration.shouldUseExtendedBackgroundIdleMode = true + return URLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: nil) + }() + + public func addTask(dataTask: SessionDataTaskProtocol) { + dataTasks.append(dataTask) + } + + public func addTask(url: URL, lazy: Bool = true) -> GenericDataTask { + let task = createTask(url: url) + let dataTask: GenericDataTask = GenericDataTask(sessionTask: task) + dataTasks.append(dataTask) + return dataTask + } + + public func addTask(request: URLRequest, lazy: Bool = true) -> GenericDataTask { + let task = createTask(request: request) + let dataTask = GenericDataTask(sessionTask: task) + dataTasks.append(dataTask) + return dataTask + } + + public func createTask(url: URL) -> URLSessionDataTask { + return session.dataTask(with: url) + } + + public func createTask(request: URLRequest) -> URLSessionTask { + return session.dataTask(with: request) + } + + public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + + if let completedTask = queue.sync(execute: { + return dataTasks.first { $0.sessionTask.taskIdentifier == task.taskIdentifier } + }) { + taskCompleted?(completedTask, error) + } + + let completed = queue.sync { + return dataTasks.filter { $0.sessionTask.state == .completed } + } + + let allTasks = queue.sync { + return dataTasks.count + } + + if completed.count == allTasks { + queue.sync { + allTasksCompletedHandler?(dataTasks) + } + } else { + debugPrint("SDK Tasks completed: \(completed.count)/\(dataTasks.count)") + } + } + + public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + queue.sync { + dataTasks = dataTasks.map { task in + + if task.sessionTask.taskIdentifier == dataTask.taskIdentifier { + return task.sessionUpdate(newData: data) + } + return task + } + } + } + + public func execute(taskCompleted: ((_ task: SessionDataTaskProtocol, _ error: Error?) -> Void)? = nil, allTasksCompletedHandler: ((_ tasks: [SessionDataTaskProtocol]) -> Void)? = nil) { + + if let taskCompleted = taskCompleted { + self.taskCompleted = taskCompleted + } + + if let allTaskCompleted = allTasksCompletedHandler { + self.allTasksCompletedHandler = allTaskCompleted + } + + dataTasks.forEach { dataTask in + dataTask.sessionTask.resume() + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift new file mode 100644 index 0000000..89f693e --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift @@ -0,0 +1,104 @@ +import Foundation + +extension String { + + public func escape() -> String? { + return addingPercentEncoding(withAllowedCharacters: .alphanumerics) + } +} + +private let _ioQueue = DispatchQueue(label: "sdk.storiescollectioncellloader.disk.set") + +public struct Disk { + + let directory = Directory() + let storage = HashStorage() + + public init() { + } + + struct Directory { + + init() { + createDirectory() + } + } +} + + +extension Disk.Directory { + + fileprivate func createDirectory() { + let fileManager = FileManager.default + if fileManager.fileExists(atPath: path) { + return + } + + do { + try fileManager.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil) + } catch _ { + } + } + + var path: String { + let cacheDirectory = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0] + let directoryName = "swift.storiescollectioncellloader.disk" + + return cacheDirectory + "/" + directoryName + } +} + + +extension Disk { + + public func cleanUp() { + let manager = FileManager.default + for subpath in manager.subpaths(atPath: directory.path) ?? [] { + let path = directory.path + "/" + subpath + do { + try manager.removeItem(atPath: path) + } catch _ { + } + } + } + + public func get(_ aKey: String) -> Data? { + if let data = storage[aKey] { + return data + } + return (try? Data(contentsOf: URL(fileURLWithPath: _path(aKey)))) + } + + public func get(_ aKey: URL) -> Data? { + guard let key = aKey.absoluteString.escape() else { + return nil + } + + return get(key) + } + + public func _path(_ name: String) -> String { + return directory.path + "/" + name + } + + public func set(_ anObject: Data, forKey aKey: String) { + storage[aKey] = anObject + + let block: () -> Void = { + do { + try anObject.write(to: URL(fileURLWithPath: self._path(aKey)), options: []) + self.storage[aKey] = nil + } catch _ {} + } + + _ioQueue.async(execute: block) + } + + public func set(_ anObject: Data, forKey aKey: URL) { + guard let key = aKey.absoluteString.escape() else { + return + } + + set(anObject, forKey: key) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift new file mode 100644 index 0000000..5a28496 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift @@ -0,0 +1,30 @@ +import Foundation + +class HashStorage { + private var items = [K: V]() + public init() {} + public subscript(key: K) -> V? { + get { + objc_sync_enter(HashStorage.self) + defer { objc_sync_exit(HashStorage.self) } + return items[key] + } + set(value) { + objc_sync_enter(HashStorage.self) + defer { objc_sync_exit(HashStorage.self) } + items[key] = value + } + } + + func getKey(_ value: V) -> K? { + var key: K? + items.forEach { k, v in + if v == value { + key = k + } + } + + return key + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift new file mode 100644 index 0000000..366920a --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift @@ -0,0 +1,78 @@ +import Foundation +import UIKit + +public struct Loader { + + unowned let delegate: StoriesCollectionCellLoader.LoaderManager + let task: URLSessionDataTask + let operative = Operative() + let baseReqUrl: URL + + init(_ task: URLSessionDataTask, reqUrl: URL, delegate: StoriesCollectionCellLoader.LoaderManager) { + self.task = task + self.baseReqUrl = reqUrl + self.delegate = delegate + } + + public var state: URLSessionTask.State { + return task.state + } + + public func resume() { + task.resume() + } + + public func cancel() { + task.cancel() + let reason = "SDK Loader cancel to request: \(baseReqUrl)" + onFailure(with: NSError(domain: "StoriesCollectionCellLoader", code: 0, userInfo: [NSLocalizedFailureReasonErrorKey: reason])) + } + + func complete(with error: Error?) { + if let error = error { + onFailure(with: error) + return + } + + if let image = UIImage.process(data: operative.receiveData) { + onSuccess(with: image) + delegate.disk.set(operative.receiveData, forKey: baseReqUrl) + return + } + + if let statusCode = (task.response as? HTTPURLResponse)?.statusCode, statusCode >= 200, statusCode < 400 { + let reason = "SDK Disconnect on downloading caused by HTTPStatusCode: \(statusCode)" + onFailure(with: NSError(domain: "StoriesCollectionCellLoader", code: statusCode, userInfo: [NSLocalizedFailureReasonErrorKey: reason])) + return + } + + failOnConvertToImage() + } + + private func failOnConvertToImage() { + onFailure(with: NSError(domain: "StoriesCollectionCellLoader", code: -999, userInfo: [NSLocalizedFailureReasonErrorKey: "SDK Failure when convert image"])) + } + + private func onSuccess(with image: UIImage) { + operative.tasks.forEach { task in + task.onCompletion(image, nil, .network) + } + operative.tasks = [] + delegate.remove(self) + } + + private func onFailure(with error: Error) { + operative.tasks.forEach { task in + task.onCompletion(nil, error, .error) + } + operative.tasks = [] + delegate.remove(self) + } +} + + +extension Loader: Equatable {} + +public func == (lhs: Loader, rhs: Loader) -> Bool { + return lhs.task == rhs.task +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift new file mode 100644 index 0000000..3879c80 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift @@ -0,0 +1,41 @@ +import Foundation +import UIKit + +class Task { + weak var owner: AnyObject? + let onCompletion: (UIImage?, Error?, FetchOperation) -> Void + + init(_ owner: AnyObject?, onCompletion: @escaping (UIImage?, Error?, FetchOperation) -> Void) { + self.owner = owner + self.onCompletion = onCompletion + } +} + +class Operative { + var tasks = [Task]() + var receiveData = Data() + + func remove(_ task: Task) { + guard let index = tasks.firstIndex(of: task) else { + return + } + tasks.remove(at: index) + } + + func update(_ task: Task) { + guard let index = tasks.firstIndex(of: task) else { + tasks.append(task) + return + } + tasks[index] = task + } +} + + +extension Task: Equatable {} + func ==(lhs: Task, rhs: Task) -> Bool { + guard let leftTaskOwner = lhs.owner, let rightTaskOwner = rhs.owner else { + return false + } + return leftTaskOwner.isEqual(rightTaskOwner) +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift new file mode 100644 index 0000000..a92425c --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift @@ -0,0 +1,13 @@ +import Foundation + +public enum FetchOperation { + + case disk + case network + case error + +} + +public enum Option { + case adjustSize +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift new file mode 100644 index 0000000..8ace36d --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift @@ -0,0 +1,26 @@ +import Foundation +import UIKit + +public struct SdkImageReloader { + + let base: Base + init(_ base: Base) { + self.base = base + } +} + +public protocol SdkImageReloaderCompatible { + associatedtype CompatibleType + var load: SdkImageReloader { get } +} + + +extension SdkImageReloaderCompatible { + + public var load: SdkImageReloader { + return SdkImageReloader(self) + } +} + + +extension UIImageView: SdkImageReloaderCompatible {} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift new file mode 100644 index 0000000..0cef470 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift @@ -0,0 +1,97 @@ +import Foundation +import UIKit + +public struct StoriesCollectionCellLoader { + + @discardableResult + public static func request(with url: URLLiteralConvertible, onCompletion: @escaping (UIImage?, Error?, FetchOperation) -> Void) -> Loader? { + guard let storiesCollectionCellLoaderUrl = url.storiesCollectionCellLoaderURL else { + return nil + } + + let task = Task(nil, onCompletion: onCompletion) + let loader = StoriesCollectionCellLoader.session.getLoader(with: storiesCollectionCellLoaderUrl, task: task) + loader.resume() + + return loader + } + + static var session: StoriesCollectionCellLoader.Session { + return Session.shared + } + + static var manager: StoriesCollectionCellLoader.LoaderManager { + return Session.manager + } + + class Session: NSObject, URLSessionDataDelegate { + + static let shared = Session() + static let manager = LoaderManager() + + func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + guard let loader = getLoader(with: dataTask) else { + return + } + loader.operative.receiveData.append(data) + } + + func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) { + completionHandler(.allow) + } + + func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + guard let loader = getLoader(with: task) else { + return + } + loader.complete(with: error) + } + + func getLoader(with dataTask: URLSessionTask) -> Loader? { + guard let url = dataTask.originalRequest?.url else { + return nil + } + return StoriesCollectionCellLoader.manager.storage[url] + } + + func getLoader(with url: URL, task: Task) -> Loader { + let loader = StoriesCollectionCellLoader.manager.getLoader(with: url) + loader.operative.update(task) + return loader + } + } + + class LoaderManager { + + let session: URLSession + let storage = HashStorage() + var disk = Disk() + + init(configuration: URLSessionConfiguration = .default) { + self.session = URLSession(configuration: .default, delegate: StoriesCollectionCellLoader.session, delegateQueue: nil) + } + + func getLoader(with url: URL) -> Loader { + if let loader = storage[url] { + return loader + } + + let loader = Loader(session.dataTask(with: url), reqUrl: url, delegate: self) + storage[url] = loader + return loader + } + + func getLoader(with url: URL, task: Task) -> Loader { + let loader = getLoader(with: url) + loader.operative.update(task) + return loader + } + + func remove(_ loader: Loader) { + guard let url = storage.getKey(loader) else { + return + } + storage[url] = nil + } + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift new file mode 100644 index 0000000..a719700 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift @@ -0,0 +1,29 @@ +import Foundation + +public protocol URLLiteralConvertible { + var storiesCollectionCellLoaderURL: URL? { get } +} + + +extension URL: URLLiteralConvertible { + public var storiesCollectionCellLoaderURL: URL? { + return self + } +} + + +extension URLComponents: URLLiteralConvertible { + public var storiesCollectionCellLoaderURL: URL? { + return url + } +} + + +extension String: URLLiteralConvertible { + public var storiesCollectionCellLoaderURL: URL? { + if let string = addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) { + return URL(string: string) + } + return URL(string: self) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift new file mode 100644 index 0000000..934197b --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift @@ -0,0 +1,28 @@ +import Foundation +import UIKit +import ImageIO + +extension CGImageSource { + + internal var imageCount: Int { + return CGImageSourceGetCount(self) + } + + internal func process() -> (images: [UIImage], duration: TimeInterval) { + var images = [UIImage]() + let count = imageCount + let duration: Double = Double(count) * 0.2 + for i in 0 ..< count { + if let cgImage = getCGImage(index: i) { + images.append(UIImage(cgImage: cgImage)) + } + } + + return (images, duration) + } + + internal func getCGImage(index: Int) -> CGImage? { + return CGImageSourceCreateImageAtIndex(self, index, nil) + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift new file mode 100644 index 0000000..9ae21af --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift @@ -0,0 +1,43 @@ +import Foundation + +extension Data { + + enum FileType { + case png + case jpeg + case gif + case tiff + case webp + case Unknown + } + + internal var fileType: FileType { + let fileHeader = getFileHeader(capacity: 2) + switch fileHeader { + case [0x47, 0x49]: + return .gif + case [0xFF, 0xD8]: + return .jpeg + case [0x89, 0x50]: + return .png + default: + return .Unknown + } + } + + internal func getFileHeader(capacity: Int) -> [UInt8] { + + var pointer = UnsafeMutablePointer.allocate(capacity: capacity) + + (self as NSData).getBytes(pointer, length: capacity) + + var header = [UInt8]() + for _ in 0 ..< capacity { + header.append(pointer.pointee) + pointer += 1 + } + + return header + } + +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift new file mode 100644 index 0000000..4807572 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift @@ -0,0 +1,24 @@ +import UIKit + +extension String { + func hexToRGB() -> (red: CGFloat, green: CGFloat, blue: CGFloat) { + var hexFormatted: String = self.trimmingCharacters(in: .whitespacesAndNewlines).uppercased() + + if hexFormatted.hasPrefix("#") { + hexFormatted = String(hexFormatted.dropFirst()) + } + + if hexFormatted.count != 6 { + return (0, 0, 0) + } + + var rgb: UInt64 = 0 + Scanner(string: hexFormatted).scanHexInt64(&rgb) + + let red = CGFloat((rgb & 0xFF0000) >> 16) / 255.0 + let green = CGFloat((rgb & 0x00FF00) >> 8) / 255.0 + let blue = CGFloat(rgb & 0x0000FF) / 255.0 + + return (red, green, blue) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift new file mode 100644 index 0000000..1ef46ff --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift @@ -0,0 +1,84 @@ +import Foundation +import UIKit +import ImageIO + +private let lock = NSRecursiveLock() + +extension UIImage { + + func adjust(_ size: CGSize, scale: CGFloat, contentMode: UIView.ContentMode) -> UIImage { + lock.lock() + defer { lock.unlock() } + + if images?.count ?? 0 > 1 { + return self + } + + switch contentMode { + case .scaleToFill: + if size.width * scale > self.size.width || size.height * scale > self.size.height { + return self + } + + let fitSize = CGSize(width: size.width * scale, height: size.height * scale) + return render(fitSize) + case .scaleAspectFit: + if size.width * scale > self.size.width || size.height * scale > self.size.height { + return self + } + + let downscaleSize = CGSize(width: self.size.width / scale, height: self.size.height / scale) + let ratio = size.width/downscaleSize.width < size.height/downscaleSize.height ? size.width/downscaleSize.width : size.height/downscaleSize.height + + let fitSize = CGSize(width: downscaleSize.width * ratio * scale, height: downscaleSize.height * ratio * scale) + return render(fitSize) + case .scaleAspectFill: + if size.width * scale > self.size.width || size.height * scale > self.size.height { + return self + } + + let downscaleSize = CGSize(width: self.size.width / scale, height: self.size.height / scale) + let ratio = size.width/downscaleSize.width > size.height/downscaleSize.height ? size.width/downscaleSize.width : size.height/downscaleSize.height + + let fitSize = CGSize(width: downscaleSize.width * ratio * scale, height: downscaleSize.height * ratio * scale) + return render(fitSize) + default: + return self + } + } + + func render(_ size: CGSize) -> UIImage { + lock.lock() + defer { lock.unlock() } + + if size.width == 0 || size.height == 0 { + return self + } + + UIGraphicsBeginImageContext(size) + draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) + + return UIGraphicsGetImageFromCurrentImageContext()! + } + + internal static func process(data: Data) -> UIImage? { + switch data.fileType { + case .gif: + guard let source = CGImageSourceCreateWithData(data as CFData, nil) else { + return nil + } + + let result = source.process() + return UIImage.animatedImage(with: result.images, duration: result.duration) + case .png, .jpeg, .tiff, .webp, .Unknown: + return UIImage(data: data) + } + } + + static func decode(_ data: Data) -> UIImage? { + lock.lock() + defer { lock.unlock() } + + return UIImage(data: data) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift new file mode 100644 index 0000000..53901d7 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift @@ -0,0 +1,82 @@ +import UIKit + +private var StoriesCollectionCellLoaderRequestUrlKey = 0 +private let _ioQueue = DispatchQueue(label: "sdk.storiescollectioncellloader.queues", attributes: .concurrent) + +extension UIImageView { + fileprivate var requestUrl: URL? { + get { + var requestUrl: URL? + _ioQueue.sync { + requestUrl = objc_getAssociatedObject(self, &StoriesCollectionCellLoaderRequestUrlKey) as? URL + } + + return requestUrl + } + set(newValue) { + _ioQueue.async { + objc_setAssociatedObject(self, &StoriesCollectionCellLoaderRequestUrlKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + } +} + + +extension SdkImageReloader where Base: UIImageView { + + @discardableResult + public func request(with url: URLLiteralConvertible, options: [Option] = []) -> Loader? { + return request(with: url, placeholder: nil, options: options, onCompletion: { _,_,_ in }) + } + + @discardableResult + public func request(with url: URLLiteralConvertible, options: [Option] = [], onCompletion: @escaping (UIImage?, Error?, FetchOperation) -> Void) -> Loader? { + return request(with: url, placeholder: nil, options: options, onCompletion: onCompletion) + } + + @discardableResult + public func request(with url: URLLiteralConvertible, placeholder: UIImage?, options: [Option] = [], onCompletion: @escaping (UIImage?, Error?, FetchOperation) -> Void) -> Loader? { + guard let storiesCollectionCellLoaderUrl = url.storiesCollectionCellLoaderURL else { + return nil + } + + let imageCompletion: (UIImage?, Error?, FetchOperation) -> Void = { image, error, operation in + guard var image = image else { + return onCompletion(nil, error, operation) + } + + DispatchQueue.main.async { + if options.contains(.adjustSize) { + image = image.adjust(self.base.frame.size, scale: UIScreen.main.scale, contentMode: self.base.contentMode) + } + if let images = image.images, images.count > 0, let gif = UIImage.animatedImage(with: images, duration: 1) { + image = gif + } + self.base.image = image + onCompletion(image, error, operation) + } + } + + let task = Task(base, onCompletion: imageCompletion) + + if let requestUrl = base.requestUrl { + let loader = StoriesCollectionCellLoader.manager.getLoader(with: requestUrl) + loader.operative.remove(task) + if requestUrl != storiesCollectionCellLoaderUrl, loader.operative.tasks.isEmpty { + loader.cancel() + } + } + base.requestUrl = url.storiesCollectionCellLoaderURL + + base.image = placeholder ?? nil + if let data = StoriesCollectionCellLoader.manager.disk.get(storiesCollectionCellLoaderUrl), let image = UIImage.process(data: data) { + task.onCompletion(image, nil, .disk) + return nil + } + + let loader = StoriesCollectionCellLoader.manager.getLoader(with: storiesCollectionCellLoaderUrl, task: task) + loader.resume() + + return loader + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift new file mode 100644 index 0000000..ace629a --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift @@ -0,0 +1,166 @@ +import Foundation +import UIKit + +public struct StoryBlockImageCache { + enum Error: Swift.Error { + case StoryBlockImageCacheSaveError + } + + public static var internalLogger: ((_ message: String, _ file: String, _ function: String, _ line: Int) -> Void)? + + public static var imageURLProvider: StoryImageURLProviding? + + fileprivate static var urlSession: URLSession = createUrlSession() + + fileprivate static func createUrlSession() -> URLSession { + let config = URLSessionConfiguration.default + config.timeoutIntervalForRequest = 3 + config.waitsForConnectivity = true + let session = URLSession(configuration: config) + return session + } + + @discardableResult public static func image(for key: String, file: String = #file, function: String = #function, line: Int = #line, completion: @escaping (UIImage?) -> Void) -> URLSessionDataTask? { + let dispatchCompletionOnMain: (UIImage?) -> Void = { image in + DispatchQueue.main.async { + completion(image) + } + } + + if let image = inMemoryImage(for: key) { + dispatchCompletionOnMain(image) + + } else if let image = fileSystemImage(for: key) { + inMemory(save: image, for: key) + dispatchCompletionOnMain(image) + + } else { + if let imageURLProvider = imageURLProvider, let url = imageURLProvider.url(for: key) { + let dataTask = urlSession.dataTask(with: url, completionHandler: { (data, response, error) in + if let data = data, let image = UIImage(data: data) { + save(image, for: key) + dispatchCompletionOnMain(image) + } else { + if let error = error, (error as NSError).code != -999 { + print("SDK Error downloading image for block") + } + dispatchCompletionOnMain(nil) + } + }) + dataTask.resume() + return dataTask + + } else { + dispatchCompletionOnMain(nil) + } + } + + return nil + } + + public static func save(_ image: UIImage, for key: String, file: String = #file, function: String = #function, line: Int = #line) -> Void { + inMemory(save: image, for: key) + do { + try fileSystem(save: image, for: key) + } catch { + internalLogger?("SDK Internal Error saving image for key \(key): \(error)", file, function, line) + } + } + + public static func cancelAllDownloads() { + urlSession.invalidateAndCancel() + urlSession = createUrlSession() + } + + public static var shared = StoryBlockImageCache() + public let internalCache = NSCache() + + fileprivate static let cacheDirectory: URL? = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first + + fileprivate init() { + NotificationCenter.default.addObserver(forName: UIApplication.didReceiveMemoryWarningNotification, object: self, queue: OperationQueue.current) { (note) in + StoryBlockImageCache.purgeRecursiveNSCache() + } + } + + fileprivate static func purgeRecursiveNSCache(file: String = #file, function: String = #function, line: Int = #line) { + StoryBlockImageCache.shared.internalCache.removeAllObjects() + } + + fileprivate static func inMemoryImage(for key: String) -> UIImage? { + if let image = StoryBlockImageCache.shared.internalCache.object(forKey: key as NSString) as? UIImage { + return image + } else { + return nil + } + } + + fileprivate static func fileSystemImage(for key: String) -> UIImage? { + if let url = fileUrl(forKey: key), + let data = try? Data(contentsOf: url), + let image = UIImage(data: data) { + return image + } + + return nil + } + + fileprivate static func inMemory(save image: UIImage, for key: String) { + StoryBlockImageCache.shared.internalCache.setObject(image, forKey: key as AnyObject) + } + + fileprivate static func fileSystem(save image: UIImage, for key: String, file: String = #file, function: String = #function, line: Int = #line) throws { +// if let jpeg = image.jpegData(compressionQuality: 1.0), let url = fileUrl(forKey: key) { +// do { +// try jpeg.write(to: url, options: [.atomic]) +// } catch { +// internalLogger?("Error saving image to filesystem for \(key) - \(error)", file, function, line) +// throw Error.StoryBlockImageCacheSaveError +// } +// } + + if let pngAlphaQuality = image.pngData() , let url = fileUrl(forKey: key) { + do { + try pngAlphaQuality.write(to: url, options: [.atomic]) + } catch { + throw Error.StoryBlockImageCacheSaveError + } + } + throw Error.StoryBlockImageCacheSaveError + } + + fileprivate static func fileUrl(forKey key: String) -> URL? { + if let cacheDirectory = cacheDirectory { + let safeKey = key.replacingOccurrences(of: "/", with: "-") + return cacheDirectory.appendingPathComponent("\(safeKey).jpg", isDirectory: false) + } + return nil + } +} + +public protocol StoryImageURLProviding { + func url(for key: String) -> URL? +} + +private var imageTaskKey: Void? +public extension UIImageView { + func setStoryImage(for key: String, file: String = #file, function: String = #function, line: Int = #line) { + let task = StoryBlockImageCache.image(for: key, file: file, function: function, line: line) { image in + self.image = image + } + setImageTask(task) + } + + func cancelStoryImageDownload() { + imageDataTask?.cancel() + setImageTask(nil) + } + + fileprivate var imageDataTask: URLSessionDataTask? { + return objc_getAssociatedObject(self, &imageTaskKey) as? URLSessionDataTask + } + + fileprivate func setImageTask(_ task: URLSessionDataTask?) { + objc_setAssociatedObject(self, &imageTaskKey, task, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift new file mode 100644 index 0000000..58fdecc --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift @@ -0,0 +1,19 @@ +import UIKit + +extension CAPropertyAnimation { + enum Key: String { + var path: String { + return rawValue + } + + case flatStart = "strokeStart" + case flatEnd = "strokeEnd" + case flatColor = "strokeColor" + case rotationZ = "transform.rotation.z" + case scale = "transform.scale" + } + + convenience init(key: Key) { + self.init(keyPath: key.path) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift new file mode 100644 index 0000000..7a873b3 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift @@ -0,0 +1,7 @@ +import UIKit + +extension CGRect { + var center: CGPoint { + return CGPoint(x: midX, y: midY) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift new file mode 100644 index 0000000..90546d6 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift @@ -0,0 +1,7 @@ +import UIKit + +extension CGSize { + var min: CGFloat { + return CGFloat.minimum(width, height) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift new file mode 100644 index 0000000..c40f2de --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift @@ -0,0 +1,7 @@ +import UIKit + +extension UIBezierPath { + convenience init(center: CGPoint, radius: CGFloat) { + self.init(arcCenter: center, radius: radius, startAngle: 0, endAngle: CGFloat(.pi * 2.0), clockwise: true) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift new file mode 100644 index 0000000..ae2060e --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift @@ -0,0 +1,146 @@ +import UIKit + +private let SdkActivityIndicatorKey = "Rotation" + +@IBDesignable open class SdkActivityIndicator: UIView { + @IBInspectable open var lineWidth: CGFloat = 3 { + didSet { + self.flatLayer.lineWidth = lineWidth + } + } + + fileprivate(set) open var flatIsInAnimation = false + + @IBInspectable open var automaticallyStart: Bool = false { + didSet { + if automaticallyStart && self.superview != nil { + self.animate(true) + } + } + } + @IBInspectable open var hideIndicatorWhenStopped: Bool = false { + didSet { + self.isHidden = true + } + } + + @IBInspectable open var indicatorColor: UIColor = UIColor.lightGray { + didSet { + self.flatLayer.strokeColor = indicatorColor.cgColor + } + } + + fileprivate var flatLayer = CAShapeLayer() + + override public init(frame: CGRect) { + super.init(frame: frame) + setupFlat() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupFlat() + } + + override open func layoutSubviews() { + super.layoutSubviews() + self.flatLayer.frame = bounds + self.flatLayer.path = self.circlePath().cgPath + } + + override open func willMove(toSuperview newSuperview: UIView?) { + super.willMove(toSuperview: newSuperview) + + if newSuperview != nil { + if self.automaticallyStart { + self.animate(true) + } + } else { + self.animate(false) + } + } + + open func startAnimating() { + self.isHidden = false + self.animate(true) + } + + open func stopAnimating() { + self.isHidden = true + self.animate(false) + } + + fileprivate func animate(_ animated: Bool) { + if animated { + self.isHidden = false + + if self.flatIsInAnimation == false { + if self.flatLayer.animation(forKey: SdkActivityIndicatorKey) == nil { + self.createFlatAnimationLayer(self.flatLayer) + } else { + self.resumeLayer(self.flatLayer) + } + } + + self.flatIsInAnimation = true + + } else { + + self.flatIsInAnimation = false + self.pauseLayer(self.flatLayer) + if self.hideIndicatorWhenStopped { + self.isHidden = true + } + } + } + + fileprivate func pauseLayer(_ layer: CALayer) { + let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil) + layer.speed = 0 + layer.timeOffset = pausedTime + } + + fileprivate func resumeLayer(_ layer: CALayer) { + let pausedTime = layer.timeOffset + layer.speed = 1 + layer.timeOffset = 0 + layer.beginTime = 0 + let timePreloadPaused = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime + layer.beginTime = timePreloadPaused + } + + fileprivate func createFlatAnimationLayer(_ layer: CALayer) { + let flatAniation = CABasicAnimation(keyPath: "transform.rotation.z") + flatAniation.fromValue = NSNumber(value: 0 as Float) + flatAniation.toValue = NSNumber(value: 2 * CGFloat(Double.pi)) + flatAniation.duration = 1.5 + flatAniation.isRemovedOnCompletion = false + flatAniation.repeatCount = Float.infinity + layer.add(flatAniation, forKey: SdkActivityIndicatorKey) + } + + fileprivate func flatCircleFrame() -> CGRect { + let diameter = min(self.flatLayer.bounds.size.width, self.flatLayer.bounds.size.height) + var flatCircleFrame = CGRect(x: 0, y: 0, width: diameter, height: diameter) + flatCircleFrame.origin.x = flatLayer.bounds.midX - flatCircleFrame.midX + flatCircleFrame.origin.y = flatLayer.bounds.midY - flatCircleFrame.midY + + let inset = self.flatLayer.lineWidth / 2 + flatCircleFrame = flatCircleFrame.insetBy(dx: inset, dy: inset) + return flatCircleFrame + } + + fileprivate func circlePath() -> UIBezierPath { + return UIBezierPath(ovalIn: self.flatCircleFrame()) + } + + fileprivate func setupFlat() { + flatLayer.frame = bounds + flatLayer.lineWidth = self.lineWidth + flatLayer.fillColor = UIColor.clear.cgColor + flatLayer.strokeColor = self.indicatorColor.cgColor + flatLayer.strokeEnd = 0.9 + layer.addSublayer(flatLayer) + backgroundColor = UIColor.clear + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift new file mode 100644 index 0000000..674a66b --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift @@ -0,0 +1,147 @@ +import UIKit +import QuartzCore + +@IBDesignable +public final class StoriesSlideReloadIndicator: UIView { + public var animationDuration: Double = 1 + public var rotationDuration: Double = 10 + + @IBInspectable + public var numSegments: Int = 12 { + didSet { + updateSegments() + } + } + @IBInspectable + public var strokeColor : UIColor = .white { + didSet { + indSegmentLayer?.strokeColor = strokeColor.cgColor + } + } + @IBInspectable + public var lineWidth : CGFloat = 8 { + didSet { + indSegmentLayer?.lineWidth = lineWidth + updateSegments() + } + } + + public var hidesSlidesWhenStopped: Bool = true + public private(set) var slideIndicatorIsAnimating = false + private weak var indReplicatorLayer: CAReplicatorLayer! + private weak var indSegmentLayer: CAShapeLayer! + + public override init(frame: CGRect) { + super.init(frame: frame) + setupIndicator() + } + + public required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupIndicator() + } + + private func setupIndicator() { + let indReplicatorLayer = CAReplicatorLayer() + + layer.addSublayer(indReplicatorLayer) + + let ind_dot = CAShapeLayer() + ind_dot.lineCap = CAShapeLayerLineCap.round + ind_dot.strokeColor = strokeColor.cgColor + ind_dot.lineWidth = lineWidth + ind_dot.fillColor = nil + + indReplicatorLayer.addSublayer(ind_dot) + + self.indReplicatorLayer = indReplicatorLayer + self.indSegmentLayer = ind_dot + } + + override public func layoutSubviews() { + super.layoutSubviews() + + let maxSize = max(0,min(bounds.width, bounds.height)) + indReplicatorLayer.bounds = CGRect(x: 0, y: 0, width: maxSize, height: maxSize) + indReplicatorLayer.position = CGPoint(x: bounds.width / 2, y:bounds.height / 2) + + updateSegments() + } + + private func updateSegments() { + guard numSegments > 0, let indSegmentLayer = indSegmentLayer else { + return + } + + let angle = 2*CGFloat.pi / CGFloat(numSegments) + indReplicatorLayer.instanceCount = numSegments + indReplicatorLayer.instanceTransform = CATransform3DMakeRotation(angle, 0.0, 0.0, 1.0) + indReplicatorLayer.instanceDelay = 1.5*animationDuration/Double(numSegments) + + let maxRadius = max(0,min(indReplicatorLayer.bounds.width, indReplicatorLayer.bounds.height))/2 + let radius: CGFloat = maxRadius - lineWidth / 2 + + indSegmentLayer.bounds = CGRect(x:0, y:0, width: 2*maxRadius, height: 2*maxRadius) + indSegmentLayer.position = CGPoint(x: indReplicatorLayer.bounds.width / 2, y: indReplicatorLayer.bounds.height/2) + + let path = UIBezierPath(arcCenter: CGPoint(x: maxRadius, y: maxRadius), radius: radius, startAngle: -angle/2 - CGFloat.pi/2, endAngle: angle/2 - CGFloat.pi/2, clockwise: true) + + indSegmentLayer.path = path.cgPath + } + + public func startAnimating() { + self.isHidden = false + slideIndicatorIsAnimating = true + + let rotate = CABasicAnimation(keyPath: "transform.rotation") + rotate.byValue = CGFloat.pi*2 + rotate.duration = rotationDuration + rotate.repeatCount = Float.infinity + + let shrinkStart = CABasicAnimation(keyPath: "strokeStart") + shrinkStart.fromValue = 0.0 + shrinkStart.toValue = 0.5 + shrinkStart.duration = animationDuration + shrinkStart.autoreverses = true + shrinkStart.repeatCount = Float.infinity + shrinkStart.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut) + + let shrinkEnd = CABasicAnimation(keyPath: "strokeEnd") + shrinkEnd.fromValue = 1.0 + shrinkEnd.toValue = 0.5 + shrinkEnd.duration = animationDuration + shrinkEnd.autoreverses = true + shrinkEnd.repeatCount = Float.infinity + shrinkEnd.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut) + + let fade = CABasicAnimation(keyPath: "lineWidth") + fade.fromValue = lineWidth + fade.toValue = 0.0 + fade.duration = animationDuration + fade.autoreverses = true + fade.repeatCount = Float.infinity + fade.timingFunction = CAMediaTimingFunction(controlPoints: 0.55, 0.0, 0.45, 1.0) + + indReplicatorLayer.add(rotate, forKey: "rotate") + indSegmentLayer.add(shrinkStart, forKey: "start") + indSegmentLayer.add(shrinkEnd, forKey: "end") + indSegmentLayer.add(fade, forKey: "fade") + } + + public func stopAnimating() { + slideIndicatorIsAnimating = false + + indReplicatorLayer.removeAnimation(forKey: "rotate") + indSegmentLayer.removeAnimation(forKey: "start") + indSegmentLayer.removeAnimation(forKey: "end") + indSegmentLayer.removeAnimation(forKey: "fade") + + if hidesSlidesWhenStopped { + self.isHidden = true + } + } + + public override var intrinsicContentSize: CGSize { + return CGSize(width: SdkConfiguration.stories.storiesSlideReloadIndicatorSize, height: SdkConfiguration.stories.storiesSlideReloadIndicatorSize) + } +} diff --git a/Pods/REES46/REES46/Classes/Extensions/UserDefaultsExtension.swift b/Pods/REES46/REES46/Classes/Extensions/UserDefaultsExtension.swift new file mode 100644 index 0000000..2f27015 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Extensions/UserDefaultsExtension.swift @@ -0,0 +1,63 @@ +import Foundation + +struct User:Codable { + let slideId:String + let slideUrl:String +} + +@propertyWrapper + + struct UserDefault { + let key: String + let defaultValue: T + + init(_ key: String, defaultValue: T) { + self.key = key + self.defaultValue = defaultValue + } + + var wrappedValue: T { + get { + + if let data = UserDefaults.standard.object(forKey: key) as? Data, + let user = try? JSONDecoder().decode(T.self, from: data) { + return user + + } + + return defaultValue + } + set { + if let encoded = try? JSONEncoder().encode(newValue) { + UserDefaults.standard.set(encoded, forKey: key) + } + } + } + } + +enum GlobalSettings { + @UserDefault("user", defaultValue: User(slideId:"", slideUrl:"")) static var user: User +} + + +extension UserDefaults { + + public struct Key { + fileprivate let name: String + public init(_ name: String) { + self.name = name + } + } + + public func getValue(for key: Key) -> Any? { + return object(forKey: key.name) + } + + public func setValue(_ value: Any?, for key: Key) { + set(value, forKey: key.name) + } + + public func removeValue(for key: Key) { + removeObject(forKey: key.name) + } +} diff --git a/Pods/REES46/REES46/Classes/Model/CartItem.swift b/Pods/REES46/REES46/Classes/Model/CartItem.swift new file mode 100644 index 0000000..cbf79ce --- /dev/null +++ b/Pods/REES46/REES46/Classes/Model/CartItem.swift @@ -0,0 +1,16 @@ +import Foundation + +public struct CartItem { + var productId: String + var quantity: Int = 1 + + public init(productId: String, quantity: Int = 1) { + self.productId = productId + self.quantity = quantity + } + + public init(json: [String: Any]) { + self.productId = json["uniqid"] as? String ?? "" + self.quantity = json["quantity"] as? Int ?? 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Model/InitResponse.swift b/Pods/REES46/REES46/Classes/Model/InitResponse.swift new file mode 100644 index 0000000..9794c7c --- /dev/null +++ b/Pods/REES46/REES46/Classes/Model/InitResponse.swift @@ -0,0 +1,57 @@ +public struct InitResponse: Codable { + var deviceId: String = "" + var seance: String = "" + var currency: String = "" + var search: Search = Search() + + init(json: [String: Any]) { + deviceId = json["did"] as? String ?? "" + seance = json["seance"] as? String ?? "" + currency = json["currency"] as? String ?? "" + if let search = json["search"] as? [String: Any] { + self.search = Search(json: search) + } + } + + init() { + } +} + +struct Search: Codable { + var enable: Int = 0 + var landing: String = "" + var settings: Settings = Settings() + + init(json: [String: Any]) { + enable = json["enabled"] as? Int ?? 0 + landing = json["landing"] as? String ?? "" + let settings = json["settings"] as? [String: Any] ?? [:] + self.settings = Settings(json: settings) + } + + init() { + } +} + +struct Settings: Codable { + var categoriesTitle: String = "" + var itemsTitle: String = "" + var lastProductTitle: String = "" + var lastQueriesTitle: String = "" + var redirects: [String: String] = [:] + var suggestionTitles: String = "" + var showAllTitle: String = "" + + init(json: [String: Any]) { + categoriesTitle = json["categories_title"] as? String ?? "" + itemsTitle = json["items_title"] as? String ?? "" + lastProductTitle = json["last_products_title"] as? String ?? "" + lastQueriesTitle = json["last_queries_title"] as? String ?? "" + redirects = json["redirects"] as? [String: String] ?? [:] + suggestionTitles = json["suggestions_title"] as? String ?? "" + showAllTitle = json["show_all_title"] as? String ?? "" + } + + init() { + } +} diff --git a/Pods/REES46/REES46/Classes/Model/ProductsResponse.swift b/Pods/REES46/REES46/Classes/Model/ProductsResponse.swift new file mode 100644 index 0000000..107e074 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Model/ProductsResponse.swift @@ -0,0 +1,114 @@ +import Foundation + +public struct ProductsListResponse { + public var brands: [String]? + public var filters: [String: Filter]? + public var priceRange: PriceRange? + public var products: [Product] + public var productsTotal: Int + + init(json: [String: Any]) { + if let brandsJSON = json["brands"] as? [[String: Any]] { + var brandsResult = [String]() + for item in brandsJSON { + if let name = item["name"] as? String { + brandsResult.append(name) + } + } + self.brands = brandsResult + } + + if let filtersJSON = json["filters"] as? [String: Any] { + var filtersResult = [String: Filter]() + for item in filtersJSON { + if let dict = item.value as? [String: Any] { + filtersResult[item.key] = Filter(json: dict) + } + } + self.filters = filtersResult + } + + if let priceRangeJSON = json["price_range"] as? [String: Any] { + self.priceRange = PriceRange(json: priceRangeJSON) + } + + let prods = json["products"] as? [[String: Any]] ?? [] + var prodsTemp = [Product]() + for item in prods { + prodsTemp.append(Product(json: item)) + } + products = prodsTemp + + productsTotal = (json["products_total"] as? Int) ?? 0 + } +} + +public struct ProductInfo { + public var id: String = "" + public var name: String = "" + public var brand: String = "" + public var model: String = "" + public var description: String = "" + public var imageUrl: String = "" + public var resizedImageUrl: String = "" + public var resizedImages: [String: String] = [:] + public var url: String + public var deeplinkIos: String + + public var categories: [Category] + + public var price: Double + public var priceFormatted: String + public var priceFull: Double + public var priceFullFormatted: String + public var oldPrice: Double + public var oldPriceFormatted: String + public var oldPriceFull: Double + public var oldPriceFullFormatted: String + + public var currency: String + public var salesRate: Int = 0 + public var discount: Int = 0 + public var relativeSalesRate: Float = 0.0 + public var barcode: String = "" + public var isNew: Bool? + public var params: [[String: Any]]? + + init(json: [String: Any]) { + + id = json["uniqid"] as? String ?? "" + name = json["name"] as? String ?? "" + brand = json["brand"] as? String ?? "" + model = json["model"] as? String ?? "" + description = json["description"] as? String ?? "" + imageUrl = json["image_url"] as? String ?? "" + resizedImageUrl = json["picture"] as? String ?? "" + resizedImages = json["image_url_resized"] as? [String: String] ?? [:] + url = json["url"] as? String ?? "" + deeplinkIos = json["deeplink_ios"] as? String ?? "" + + let categoriesJson = json["categories"] as? [[String: Any]] ?? [] + var categoriesAll = [Category]() + for item in categoriesJson { + categoriesAll.append(Category(json: item)) + } + categories = categoriesAll + + price = json["price"] as? Double ?? 0 + priceFormatted = json["price_formatted"] as? String ?? "" + priceFull = json["price_full"] as? Double ?? 0 + priceFullFormatted = json["price_full_formatted"] as? String ?? "" + oldPrice = json["oldprice"] as? Double ?? 0 + oldPriceFormatted = json["oldprice_formatted"] as? String ?? "" + oldPriceFull = json["oldprice_full"] as? Double ?? 0 + oldPriceFullFormatted = json["oldprice_full_formatted"] as? String ?? "" + currency = json["currency"] as? String ?? "" + barcode = json["barcode"] as? String ?? "" + isNew = json["is_new"] as? Bool + params = json["params"] as? [[String: Any]] + + discount = json["discount"] as? Int ?? 0 + salesRate = json["sales_rate"] as? Int ?? 0 + relativeSalesRate = json["relative_sales_rate"] as? Float ?? 0.0 + } +} diff --git a/Pods/REES46/REES46/Classes/Model/RecommendResponse.swift b/Pods/REES46/REES46/Classes/Model/RecommendResponse.swift new file mode 100644 index 0000000..741572b --- /dev/null +++ b/Pods/REES46/REES46/Classes/Model/RecommendResponse.swift @@ -0,0 +1,199 @@ +import Foundation + +struct Constants { + struct JSONKeys { + static let recommends = "recommends" + static let title = "title" + static let locations = "locations" + static let id = "id" + static let barcode = "barcode" + static let name = "name" + static let brand = "brand" + static let model = "model" + static let description = "description" + static let imageUrl = "image_url" + static let picture = "picture" + static let url = "url" + static let deeplinkIos = "deeplink_ios" + static let price = "price" + static let priceFormatted = "price_formatted" + static let priceFull = "price_full" + static let priceFullFormatted = "price_full_formatted" + static let oldPrice = "oldprice" + static let oldPriceFormatted = "oldprice_formatted" + static let oldPriceFull = "oldprice_full" + static let oldPriceFullFormatted = "oldprice_full_formatted" + static let currency = "currency" + static let salesRate = "sales_rate" + static let relativeSalesRate = "relative_sales_rate" + static let discount = "discount" + static let rating = "rating" + static let image_url_resized = "image_url_resized" + static let categories = "categories" + static let withLocations = "with_locations" + static let extended = "extended" + static let fashionOriginalSizes = "fashion_original_sizes" + static let fashionSizes = "fashion_sizes" + static let fashionColors = "fashion_colors" + static let params = "params" + } + + struct RecommendedBy { + static let recommendedBy = "recommended_by" + static let recommendedCode = "recommended_code" + static let webPushDigestCode = "web_push_digest_code" + } +} + +public struct RecommenderResponse { + public var recommended: [Recommended] + public var title: String = "" + public var locations: [Location]? + + init(json: [String: Any]) { + let recs = json[Constants.JSONKeys.recommends] as? [[String: Any]] ?? [] + var recsTemp = [Recommended]() + for item in recs { + recsTemp.append(Recommended(json: item)) + } + recommended = recsTemp + title = (json[Constants.JSONKeys.title] as? String) ?? "" + + if let locationsArray = json[Constants.JSONKeys.locations] as? [[String: Any]] { + var locationsTemp = [Location]() + for locationItem in locationsArray { + locationsTemp.append(Location(json: locationItem)) + } + locations = locationsTemp + } + } +} + +public struct Recommended { + public var id: String = "" + public var barcode: String = "" + public var name: String = "" + public var brand: String = "" + public var model: String = "" + public var description: String = "" + public var imageUrl: String = "" + public var resizedImageUrl: String = "" + public var url: String = "" + public var deeplinkIos: String = "" + public var categories = [Category]() + public var locations = [Location]() + + public var price: Double = 0 + public var priceFormatted: String? + public var priceFull: Double = 0 + public var priceFullFormatted: String? + public var oldPrice: Double = 0 + public var oldPriceFormatted: String? + public var oldPriceFull: Double = 0 + public var oldPriceFullFormatted: String? + + public var currency: String = "" + public var salesRate: Int = 0 + public var discount: Int = 0 + public var rating: Int = 0 + public var relativeSalesRate: Float = 0.0 + public var paramsRaw: [[String: Any]]? + public var fashionOriginalSizes: [String] = [] + public var fashionSizes: [String] = [] + public var fashionColors: [String] = [] + public var resizedImages: [String: String] = [:] + + init(json: [String: Any]) { + id = json[Constants.JSONKeys.id] as? String ?? "" + barcode = json[Constants.JSONKeys.barcode] as? String ?? "" + name = json[Constants.JSONKeys.name] as? String ?? "" + brand = json[Constants.JSONKeys.brand] as? String ?? "" + model = json[Constants.JSONKeys.model] as? String ?? "" + description = json[Constants.JSONKeys.description] as? String ?? "" + imageUrl = json[Constants.JSONKeys.imageUrl] as? String ?? "" + resizedImageUrl = json[Constants.JSONKeys.picture] as? String ?? "" + url = json[Constants.JSONKeys.url] as? String ?? "" + deeplinkIos = json[Constants.JSONKeys.deeplinkIos] as? String ?? "" + price = json[Constants.JSONKeys.price] as? Double ?? 0 + priceFormatted = json[Constants.JSONKeys.priceFormatted] as? String + priceFull = json[Constants.JSONKeys.priceFull] as? Double ?? 0 + priceFullFormatted = json[Constants.JSONKeys.priceFullFormatted] as? String + oldPrice = json[Constants.JSONKeys.oldPrice] as? Double ?? 0 + oldPriceFormatted = json[Constants.JSONKeys.oldPriceFormatted] as? String + oldPriceFull = json[Constants.JSONKeys.oldPriceFull] as? Double ?? 0 + oldPriceFullFormatted = json[Constants.JSONKeys.oldPriceFullFormatted] as? String + currency = json[Constants.JSONKeys.currency] as? String ?? "" + salesRate = json[Constants.JSONKeys.salesRate] as? Int ?? 0 + relativeSalesRate = json[Constants.JSONKeys.relativeSalesRate] as? Float ?? 0.0 + discount = json[Constants.JSONKeys.discount] as? Int ?? 0 + rating = json[Constants.JSONKeys.rating] as? Int ?? 0 + resizedImages = json[Constants.JSONKeys.image_url_resized] as? [String: String] ?? [:] + + let categoriesArray = json[Constants.JSONKeys.categories] as? [[String: Any]] ?? [] + var categoriesTemp = [Category]() + for item in categoriesArray { + categoriesTemp.append(Category(json: item)) + } + categories = categoriesTemp + + if let withLocations = json[Constants.JSONKeys.withLocations] as? Bool, withLocations, + let extended = json[Constants.JSONKeys.extended] as? Bool, extended, + let locationsArray = json[Constants.JSONKeys.locations] as? [[String: Any]] { + self.locations = locationsArray.map { Location(json: $0) } + } + + if let locationsArray = json[Constants.JSONKeys.locations] as? [[String: Any]] { + var locationsTemp = [Location]() + for item in locationsArray { + locationsTemp.append(Location(json: item)) + } + locations = locationsTemp + } + + fashionOriginalSizes = json[Constants.JSONKeys.fashionOriginalSizes] as? [String] ?? [] + fashionSizes = json[Constants.JSONKeys.fashionSizes] as? [String] ?? [] + fashionColors = json[Constants.JSONKeys.fashionColors] as? [String] ?? [] + + // TODO: convert to objects + paramsRaw = json[Constants.JSONKeys.params] as? [[String: Any]] + + } +} + +public enum RecommendedByCase: String { + case dynamic = "dynamic" + case chain = "chain" + case transactional = "transactional" + case fullSearch = "full_search" + case instantSearch = "instant_search" + case bulk = "bulk" + case webPushDigest = "web_push_digest" + + func getCodeField() -> String { + switch self { + case .webPushDigest: + return Constants.RecommendedBy.webPushDigestCode + default: + return Constants.RecommendedBy.recommendedCode + } + } +} + +public class RecomendedBy { + + var code: String = "" + var type: RecommendedByCase = .chain + + public init(type: RecommendedByCase, code: String) { + self.type = type + self.code = code + } + + func getParams() -> [String: String] { + let params = [ + Constants.RecommendedBy.recommendedBy: type.rawValue, + type.getCodeField(): code + ] + return params + } +} diff --git a/Pods/REES46/REES46/Classes/Model/SearchResponse.swift b/Pods/REES46/REES46/Classes/Model/SearchResponse.swift new file mode 100644 index 0000000..5b8c9f2 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Model/SearchResponse.swift @@ -0,0 +1,287 @@ +import Foundation + +public struct Filter { + public var count: Int + public var values: [String: Int] + + init(json: [String: Any]) { + self.count = json["count"] as? Int ?? 0 + self.values = json["values"] as? [String: Int] ?? [:] + } +} + +public struct IndustrialFilters { + public var fashionSizes: [FashionSizes] + public var fashionColors: [FashionColors] + + init(json: [String: Any]) { + let sizes = json["fashion_sizes"] as? [[String: Any]] ?? [] + var fashionSizesTemp = [FashionSizes]() + for item in sizes { + fashionSizesTemp.append(FashionSizes(json: item)) + } + fashionSizes = fashionSizesTemp + + let colors = json["colors"] as? [[String: Any]] ?? [] + var fashionColorsTemp = [FashionColors]() + for item in colors { + fashionColorsTemp.append(FashionColors(json: item)) + } + fashionColors = fashionColorsTemp + } +} + +public struct FashionSizes { + public var count: Int + public var size: String + + init(json: [String: Any]) { + self.count = json["count"] as? Int ?? 0 + self.size = json["size"] as? String ?? "" + } +} + +public struct FashionColors { + public var count: Int + public var color: String + + init(json: [String: Any]) { + self.count = json["count"] as? Int ?? 0 + self.color = json["color"] as? String ?? "" + } +} + +public struct PriceRange { + public var min: Double + public var max: Double + + init(json: [String: Any]) { + self.min = json["min"] as? Double ?? 0 + self.max = json["max"] as? Double ?? 0 + } +} + +public struct Suggest { + public var name: String + public var url: String + public var deeplinkIos: String + + init(json: [String: Any]) { + self.name = json["name"] as? String ?? "" + self.url = json["url"] as? String ?? "" + self.deeplinkIos = json["deeplink_ios"] as? String ?? "" + } +} + +public struct SearchBlankResponse { + public var lastQueries: [Query] + public var suggests: [Suggest] + public var lastProducts: Bool + public var products: [Product] + + init(json: [String: Any]) { + let lastQueriesTemp = json["last_queries"] as? [[String: Any]] ?? [] + var quyArr = [Query]() + for item in lastQueriesTemp { + quyArr.append(Query(json: item)) + } + lastQueries = quyArr + + let suggestsTemp = json["suggests"] as? [[String: Any]] ?? [] + var sugArr = [Suggest]() + for item in suggestsTemp { + sugArr.append(Suggest(json: item)) + } + suggests = sugArr + + lastProducts = json["last_products"] as? Bool ?? true + + let productsTemp = json["products"] as? [[String: Any]] ?? [] + var productArr = [Product]() + for item in productsTemp { + productArr.append(Product(json: item)) + } + products = productArr + } +} + +public struct Redirect { + public var query: String = "" + public var redirectUrl: String = "" + public var deeplink: String? + public var deeplinkIos: String? + + init(json: [String: Any]) { + self.query = json["query"] as? String ?? "" + self.redirectUrl = json["redirect_link"] as? String ?? "" + self.deeplink = json["deep_link"] as? String + self.deeplinkIos = json["deeplink_ios"] as? String + } +} + +public struct SearchResponse { + public var categories: [Category] + public var products: [Product] + public var productsTotal: Int + public var queries: [Query] + public var filters: [String: Filter]? + public var industrialFilters: IndustrialFilters? + public var brands: [String]? + public var priceRange: PriceRange? + public var redirect: Redirect? + + init(json: [String: Any]) { + let cats = json["categories"] as? [[String: Any]] ?? [] + var catsTemp = [Category]() + for item in cats { + catsTemp.append(Category(json: item)) + } + categories = catsTemp + + let prods = json["products"] as? [[String: Any]] ?? [] + var prodsTemp = [Product]() + for item in prods { + prodsTemp.append(Product(json: item)) + } + products = prodsTemp + + let quers = json["queries"] as? [[String: Any]] ?? [] + var quersTemp = [Query]() + for item in quers { + quersTemp.append(Query(json: item)) + } + queries = quersTemp + + productsTotal = (json["products_total"] as? Int) ?? 0 + + if let filtersJSON = json["filters"] as? [String: Any] { + var filtersResult = [String: Filter]() + for item in filtersJSON { + if let dict = item.value as? [String: Any] { + filtersResult[item.key] = Filter(json: dict) + } + } + self.filters = filtersResult + } + + if let brandsJSON = json["brands"] as? [[String: Any]] { + var brandsResult = [String]() + for item in brandsJSON { + if let name = item["name"] as? String { + brandsResult.append(name) + } + } + self.brands = brandsResult + } + + if let industrialFiltersJSON = json["industrial_filters"] as? [String: Any] { + self.industrialFilters = IndustrialFilters(json: industrialFiltersJSON) + } + + if let priceRangeJSON = json["price_range"] as? [String: Any] { + self.priceRange = PriceRange(json: priceRangeJSON) + } + + if let redirectJSON = json["search_query_redirects"] as? [String: Any] { + self.redirect = Redirect(json: redirectJSON) + } + } +} + +public struct Product { + public var id: String = "" + public var barcode: String = "" + public var name: String = "" + public var brand: String = "" + public var model: String = "" + public var description: String = "" + public var imageUrl: String = "" + public var resizedImageUrl: String = "" + public var resizedImages: [String: String] = [:] + public var url: String + public var deeplinkIos: String + + public var price: Double + public var priceFormatted: String + public var priceFull: Double + public var priceFullFormatted: String + public var oldPrice: Double + public var oldPriceFormatted: String + public var oldPriceFull: Double + public var oldPriceFullFormatted: String + + public var currency: String + public var salesRate: Int = 0 + public var discount: Int = 0 + public var relativeSalesRate: Float = 0.0 + public var isNew: Bool? + public var params: [[String: Any]]? + + init(json: [String: Any]) { + id = json["id"] as? String ?? "" + barcode = json["barcode"] as? String ?? "" + name = json["name"] as? String ?? "" + brand = json["brand"] as? String ?? "" + model = json["model"] as? String ?? "" + description = json["description"] as? String ?? "" + imageUrl = json["image_url"] as? String ?? "" + resizedImageUrl = json["picture"] as? String ?? "" + resizedImages = json["image_url_resized"] as? [String: String] ?? [:] + url = json["url"] as? String ?? "" + deeplinkIos = json["deeplink_ios"] as? String ?? "" + + price = json["price"] as? Double ?? 0 + priceFormatted = json["price_formatted"] as? String ?? "" + priceFull = json["price_full"] as? Double ?? 0 + priceFullFormatted = json["price_full_formatted"] as? String ?? "" + oldPrice = json["oldprice"] as? Double ?? 0 + oldPriceFormatted = json["oldprice_formatted"] as? String ?? "" + oldPriceFull = json["oldprice_full"] as? Double ?? 0 + oldPriceFullFormatted = json["oldprice_full_formatted"] as? String ?? "" + currency = json["currency"] as? String ?? "" + isNew = json["is_new"] as? Bool + params = json["params"] as? [[String: Any]] + + discount = json["discount"] as? Int ?? 0 + salesRate = json["sales_rate"] as? Int ?? 0 + relativeSalesRate = json["relative_sales_rate"] as? Float ?? 0.0 + } +} + +public struct Query { + public var name: String + public var url: String + public var deeplinkIos: String + + init(json: [String: Any]) { + name = json["name"] as? String ?? "" + url = json["url"] as? String ?? "" + deeplinkIos = json["deeplink_ios"] as? String ?? "" + } +} + +public struct Category { + public var id: String = "" + public var name: String = "" + public var url: String? + public var alias: String? + public var parentId: String? + + init(json: [String: Any]) { + id = json["id"] as? String ?? "" + name = json["name"] as? String ?? "" + url = json["url"] as? String + alias = json["alias"] as? String + parentId = json["parent"] as? String + } +} + +public struct Location { + public var id: String = "" + public var name: String = "" + + init(json: [String: Any]) { + id = json["id"] as? String ?? "" + name = json["name"] as? String ?? "" + } +} diff --git a/Pods/REES46/REES46/Classes/Model/Stories.swift b/Pods/REES46/REES46/Classes/Model/Stories.swift new file mode 100644 index 0000000..8101e2d --- /dev/null +++ b/Pods/REES46/REES46/Classes/Model/Stories.swift @@ -0,0 +1,447 @@ +import Foundation +import UIKit +import AVFoundation + +public class StoryContent { + var id: String + let ids: Int + let settings: StoriesSettings + let stories: [Story] + + public init(json: [String: Any]) { + self.id = json["id"] as? String ?? "-1" + self.ids = json["id"] as? Int ?? -1 + let _settings = json["settings"] as? [String: Any] ?? [:] + self.settings = StoriesSettings(json: _settings) + let _stories = json["stories"] as? [[String: Any]] ?? [] + self.stories = _stories.map({Story(json: $0)}) + + if let ids = json["id"] as? Int { + self.id = String(ids) + } + } +} + + +// MARK: - Settings +public class StoriesSettings { + let color: String + let fontSize: Int + let avatarSize: Int + let closeColor: String + let borderViewed, backgroundPin, borderNotViewed: String + let backgroundProgress: String + let pinSymbol: String + + public init(json: [String: Any]) { + self.color = json["color"] as? String ?? "" + self.fontSize = json["font_size"] as? Int ?? 12 + self.avatarSize = json["avatar_size"] as? Int ?? 20 + self.closeColor = json["close_color"] as? String ?? "" + self.borderViewed = json["border_viewed"] as? String ?? "" + self.backgroundPin = json["background_pin"] as? String ?? "" + self.borderNotViewed = json["border_not_viewed"] as? String ?? "" + self.backgroundProgress = json["background_progress"] as? String ?? "" + self.pinSymbol = json["pin_symbol"] as? String ?? "" + } +} + + +// MARK: - Story +class Story { + var id: String + let ids: Int + let avatar: String + let viewed: Bool + let startPosition: Int + let name: String + let pinned: Bool + let slides: [Slide] + + public init(json: [String: Any]) { + self.id = json["id"] as? String ?? "-1" + self.ids = json["id"] as? Int ?? -1 + self.avatar = json["avatar"] as? String ?? "" + self.viewed = json["viewed"] as? Bool ?? false + self.startPosition = json["start_position"] as? Int ?? 0 + self.name = json["name"] as? String ?? "" + self.pinned = json["pinned"] as? Bool ?? false + let _slides = json["slides"] as? [[String: Any]] ?? [] + self.slides = _slides.map({Slide(json: $0)}) + + if let ids = json["id"] as? Int { + self.id = String(ids) + } + } +} + + +// MARK: - Slide +class Slide { + var id: String + var duration: Int + let background: String + let backgroundColor: String + let preview: String? + let ids: Int + let type: SlideType + let elements: [StoriesElement] + var videoURL: URL? = nil + var downloadedImage: UIImage? = nil + var previewImage: UIImage? = nil + + public let vDownloadManager = VideoDownloadManager.shared + var sdkDirectoryName: String = "SDKCacheDirectory" + + public init(json: [String: Any]) { + self.id = json["id"] as? String ?? "-1" + self.ids = json["id"] as? Int ?? -1 + self.duration = json["duration"] as? Int ?? 10 + self.background = json["background"] as? String ?? "" + self.backgroundColor = json["background_color"] as? String ?? "" + self.preview = json["preview"] as? String + let _type = json["type"] as? String ?? "" + self.type = SlideType(rawValue: _type) ?? .unknown + let _elements = json["elements"] as? [[String: Any]] ?? [] + self.elements = _elements.map({StoriesElement(json: $0)}) + + if let ids = json["id"] as? Int { + self.id = String(ids) + } + + if type == .video { + if preview != nil { + setImage(imageURL: preview!, isPreview: true) + } else { + print("SDK Success video preview for \(self.id) is downloaded") + } + + downloadVideo { result in + switch result { + case .success(let url): + self.videoURL = url + self.completionCached(slideWithId: self.id, actualSlideUrl: "") + case .failure(let error): + print("SDK Video for \(self.id) is not downloaded with error \(error.localizedDescription)") + } + } + + } else if type == .image { + setImage(imageURL: self.background, isPreview: false) + } else { + self.completionCached(slideWithId: self.id, actualSlideUrl: "") + } + } + + func downloadVideo(completion: @escaping (Result) -> Void) { + + guard let url = URL(string: self.background) else { + completion(.failure(NSError(domain: "SDK Invalid URL", code: -1, userInfo: nil))) + return + } + + let temporaryDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory()) + let temporaryFileURL = temporaryDirectoryURL.appendingPathComponent("\(self.id).mp4") + + let fileManager = FileManager.default + if fileManager.fileExists(atPath: temporaryFileURL.path) { + completion(.success(temporaryFileURL)) + //print("SDK Load cached video for story id = \(self.id)") + return + } + + let request = URLRequest(url: url) + _ = self.vDownloadManager.downloadStoryMediaFile(withRequest: request, + inDirectory: sdkDirectoryName, + shouldDownloadInBackground: true, + //shouldDownloadInBackground: false, + onProgress: {(progress) in + }) {(error, url) in + if let error = error { + print("Error is \(error as NSError)") + } else { + if let url = url { + do { + try fileManager.moveItem(at: url, to: temporaryFileURL) + + let duration = AVURLAsset(url: temporaryFileURL).duration.seconds + let vTime = String(format:"%d", Int(duration.truncatingRemainder(dividingBy: 60))) + //print(vTime) + + DispatchQueue.main.async { + SdkGlobalHelper.sharedInstance.saveVideoParamsToDictionary(parentSlideId: self.id, paramsDictionary: [self.id : vTime]) + } + + //print("SDK Downloaded video for story id = \(self.id)") + completion(.success(temporaryFileURL)) + } catch { + completion(.failure(error)) + } + } + } + } + } + + func getVideoData(from fileURL: URL) -> Data? { + do { + let videoData = try Data(contentsOf: fileURL) + return videoData + } catch { + print("SDK Error reading video data: \(error)") + return nil + } + } + + private func setImage(imageURL: String, isPreview: Bool) { + guard let url = URL(string: imageURL) else { + return + } + + StoryBlockImageCache.image(for: url.absoluteString) { cachedImage in + if isPreview { + self.previewImage = cachedImage + //print("Downloaded preview for image for video story with id = \(self.id)") + } else { + self.downloadedImage = cachedImage + } + + if cachedImage != nil { + self.completionCached(slideWithId: self.id, actualSlideUrl: "") + //print("SDK Load cached image for story id = \(String(describing: self.id))") + } else { + let task = URLSession.shared.dataTask(with: url, completionHandler: { data, _, error in + if error == nil { + guard let unwrappedData = data, let image = UIImage(data: unwrappedData) else { + return + } + if isPreview { + self.previewImage = image + } else { + self.downloadedImage = image + + StoryBlockImageCache.save(image, for: url.absoluteString) + self.completionCached(slideWithId: self.id, actualSlideUrl: "") + //print("SDK Downloaded image for story id = \(self.id)") + } + } + }) + task.resume() + } + } + } + + private func completionCached(slideWithId: String, actualSlideUrl: String) { + let storySlideMediaId = "cached.slide." + slideWithId + + var slidesDownloadedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(storySlideMediaId)) as? [String] ?? [] + let slideWithIdExists = slidesDownloadedArray.contains(where: { + $0.range(of: storySlideMediaId) != nil + }) + + if !slideWithIdExists { + slidesDownloadedArray.append(storySlideMediaId) + UserDefaults.standard.setValue(slidesDownloadedArray, for: UserDefaults.Key(storySlideMediaId)) + } + + let userInfo = ["url": actualSlideUrl] as [String: Any] + NotificationCenter.default.post(name:Notification.Name(storySlideMediaId), object: userInfo) + } +} + + +// MARK: - Slide +public class StoriesElement { + public var link: String? + public var deeplinkIos: String? + let uID: String? + let fontType: FontType? + let fontSize: Double? + let textItalic: Bool? + let textBackgroundColorOpacity: String? + let textBackgroundColor: String? + let textColor: String? + let textInput: String? + let textAlignment: TextAlignment? + let textLineSpacing: Double? + let yOffset: Double? + let type: ElementType + let color: String? + let title, linkIos: String? + let textBold: Bool? + let background: String? + let cornerRadius: Int + let labels: Labels? + let products: [StoriesProduct]? + let product: StoriesPromoCodeElement? + + public init(json: [String: Any]) { + self.link = json["link"] as? String + self.deeplinkIos = json["deeplink_ios"] as? String + self.fontType = FontType(rawValue: json["font_type"] as? String ?? "") + self.fontSize = Double(json["font_size"] as? String ?? "") + self.textItalic = json["italic"] as? Bool ?? false + self.textBackgroundColorOpacity = json["text_background_color_opacity"] as? String + self.textBackgroundColor = json["text_background_color"] as? String ?? "" + self.textColor = json["text_color"] as? String ?? "" + self.textInput = json["text_input"] as? String + self.textAlignment = TextAlignment(rawValue: json["text_align"] as? String ?? TextAlignment.left.rawValue) + self.textLineSpacing = Double(json["text_line_spacing"] as? String ?? "1.5") + self.yOffset = Double(json["y_offset"] as? String ?? "") + self.uID = json["uniqid"] as? String + let _type = json["type"] as? String ?? "" + self.type = ElementType(rawValue: _type) ?? .unknown + self.color = json["color"] as? String + self.title = json["title"] as? String + self.linkIos = json["link_ios"] as? String + self.textBold = json["text_bold"] as? Bool ?? json["bold"] as? Bool + self.background = json["background"] as? String + self.cornerRadius = json["corner_radius"] as? Int ?? 12 + let _labels = json["labels"] as? [String: Any] ?? [:] + self.labels = Labels(json: _labels) + let _products = json["products"] as? [[String: Any]] ?? [] + self.products = _products.map({StoriesProduct(json: $0)}) + let _product = json["item"] as? [String: Any] ?? [:] + self.product = StoriesPromoCodeElement(json: _product) + } +} + + +// MARK: - Promocodes +public class StoriesPromoCodeElement { + let id, name, brand, price_full, price_formatted, price_full_formatted, image_url, picture, currency: String + let url: String + let deeplinkIos: String + let price: Int + let oldprice: Int + let oldprice_full, oldprice_formatted, oldprice_full_formatted: String + let discount_percent: Int + let price_with_promocode_formatted: String + let promocode: String + let image_url_resized: PromoCodeElementImagesResize? + + public init(json: [String: Any]) { + self.id = json["id"] as? String ?? "" + self.name = json["name"] as? String ?? "" + self.url = json["url"] as? String ?? "" + self.deeplinkIos = json["deeplink_ios"] as? String ?? "" + self.brand = json["brand"] as? String ?? "" + self.image_url = json["image_url"] as? String ?? "" + self.price = json["price"] as? Int ?? 0 + self.price_formatted = json["price_formatted"] as? String ?? "" + self.price_full = json["price_full"] as? String ?? "" + self.price_full_formatted = json["price_full_formatted"] as? String ?? "" + self.picture = json["picture"] as? String ?? "" + self.currency = json["currency"] as? String ?? "" + self.oldprice = json["oldprice"] as? Int ?? 0 + self.oldprice_full = json["oldprice_full"] as? String ?? "" + self.oldprice_formatted = json["oldprice_formatted"] as? String ?? "" + self.oldprice_full_formatted = json["oldprice_full_formatted"] as? String ?? "" + self.discount_percent = json["discount_percent"] as? Int ?? 0 + self.price_with_promocode_formatted = json["price_with_promocode_formatted"] as? String ?? "" + self.promocode = json["promocode"] as? String ?? "" + let _image_url_resized = json["image_url_resized"] as? [String: Any] ?? [:] + self.image_url_resized = PromoCodeElementImagesResize(json: _image_url_resized) + } +} + + +// MARK: - Carousel Product +public class StoriesProduct { + let name: String + let currency: String + let price: Int + let price_full: Int + let price_formatted, price_full_formatted: String + let oldprice: Int? + let oldprice_full: Int + let oldprice_formatted, oldprice_full_formatted: String + let picture: String + let discount: String? + let discount_formatted: String? + let category: StoriesCategory + public var url: String + public var deeplinkIos: String + + public init(json: [String:Any]) { + self.name = json["name"] as? String ?? "" + self.currency = json["currency"] as? String ?? "" + self.price = json["price"] as? Int ?? 0 + self.price_full = json["price_full"] as? Int ?? 0 + self.price_formatted = json["price_formatted"] as? String ?? "" + self.price_full_formatted = json["price_full_formatted"] as? String ?? "" + self.oldprice = json["oldprice"] as? Int ?? 0 + self.oldprice_full = json["oldprice_full"] as? Int ?? 0 + self.oldprice_formatted = json["oldprice_formatted"] as? String ?? "" + self.oldprice_full_formatted = json["oldprice_full_formatted"] as? String ?? "" + self.url = json["url"] as? String ?? "" + self.deeplinkIos = json["deeplink_ios"] as? String ?? "" + self.picture = json["picture"] as? String ?? "" + self.discount = json["discount"] as? String ?? "" + self.discount_formatted = json["discount_formatted"] as? String ?? "0%" + let _category = json["category"] as? [String: Any] ?? [:] + self.category = StoriesCategory(json: _category) + } +} + + +// MARK: - Carousel Labels +class Labels { + let hideCarousel, showCarousel: String + + public init(json: [String: Any]) { + self.hideCarousel = json["hide_carousel"] as? String ?? "" + self.showCarousel = json["show_carousel"] as? String ?? "" + } +} + + +// MARK: - Stories Category +class StoriesCategory { + let name: String + let url: String + + public init(json: [String: Any]) { + self.name = json["name"] as? String ?? "" + self.url = json["url"] as? String ?? "" + } +} + +// MARK: - Image Resized +public class PromoCodeElementImagesResize { + let image_url_resized220: String + let image_url_resized310: String + let image_url_resized520: String + + public init(json: [String:Any]) { + self.image_url_resized220 = json["220"] as? String ?? "" + self.image_url_resized310 = json["310"] as? String ?? "" + self.image_url_resized520 = json["520"] as? String ?? "" + } +} + +enum ElementType: String { + case button = "button" + case products = "products" + case product = "product" + case textBlock = "text_block" + case unknown +} + +public enum FontType: String { + case monospaced + case serif + case sansSerif = "sans-serif" + case unknown +} + +enum SlideType: String { + case image = "image" + case video = "video" + case unknown = "" +} + +enum TextAlignment: String { + case left + case right + case center +} diff --git a/Pods/REES46/REES46/Classes/Model/UserSettings.swift b/Pods/REES46/REES46/Classes/Model/UserSettings.swift new file mode 100644 index 0000000..b4e2125 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Model/UserSettings.swift @@ -0,0 +1,96 @@ +import Foundation + +public enum Gender: String{ + case male + case female +} + + +public struct UserPayloadResponse { + + public var notifications: [UserNotificationsResponse] + + init(json: [String: Any]) { + let notificationsArray = json["messages"] as? [[String: Any]] ?? [] + var notificationsTemp = [UserNotificationsResponse]() + for item in notificationsArray { + notificationsTemp.append(UserNotificationsResponse(json: item)) + } + notifications = notificationsTemp + } +} + + +public struct UserNotificationsResponse { + + public var type: String? + public var codeId: String? + public var dateString: String? + public var dateSentAt: String? + public var subject: String? + public var bodyData: String? + public var url: String? + public var icon: String? + public var picture: String? + public var campaignsIds: [String]? + public var statistics: [UserNotificationsStatistics] + + init(json: [String: Any]) { + self.type = json["type"] as? String ?? "" + self.codeId = json["code"] as? String ?? "" + self.dateString = json["date"] as? String ?? "" + self.dateSentAt = json["sent_at"] as? String ?? "" + self.subject = json["subject"] as? String ?? "" + self.bodyData = json["body"] as? String ?? "" + self.url = json["url"] as? String ?? "" + self.icon = json["icon"] as? String ?? "" + self.picture = json["picture"] as? String ?? "" + + if let campaignsArr = json["campaign_id"] as? [[String: Any]] { + var campaigns = [String]() + for item in campaignsArr { + if let name = item["name"] as? String { + campaigns.append(name) + } + } + self.campaignsIds = campaigns + } + + let allStats = json["statistics"] as? [[String: Any]] ?? [] + var statItemsTemp = [UserNotificationsStatistics]() + for item in allStats { + statItemsTemp.append(UserNotificationsStatistics(json: item)) + } + statistics = statItemsTemp + } +} + + +public struct UserNotificationsStatistics { + + let opened: Bool? + let clicked: Bool? + let hardBounced: Bool? + let softBounced: Bool? + let complained: Bool? + let unsubscribed: Bool? + let purchased: Bool? + + init(json: [String: Any]) { + opened = json["opened"] as? Bool + clicked = json["clicked"] as? Bool + hardBounced = json["hardBounced"] as? Bool + softBounced = json["softBounced"] as? Bool + complained = json["complained"] as? Bool + unsubscribed = json["unsubscribed"] as? Bool + purchased = json["purchased"] as? Bool + } +} + + +/* +public enum SearchType: String { + case full + case instant +} +*/ diff --git a/Pods/REES46/REES46/Classes/NotificationService.swift b/Pods/REES46/REES46/Classes/NotificationService.swift new file mode 100644 index 0000000..c68e7ec --- /dev/null +++ b/Pods/REES46/REES46/Classes/NotificationService.swift @@ -0,0 +1,294 @@ +// +// NotificationService.swift +// REES46 +// +// Created by REES46 +// Copyright (c) 2023. All rights reserved. +// + +import Foundation +import UserNotifications +import UIKit + +public protocol NotificationServicePushDelegate: AnyObject { + func openCategory(categoryId: String) + func openProduct(productId: String) + func openWeb(url: String) + func openCustom(url: String) +} + +public protocol NotificationServiceProtocol { + func didRegisterForRemoteNotificationsWithDeviceToken(deviceToken: Data) + func didReceiveRemoteNotifications(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult, String) -> Void) + func didReceiveRegistrationFCMToken(fcmToken: String?) + func didReceiveDeepLink(url: URL) + + var pushActionDelegate: NotificationServicePushDelegate? { get set } +} + +public class NotificationService: NotificationServiceProtocol { + + public var pushActionDelegate: NotificationServicePushDelegate? + + public let sdk: PersonalizationSDK + private let notificationRegistrar: NotificationRegistrar + + public init(sdk: PersonalizationSDK) { + self.sdk = sdk + self.notificationRegistrar = NotificationRegistrar(sdk: sdk) + setupNotificationCategories() + } + + public func didRegisterForRemoteNotificationsWithDeviceToken(deviceToken: Data) { + notificationRegistrar.registerWithDeviceToken(deviceToken: deviceToken) + } + + private func setupNotificationCategories() { + requireUserPrivacy { res in + if res { + let categoryIdentifier = "carousel" + let carouselNext = UNNotificationAction(identifier: "carousel.next", title: "Next", options: []) + let carouselPrevious = UNNotificationAction(identifier: "carousel.previous", title: "Previous", options: []) + let carouselCategory = UNNotificationCategory(identifier: categoryIdentifier, actions: [carouselNext, carouselPrevious], intentIdentifiers: [], options: []) + UNUserNotificationCenter.current().setNotificationCategories([carouselCategory]) + } + } + } + + public func didReceiveRemoteNotifications(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult, String) -> Void) { + if application.applicationState == .active { + // SKIP FOR NOW + } else if application.applicationState == .background { + pushRetrieved(userInfo: userInfo) + } else if application.applicationState == .inactive { + pushProcessing(userInfo: userInfo) + } + } + + public func didReceiveRegistrationFCMToken(fcmToken: String?) { + sdk.setPushTokenNotification(token: fcmToken ?? "", isFirebaseNotification: true) { tokenResponse in + switch tokenResponse { + case .success(): + return + case let .failure(error): + switch error { + case let .custom(customError): + print("Error:", customError) + default: + print("Error:", error.description) + } + } + } + } + + public func didReceiveDeepLink(url: URL) { + let urlString = url.absoluteString + let splitedUrlString = urlString.split(separator: "/") + for path in splitedUrlString { + let stringPath = String(path) + switch PushEventType.findType(value: stringPath) { + case .product: + openProduct(productId: url.lastPathComponent) + case .category: + openCategory(categoryId: url.lastPathComponent) + default: + continue + } + } + } + + private func requireUserPrivacy(completion: @escaping (Bool) -> Void) { + let center = UNUserNotificationCenter.current() + center.requestAuthorization(options: [.badge, .alert, .sound]) { _, _ in } + UIApplication.shared.registerForRemoteNotifications() + let options: UNAuthorizationOptions = [.alert] + UNUserNotificationCenter.current().requestAuthorization(options: options) { authorized, _ in + completion(authorized) + } + } + + private func pushProcessing(userInfo: [AnyHashable: Any]) { + guard let eventJSON = parseDictionary(key: "event", userInfo: userInfo) else { + //guard let basicPush = parseDictionary(key: "aps", userInfo: userInfo) else { + guard parseDictionary(key: "aps", userInfo: userInfo) != nil else { + processingNotSDKPush(userInfo: userInfo) + return + } + if let type = userInfo["type"] as? String { + if let id = userInfo["id"] as? String { + notificationClicked(type: type, code: id) + return + } + } + guard let src = parseDictionary(key: "src", userInfo: userInfo) else { + processingNotSDKPush(userInfo: userInfo) + return + } + + if let type = src["type"] as? String { + if let id = src["id"] as? String { + notificationClicked(type: type, code: id) + return + } + } + return + } + + guard let eventType = eventJSON["type"] as? String else { + processingNotSDKPush(userInfo: userInfo) + return + } + var src: [String: Any] = [:] + if let srcFromUserInfo = parseDictionary(key: "src", userInfo: userInfo) { + src = srcFromUserInfo + } else { + if let srcID = userInfo["id"] as? String { + src["id"] = srcID + } + } + + guard let srcID = src["id"] as? String else { + processingNotSDKPush(userInfo: userInfo) + return + } + + notificationClicked(type: eventType, code: srcID) + + if eventType != PushEventType.carousel.rawValue { + guard var eventLink = eventJSON["uri"] as? String else { + processingNotSDKPush(userInfo: userInfo) + return + } + if eventLink.contains("https://") { + eventLink += "?recommended_by=\(eventType)&mail_code=\(srcID)" + } + processingEventType(eventType: eventType, eventLink: eventLink) + } + } + + private func pushRetrieved(userInfo: [AnyHashable: Any]) { + guard let eventJSON = parseDictionary(key: "event", userInfo: userInfo) else { + guard parseDictionary(key: "aps", userInfo: userInfo) != nil else { + //guard let basicPush = parseDictionary(key: "aps", userInfo: userInfo) else { + processingNotSDKPush(userInfo: userInfo) + return + } + if let type = userInfo["type"] as? String { + if let id = userInfo["id"] as? String { + notificationReceived(type: type, code: id) + return + } + } + guard let src = parseDictionary(key: "src", userInfo: userInfo) else { + processingNotSDKPush(userInfo: userInfo) + return + } + + if let type = src["type"] as? String { + if let id = src["id"] as? String { + notificationReceived(type: type, code: id) + return + } + } + return + } + + guard let eventType = eventJSON["type"] as? String else { + processingNotSDKPush(userInfo: userInfo) + return + } + var src: [String: Any] = [:] + if let srcFromUserInfo = parseDictionary(key: "src", userInfo: userInfo) { + src = srcFromUserInfo + } else { + if let srcID = userInfo["id"] as? String { + src["id"] = srcID + } + } + + guard let srcID = src["id"] as? String else { + processingNotSDKPush(userInfo: userInfo) + return + } + + notificationReceived(type: eventType, code: srcID) + + if eventType != PushEventType.carousel.rawValue { + guard var eventLink = eventJSON["uri"] as? String else { + processingNotSDKPush(userInfo: userInfo) + return + } + if eventLink.contains("https://") { + eventLink += "?recommended_by=\(eventType)&mail_code=\(srcID)" + } + processingEventType(eventType: eventType, eventLink: eventLink) + } + } + + private func notificationClicked(type: String, code: String) { + sdk.notificationClicked(type: type, code: code) { _ in + + } + } + + private func notificationReceived(type: String, code: String) { + sdk.notificationReceived(type: type, code: code) { _ in + + } + } + + private func processingEventType(eventType: String, eventLink: String) { + switch PushEventType.findType(value: eventType) { + case .web: + openWeb(url: eventLink) + case .product: + openProduct(productId: eventLink) + case .category: + openCategory(categoryId: eventLink) + case .carousel: + break + default: + openCustom(url: eventLink) + } + } + + private func parseDictionary(key: String, userInfo: [AnyHashable: Any]) -> [String: Any]? { + let eventUserInfo = userInfo[key] + if let eventJSONString = eventUserInfo as? String { + if let data = eventJSONString.data(using: .utf8) { + let json = try? JSONSerialization.jsonObject(with: data) + if let jsonObject = json as? [String: Any] { + return jsonObject + } + } + } + if let eventJSONDict = eventUserInfo as? [String: Any] { + return eventJSONDict + } + return nil + } + + private func processingNotSDKPush(userInfo: [AnyHashable: Any]) { + print("Push data = \(userInfo)") + } + + private func processingUnknownLink() { + print("Unknown url link") + } + + private func openCategory(categoryId: String) { + pushActionDelegate?.openCategory(categoryId: categoryId) + } + + private func openProduct(productId: String) { + pushActionDelegate?.openProduct(productId: productId) + } + + private func openWeb(url: String) { + pushActionDelegate?.openWeb(url: url) + } + + private func openCustom(url: String) { + pushActionDelegate?.openCustom(url: url) + } +} diff --git a/Pods/REES46/REES46/Classes/PersonalizationSDK.swift b/Pods/REES46/REES46/Classes/PersonalizationSDK.swift new file mode 100644 index 0000000..7c10584 --- /dev/null +++ b/Pods/REES46/REES46/Classes/PersonalizationSDK.swift @@ -0,0 +1,310 @@ +// +// PersonalizationSDK.swift +// REES46 +// +// Created by REES46 +// Copyright (c) 2023. All rights reserved. +// + +import Foundation +import UIKit + +public enum Event { + case productView (id: String) + case categoryView (id: String) + case productAddedToFavorites(id: String) + case productRemovedFromFavorites(id: String) + case productAddedToCart (id: String, amount: Int = 1) + case productRemovedFromCart (id: String) + case search (query: String) + case synchronizeCart (items: [CartItem]) + case synchronizeFavorites(ids: [String]) + case slideView(storyId: String, slideId: String) + case slideClick(storyId: String, slideId: String) + case orderCreated(orderId: String, totalValue: Double, products: [(id: String, amount: Int, price: Float)], deliveryAddress: String? = nil, deliveryType: String? = nil, promocode: String? = nil, paymentType: String? = nil, taxFree: Bool? = nil) +} + +public enum SDKError: Error, CustomStringConvertible { + case noError + case incorrectAPIKey + case initializationFailed + case responseError + case invalidResponse + case decodeError + case networkOfflineError + case airplaneModeError + case custom(error: String) + + public var description: String { + switch self { + case .noError: + return "No Errors" + case .incorrectAPIKey: + return "Incorrect API Key" + case .initializationFailed: + return "Initialization Failed" + case .responseError: + return "Response Error" + case .invalidResponse: + return "Invalid Response" + case .decodeError: + return "Decode Error" + case .networkOfflineError: + return "Network Offline" + case .airplaneModeError: + return "Airplane Mode Error" + case .custom(error: let error): + return "Custom Error \(error)" + } + } +} + +public enum PushEventType: String { + case web = "web" + case category = "category" + case product = "product" + case carousel = "carousel" + case custom = "custom" + + static func findType(value: String) -> PushEventType? { + switch value { + case PushEventType.web.rawValue: + return .web + case PushEventType.category.rawValue: + return .category + case PushEventType.product.rawValue: + return .product + case PushEventType.carousel.rawValue: + return .carousel + case PushEventType.custom.rawValue: + return .custom + default: + return nil + } + } +} + +public protocol PersonalizationSDK { + var shopId: String { get } + var deviceId: String { get } + var userSeance: String { get } + var segment: String { get } + var storiesCode: String? { get } + var sessionQueue: SessionQueue { get } + var urlSession: URLSession { get set } + + func postRequest(path: String, params: [String: Any], completion: @escaping (Result<[String: Any], SDKError>) -> Void) + func getRequest(path: String, params: [String: String], _ isInit: Bool, completion: @escaping (Result<[String: Any], SDKError>) -> Void) + func configureURLSession(configuration: URLSessionConfiguration) + func generateString(array : [String]) -> String + + func setProfileData(userEmail: String?, userPhone: String?, userLoyaltyId: String?, birthday: Date?, age: Int?, firstName: String?, lastName: String?, location: String?, gender: Gender?, fbID: String?, vkID: String?, telegramId: String?, loyaltyCardLocation: String?, loyaltyStatus: String?, loyaltyBonuses: Int?, loyaltyBonusesToNextLevel: Int?, boughtSomething: Bool?, userId: String?, customProperties: [String: Any?]?, completion: @escaping (Result) -> Void) + func track(event: Event, recommendedBy: RecomendedBy?, completion: @escaping (Result) -> Void) + func trackSource(source: RecommendedByCase, code: String) + func trackEvent(event: String, category: String?, label: String?, value: Int?, completion: @escaping (Result) -> Void) + func recommend(blockId: String, currentProductId: String?, currentCategoryId: String?, locations: String?, imageSize: String?,timeOut: Double?, withLocations: Bool, extended: Bool, completion: @escaping (Result) -> Void) + func suggest(query: String, locations: String?, timeOut: Double?, extended: String?, completion: @escaping(Result) -> Void) + func getProductsList(brands: String?, merchants: String?, categories: String?, locations: String?, limit: Int?, page: Int?, filters: [String: Any]?, completion: @escaping(Result) -> Void) + func getProductsFromCart(completion: @escaping(Result<[CartItem], SDKError>) -> Void) + func getProductInfo(id: String, completion: @escaping(Result) -> Void) + func getDeviceId() -> String + func getSession() -> String + func getCurrentSegment() -> String + func getShopId() -> String + func setPushTokenNotification(token: String, isFirebaseNotification: Bool, completion: @escaping(Result) -> Void) + func review(rate: Int, channel: String, category: String, orderId: String?, comment: String?, completion: @escaping(Result) -> Void) + func searchBlank(completion: @escaping(Result) -> Void) + func search(query: String, limit: Int?, offset: Int?, categoryLimit: Int?, categories: String?, extended: String?, sortBy: String?, sortDir: String?, locations: String?, brands: String?, filters: [String: Any]?, priceMin: Double?, priceMax: Double?, colors: [String]?, fashionSizes: [String]?, exclude: String?, email: String?, timeOut: Double?, disableClarification: Bool?, completion: @escaping(Result) -> Void) + func notificationClicked(type: String, code: String, completion: @escaping (Result) -> Void) + func notificationReceived(type: String, code: String, completion: @escaping (Result) -> Void) + func subscribeForBackInStock(id: String, email: String?, phone: String?, fashionSize: [String]?, completion: @escaping(Result) -> Void) + func unsubscribeForBackInStock(itemIds: [String], email: String?, phone: String? , completion: @escaping (Result) -> Void) + func subscribeForPriceDrop(id: String, currentPrice: Double, email: String?, phone: String?, completion: @escaping(Result) -> Void) + func getStories(code: String, completion: @escaping(Result) -> Void) + func addToSegment(segmentId: String, email: String?, phone: String?, completion: @escaping(Result) -> Void) + func removeFromSegment(segmentId: String, email: String?, phone: String?, completion: @escaping(Result) -> Void) + func manageSubscription(email: String?, phone: String?, userExternalId: String?, userLoyaltyId: String?, telegramId: String?, emailBulk: Bool?, emailChain: Bool?, emailTransactional: Bool?, smsBulk: Bool?, smsChain: Bool?, smsTransactional: Bool?, webPushBulk: Bool?, webPushChain: Bool?, webPushTransactional: Bool?, mobilePushBulk: Bool?, mobilePushChain: Bool?, mobilePushTransactional: Bool?, completion: @escaping(Result) -> Void) + func configuration() -> SdkConfiguration.Type + func sendIDFARequest(idfa: UUID, completion: @escaping (Result) -> Void) + func deleteUserCredentials() +} + +public extension PersonalizationSDK { + func setPushTokenNotification(token: String,isFirebaseNotification: Bool = false, completion: @escaping(Result) -> Void) { + setPushTokenNotification(token: token, isFirebaseNotification: isFirebaseNotification, completion: completion) + } + + func review(rate: Int, channel: String, category: String, orderId: String? = nil, comment: String? = nil, completion: @escaping(Result) -> Void) { + review(rate: rate, channel: channel, category: category, orderId: orderId, comment: comment, completion: completion) + } + + func setProfileData(userEmail: String? = nil, userPhone: String? = nil, userLoyaltyId: String? = nil, birthday: Date? = nil, age: Int? = nil, firstName: String? = nil, lastName: String? = nil, location: String? = nil, gender: Gender? = nil, fbID: String? = nil, vkID: String? = nil, telegramId: String? = nil, loyaltyCardLocation: String? = nil, loyaltyStatus: String? = nil, loyaltyBonuses: Int? = nil, loyaltyBonusesToNextLevel: Int? = nil, boughtSomething: Bool? = nil, userId: String? = nil, customProperties: [String: Any?]? = nil, completion: @escaping (Result) -> Void) { + setProfileData(userEmail: userEmail, userPhone: userPhone, userLoyaltyId: userLoyaltyId, birthday: birthday, age: age, firstName: firstName, lastName: lastName, location: location, gender: gender, fbID: fbID, vkID: vkID, telegramId: telegramId, loyaltyCardLocation: loyaltyCardLocation, loyaltyStatus: loyaltyStatus, loyaltyBonuses: loyaltyBonuses, loyaltyBonusesToNextLevel: loyaltyBonusesToNextLevel, boughtSomething: boughtSomething, userId: userId, customProperties: customProperties, completion: completion) + } + + func recommend(blockId: String, currentProductId: String? = nil, currentCategoryId: String? = nil, locations: String? = nil, imageSize: String? = nil, timeOut: Double? = nil, withLocations: Bool = false, extended: Bool = false, completion: @escaping (Result) -> Void) { + recommend(blockId: blockId, currentProductId: currentProductId, currentCategoryId: currentCategoryId, locations: locations, imageSize: imageSize, timeOut: timeOut, withLocations: withLocations, extended: extended, completion: completion) + } + + func suggest(query: String, locations: String? = nil, timeOut: Double? = nil, extended: String? = nil, completion: @escaping(Result) -> Void) { + suggest(query: query, locations: locations, timeOut: timeOut, extended: extended, completion: completion) + } + + func getProductsList(brands: String? = nil, merchants: String? = nil, categories: String? = nil, locations: String? = nil, limit: Int? = nil, page: Int? = nil, filters: [String: Any]? = nil, completion: @escaping(Result) -> Void) { + getProductsList(brands: brands, merchants: merchants, categories: categories, locations: locations, limit:limit, page: page, filters: filters, completion: completion) + } + + func getProductsFromCart(completion: @escaping(Result<[CartItem], SDKError>) -> Void) { + getProductsFromCart(completion: completion) + } + + func search(query: String, limit: Int? = nil, offset: Int? = nil, categoryLimit: Int? = nil, categories: String? = nil, extended: String? = nil, sortBy: String? = nil, sortDir: String? = nil, locations: String? = nil, brands: String? = nil, filters: [String: Any]? = nil, priceMin: Double? = nil, priceMax: Double? = nil, colors: [String]? = nil, fashionSizes: [String]? = nil, exclude: String? = nil, email: String? = nil, timeOut: Double? = nil, disableClarification: Bool? = nil, completion: @escaping(Result) -> Void) { + search(query: query, limit: limit, offset: offset, categoryLimit: categoryLimit, categories: categories, extended: extended, sortBy: sortBy, sortDir: sortDir, locations: locations, brands: brands, filters: filters, priceMin: priceMin, priceMax: priceMax, colors: colors, fashionSizes: fashionSizes, exclude: exclude, email: email, timeOut: timeOut, disableClarification: disableClarification, completion: completion) + } + + func track(event: Event, recommendedBy: RecomendedBy? = nil, completion: @escaping (Result) -> Void) { + track(event: event, recommendedBy: recommendedBy, completion: completion) + } + + func trackEvent(event: String, category: String? = nil, label: String? = nil, value: Int? = nil, completion: @escaping (Result) -> Void) { + trackEvent(event: event, category: category, label: label, value: value, completion: completion) + } + + func notificationClicked(type: String, code: String, completion: @escaping (Result) -> Void) { + notificationClicked(type: type, code: code, completion: completion) + } + + func subscribeForBackInStock(id: String, email: String? = nil, phone: String? = nil, fashionSize: [String]? = nil, completion: @escaping (Result) -> Void) { + subscribeForBackInStock(id: id, email: email, phone: phone, fashionSize: fashionSize, completion: completion) + } + + func unsubscribeForBackInStock(itemIds: [String], email: String? = nil, phone: String? = nil, completion: @escaping (Result) -> Void) { + unsubscribeForBackInStock(itemIds: itemIds, email: email,phone:phone,completion: completion) + } + + func subscribeForPriceDrop(id: String, currentPrice: Double, email: String? = nil, phone: String? = nil, completion: @escaping (Result) -> Void) { + subscribeForPriceDrop(id: id, currentPrice: currentPrice, email: email, phone: phone, completion: completion) + } + + func addToSegment(segmentId: String, email: String? = nil, phone: String? = nil, completion: @escaping (Result) -> Void) { + addToSegment(segmentId: segmentId, email: email, phone: phone, completion: completion) + } + + func removeFromSegment(segmentId: String, email: String? = nil, phone: String? = nil, completion: @escaping(Result) -> Void) { + removeFromSegment(segmentId: segmentId, email: email, phone: phone, completion: completion) + } + + func manageSubscription(email: String? = nil, phone: String? = nil, userExternalId: String? = nil, userLoyaltyId: String? = nil, telegramId: String? = nil, emailBulk: Bool? = nil, emailChain: Bool? = nil, emailTransactional: Bool? = nil, smsBulk: Bool? = nil, smsChain: Bool? = nil, smsTransactional: Bool? = nil, webPushBulk: Bool? = nil, webPushChain: Bool? = nil, webPushTransactional: Bool? = nil, mobilePushBulk: Bool? = nil, mobilePushChain: Bool? = nil, mobilePushTransactional: Bool? = nil, completion: @escaping(Result) -> Void) { + manageSubscription(email: email, phone: phone, userExternalId: userExternalId, userLoyaltyId: userLoyaltyId, telegramId: telegramId, emailBulk: emailBulk, emailChain: emailChain, emailTransactional: emailTransactional, smsBulk: smsBulk, smsChain: smsChain, smsTransactional: smsTransactional, webPushBulk: webPushBulk, webPushChain: webPushChain, webPushTransactional: webPushTransactional, mobilePushBulk: mobilePushBulk, mobilePushChain: mobilePushChain, mobilePushTransactional: mobilePushTransactional, completion: completion) + } + + func deleteUserCredentials() { + deleteUserCredentials() + } + + func resetSdkCache() { + let included_prefixes = ["viewed.slide."] + let dict = UserDefaults.standard.dictionaryRepresentation() + let keys = dict.keys.filter { key in + for prefix in included_prefixes { + if key.hasPrefix(prefix) { + return true + } + } + return false + } + for key in keys { + if dict[key] != nil { //if let value = dict[key] { + UserDefaults.standard.removeObject(forKey: key) + } + } + UserDefaults.standard.synchronize() + resetDownloadedStoriesStates() + } + + func resetDownloadedStoriesStates() { + let included_prefixes = ["cached.slide."] + let dict = UserDefaults.standard.dictionaryRepresentation() + let keys = dict.keys.filter { key in + for prefix in included_prefixes { + if key.hasPrefix(prefix) { + return true + } + } + return false + } + for key in keys { + if dict[key] != nil { + UserDefaults.standard.removeObject(forKey: key) + } + } + UserDefaults.standard.synchronize() + } + + func resetCartProductStates() { + let included_prefixes = ["cart.product."] + let dict = UserDefaults.standard.dictionaryRepresentation() + let keys = dict.keys.filter { key in + for prefix in included_prefixes { + if key.hasPrefix(prefix) { + return true + } + } + return false + } + for key in keys { + if dict[key] != nil { + UserDefaults.standard.removeObject(forKey: key) + } + } + UserDefaults.standard.synchronize() + } + + func resetFavoritesProductStates() { + let included_prefixes = ["favorites.product."] + let dict = UserDefaults.standard.dictionaryRepresentation() + let keys = dict.keys.filter { key in + for prefix in included_prefixes { + if key.hasPrefix(prefix) { + return true + } + } + return false + } + for key in keys { + if dict[key] != nil { + UserDefaults.standard.removeObject(forKey: key) + } + } + UserDefaults.standard.synchronize() + } +} + + +public func createPersonalizationSDK( + shopId: String, + userEmail: String? = nil, + userPhone: String? = nil, + userLoyaltyId: String? = nil, + apiDomain: String = "api.rees46.com", + stream: String = "ios", + enableLogs: Bool = false, + autoSendPushToken: Bool = true, + _ completion: ((SDKError?) -> Void)? = nil +) -> PersonalizationSDK { + let sdk = SimplePersonalizationSDK( + shopId: shopId, + userEmail: userEmail, + userPhone: userPhone, + userLoyaltyId: userLoyaltyId, + apiDomain: apiDomain, + stream: stream, + enableLogs: enableLogs, + autoSendPushToken: autoSendPushToken, + completion: completion + ) + + sdk.resetSdkCache() + + return sdk +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.swift b/Pods/REES46/REES46/Classes/Resources/Assets.swift new file mode 100644 index 0000000..5ae77dd --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.swift @@ -0,0 +1 @@ +// NOT SHOWING THIS FILE IN THE SWIFT PACKAGE diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownBlack.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownBlack.imageset/Contents.json new file mode 100644 index 0000000..f9f5b6f --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownBlack.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "angleDownBlack_1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownBlack.imageset/angleDownBlack_1x.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownBlack.imageset/angleDownBlack_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f961cd2e80d6b2a46fc73ee515e5c4984555f8c2 GIT binary patch literal 2968 zcmcIm3s4hh9$x`Vz*b)31tQ0=-!) zg`hy(Y{+(H>(gmYw8|M?WCgj~Y6spB6u-o6XSh7U1+#+5Y||pcEo}&F=C#N=r5@MY zlZ0GzYKcQwQ?k;)mE>_69$AtA$Gd3&U=>^p?6z8LPTH+S#&Bt1dmm#6Jm%uc(;|sp zLO5HW0VjzL0oKTIl*4fxj?>7AID#YNj0`J-Nt`4xT#XSblq6||lBNiF;)ei22XCZT z>y}T@fjcdd>vGv?3@a)sk{2oDqQis{8jS|SNsJ^>;DI`eZ7#-*+MIJH5p;r+bC~Te zvuK08hzu(hxU>imJ06AA?t`^CCo%(<{WP{b~?!+FfP$y5Jk&mtuiJh!z3lg;aEMxnQh)67Cf~?&@nDSi-5W*P&^JL zDFXrOM$&|O5w4(deB4zp@@8Z4k6nR>n#RfRxq`mo85i@j&OApOMTeCEA)Bp?Nxnd@y`E09IbDp66Vh~A1Vk-2n|WFzFh&JKs?azk#iEo7*P!45 zj*<#B!QyI_T2PNi0oLn8uE1Mc@A~mh=S2=+e84-g65s1XPai?T+NKqSjMPEfgmL(aB5aX65f9P zj(HL#5ya;NrF2fr%QD6^VOh)x{|kIP<{b{O2p+e_fw1Q@0s@eyRI^t>@dWQ0A>XF} z9_vz?;k?tQML2KU2|P0K*!+z8yig`4))(ap0Q5P{IL_`AjjkfbAtahWEnlGBv7eIf zWD1`zo>NdH$Ep-4#Sk1ykvNYsoEj8V#c>3uX4EV}O$Pr=@k&~$m>iE^CVnC{TrOiX z3E+#4A-_DF7n_xFoj(re2h;v*hBMZx<9&wxum#87J@w6>>}Rl%cun6X25x-YpkM=; za)3=PB7fI?2nv{k9d{ZBHhgFy(2Hbye|3kti(AN%XIA-v*z_)Z*@NE(iVN%B|dyK zS5#bc4t9-pX=8@pKXsz8WpC8BBhjwF^jR}sD@(4($wadMDEWVxpAEQc*8U~y;n$}; z+j6FjgxF^v`uHDplD?NZcKo??xKu3NEo?t@r!ANdySmHjF?s0z*@?aJBOgJd0VBxB zg63(tQ~nzMM7h|LuuIgnHSBEnv@LB34JjSo@x`gFkB{B;JBi(1H+nBG=76%Zx~;H9 z8=9H2B0O_Xour+yJ@hMD_@p4@u{*yZGqT_)5_akDFQ4m)i8+=IZD0Q2P6EE(qTW>B z2PHt?RHZJTf3iBIXY^Z%I}R@1o1(vR(DUx>{h77DRXxh==J)NV^Iw(*o*4{3 zkQZ}$S4q&ukS$5uZyopd)vVLeUk3EPp8okh&*7l`9Tgj{ zXI+ZQ$r>zcnAg-U9U0xh@2%c8{}Vqf5~G{yVT)`qB0{AX+xuiwy}LIXv6A+jrsH>Hy)$CqtvBq|%iis*_uHIWcj}g8+MctiF+)blAb~(tnGjxAXClRzl~z!WPyfm@Zumab4@`Xb%5P zgm8CmYp)@4&D<^ko@bKSa+WSbUjHZSj?Zj`r$ z$(m}n9{u=(^pL~Xq_U>P!>d>IL`I*hp|cIj);}G-^{?O0ZElpZt13<9vgV!(^*6JJ z%K2;ej~ZkPkDS=Ku{6HF;;pvQ8d*u`v6z8yrRD1V4=n!E{qllBO8TIcH8*zWYrYN~ w2ot)aI&Qze;6lBwIW|o8dO%h9uWH^1OOPU8+9c)RFE#|FC9l+-T$WSzU*{Sm^Z)<= literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownWhite.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownWhite.imageset/Contents.json new file mode 100644 index 0000000..89054af --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownWhite.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "angleDownWhite_1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownWhite.imageset/angleDownWhite_1x.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleDownWhite.imageset/angleDownWhite_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3611d3668d7b19df691a28a4d808034738dd1a30 GIT binary patch literal 1494 zcmbVMU1%Id9A80;O$jJ%p$NjTJ%UJ@z@(rKblSRrwjW&YFRe!zop$Y=uRZkZ^=*1=445n8S zI=?bgB`b@>@zvvxfnyyc2tvv+=!C5(MIBe|@glL7pA8lCAbinPC#6BK;LU;(ODJ%3 zs1XPuupQmBO=8(~TzeE)(6S6TZkR_k%R>1gDwtq!sKQ|4*U?=0iGexs=BiE3V`LcZ zc3W@fb(S;?({UUFT83q50->edh~thHrH6+MWtx&ChxzxXp4q4;;F!z88&V*&eA6P8|v)$Ee1q%JukCy zTVKL3Gm-MCWg%k_klUiuYB#3F98K9$Lg>`8aPzQK6Qfc>F=t7YvDPqGvqP7GRnQ@L z$ipOvq=<)iZJ}k%sjG^-yCM3)5)Sh z(?KfI)gAQ2JUus9wF1zq1B8jJZ&xKUvD8-wpMyJ&K%chVq=NJx(%pxptj^mwp_2^} zt^ZI^hH&4Iz1UY`{8eP{->$wL!o@I<%WM#dmu!^LNX)N945~kJ_biJcccD_Atd3v& z<%@SmR>6HAUw`q3T)`>){z~XhY;AT+=jV5FUmsY1_QIDtJNE0}Zk8_VKYqIP({oo} zxVH7?m6v{gWZ&w0>-gIBl`-|RLu0GwZls^AN8i8tzPG*h!KJZ-CpVOjj+{Ar<;>bw z-+UK7xp#a1jfL*PQ?rwA;ZyHSTs`spo@ai$xq0*a=c$srf8uoR<^51j-pbTW`R&Kg GuKfx1MB`Zi literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpBlack.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpBlack.imageset/Contents.json new file mode 100644 index 0000000..1b9dfd5 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpBlack.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "angleUpBlack_1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpBlack.imageset/angleUpBlack_1x.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpBlack.imageset/angleUpBlack_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..b6e736bab506cd9fa2b0864577e146e036a3a9a7 GIT binary patch literal 2941 zcmcIm3s4hh9#0AaL9j(n1ms=4 zLB!V9*6IP$9@-v0VCZ?&o}O*Am2!3jy{XfR)iTsaAGXx0h@9H{0wJ}nwO*%}nce;G z?*IG!e*f2gsmn-T8Xh_$R3edtr>5w$z;(6v2nhmb)9iP)f{V_fF zNQopE<4n0?t}%_IdApoqcrz<6u{(jcM6xik#7WTwtO%J|E9cO`g9qP&A&$|(E8>lq z(V5KVb17?FZ1$RT6TPN@)-rHn0<^G%1ORqcq@WVJ%^{E_I(QV91h)4v3PYnVVu21$ z@)AP1#tbN#cd?LGjv+LLVUSuY$JIDZs4bK^4k9puKrs!9s}O=974f7JhkQR65V{x( znWbOiqXTz3IA0W{OTFXZz-0quYNJpzzjqtVZCPc3%4pF$7~#UKn{Lhk7;m`a^2n#Bryk&9*x z#X#m9Z!}Ia*~L;K?=tbcZM;?)XRNLE;#xB);bg`i7xI>Svu9nzZmPI|V}K?39&7oenDu z`4dSd^ETcEh=DrAs0yQzOmzq%<)GPAy$%LZ%Q=oAaRygt7z#sF8kG`JDzs)q8&6}1 zg4R$f6&7!?u$J-ldY&%w*4DdztkW5u1{mM5VhVy%tCT8)QfQQjic!)Cr2)B7nF%JI zWiX7OiE*^YT^txT%62!ZR~6$`g;}&L4z!pp1db?Ka57UC4T5P@@ia?o%qjx+_Vahl z<0wfWJ^_?c@XgC&%IdRhT*ChXzYz5f2UrA+Sz|!x{TTrP$a4zkRZ!~V&1MVz3ZT(0 zB`MlFeL9%-wjImBzQ^3X>hmC(@U3^}vjFry%{ay`@D|Zcx!5EtsO1B+JNi@d1*-V| z;%SAFpv@`;qNH#dQ4$z~P_zaVR7KM`XfTZ#SB?jNPx0|&ykdMjewlb*YUq5*VP(M= z9ff~+I1e@}V>*8v&JU*j*9>R0Rmb`a{b37^zPsz2Ki`8&$ZAZ4 zLZ%J9);%k4&z3*6yu5xIoEtI_u%l3x(1FeVs_V3&d&eXC=%ZIQ*Y$jIuB_*y?StC~ zgVXoBd-%$i4qdvkz&fKXXQJX(dB+Lqw({H;LZ;1o%21b=3IEz={qE0OPv)CW9$%7| zh%Fg*?DNF*cR>r<&R^cf%{_Iko$L0$dg_(i zlP*V^E=}9A>6Axz;IU(UaUErkNOMh9UDd(Yw!YB$+y46ZlX6XbSM{oHG^U`px;Hz> zoO$+%fVAuR-362PK*UFr0t53At>0Q$w_1WCc z_xdJJ*=D%?ZXoyZ&h*D_w6SaVwR*_@;=1$G?Fvs1A^pQ|HU_wZ=f2vwcco$N%%V*8 zMrsT*wa>czxwk0Y#oX|w=&-WoS7pwbAMTS>xYx^6QGT`rijt2DUF<*4MZwt7~rI^>=DLM<4xW z1uNrZ9bv<*=dTK$r2fT!TYuzGJuhnT5n&r)>!__AmJNvSV*N zTpr#u&vdySGk%!%aC2zwn;Q!^gsXdN(Abotfq!|nQQf}6Bh91FUTiHMdZ_9`%93-( zZI4EESA~C>GL*61AT1BLb$U*O5cX-PYnJN7x2Bu<{|P9XK7n$4YC2mPW_x@PQfIGQ zRrAl%==Q4WTkLpf){~)It()I0&^Pc)IaoZo( literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpWhite.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpWhite.imageset/Contents.json new file mode 100644 index 0000000..59c5af8 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpWhite.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "angleUpWhite_1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpWhite.imageset/angleUpWhite_1x.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/angleUpWhite.imageset/angleUpWhite_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf53de6841425c2edcc4c3467f11f0dda68d159 GIT binary patch literal 1689 zcmbVNU1%It6rT9grqPICDN!gLrU;78-1*zxnIU5ucUQCMq-na?1bpb-J9l=*?93hK z-efmXL4E5(@uhuGD@YN2ky^3fgO&zF5b>eV$3Ezb4?;@c1W~AW_Gf4$si6zA^Y`6z zzVCeJo;kBH|MKL-Qxk$9Og83fi~M{rKgRd*|FdTfPx8}&bZ(gn!Xr=Q$C&WZg(*RJ z_=l*u#Fo5Q9YkUU`lN-GUYv5YAWYBnQixVC6I-|)C9ZV)yK9md`L1-TQgY^G&p|f^1)!c|n}+IXpm&85DbQC!tQymHKfVew{xClGul^6<3&_@L>UClcEGmZs~N)eHBR$rt|oP=8HS8xO+q>&uNFp>Mcq_X z@fi=ID9J@Ud)E?NgABV8_sx*iimaJUweOpuKc^awst%wY@uOgUC#b18rSdi??;9U7 z_`hHuIRVLH$R$THY-5lnZAmN&=~PLFWIQovXY^Tkp3_Jug9*Zonk#YDN)-8y9at5p z1xPk4W?43Ir6pT|s>#?wC98zWra4r>*VhPI&AlD1_xXAs`?~ELfox!eWz*0t*)p*& z>t)?);h<&cEi}r1Jd61Df}Q)0lW)4bDV({8a=X@td*UR1b9mK>#C{(*5as>tN+>rL z`_k}nv_l2x9(E64lmx5`Gd$bo)!IWtf!*j+xOQ*yd$VtM^4l8l{>TqY zi$a*RF`t=0%H@E3v^|Mjf@?yfO3g7evyUlwzf-xQM>Cp>h<=kBjhUiA6Qe!Eed zZCYnd;E>Bf2)V$<|k#=yWhjeP|lki%FUuT$NOr5#n|Cq8@t}9ViY>LQ?k5XDP43<9c>3u=$rsJ3O!R1#) zSKfTNN@1gBqwJKH;|VEGSa(0Yc279%6C+za*ZUTCrtQ04C2Do-_-b*duB4mgf}WAX zeh)_8*)k`-u2q;7Dw00mKI*c*TIFLsw~c|CtNFP^cAT6Mk{Zu(j$7r;fyjfa%APFS zFnRaSC)(N*RCwdVrmekpMNe&`tLL4pyr0gE>T@?wsVchT%Pq__DbvJn$+EdWlY7li z2wmipa`MjTnzd-7A>-MFwnZ0{mP!UbT_FBMQ0aQTXT{;Wr@5L$`IOo?0zY|)*wNnhi*tf!nWfA6!K$7A-IRU2%=&dg8GUU}`L zFn@*co28$Y@m_47lQ7%8MDM-*Ly5%fh|53ET6FJP^vI=+rz^=lS@k+sw&~Vs?DuA} zo>`y0c0*aGW87@1$i(|>JUcJ9o#5*JrQLh@l%D=l*_A0Ln^&f|CeA()blgwlQ zbEY(#T*&{dsHxl26s=i$%q@7roY#E(`0SqiYRxb{gVlU%t&bdE{NTUH>bNeSJM?)glhcYQ29*TSORX`0yQy>QF7$joB5wU^zcivxO9q(j8&i_cZu ze10`vU5AsSV6TJR_Urq?GCMyzD1`jedn?YzHN9mv)1EZ*E0qa;Ufm1+-2SHjd#&BE zNBKqX{zg8Wall=>Uu%I-$k_#X-%c|p#R>@MrC(SQAhbG3`|k#=yWhjeP|lki%FU+PvBL{@vMgZ{K!bJI!lvT)oyGfn8^&Z8f@9&KaC`aKekM z>w5zKUY+&t3#Zy@i!GMxQ(xv!w$n3nxRG$papJulXrSZ=5g7#US{&NQ@SI% zNj)|9^P$d|B~}&_C-c7i8I$1gx%u+EE%S?$9KQKf?3%_D9MaR9$vrp6*FeQjOmyiK z!|e(0mmGKzTrIymzPQR+^rUf^!b$PC!>X6f?#3KTNyt`jDQ`NduQ|U({LqXGUyM#p zxSrP z*CuY(MNJ3u*Sz57n>3GU`I$X0#nh8k{e#ZmjyzH(de$Uq^VW>X%BwHgD7_K7@##5J zzE!$r{@+ao$_4xQ@;$ZM6&J1%$)AwCplpR=R_Clm+g2E6_0C%SZNlt}Q*--{mLF$7 zk#F#Iu2$)U9}gVn`~FrJR@xYq6z}yv=iH_JTzjfrJ7axn`GY3h_FI#5QgRdDM9-&3 zv^FU7#+~kXQ`i;7n$l@1f3qrRk$&i;+)mq6m#nvoHwCn=n0SNja&JiO)Y_$gGw*-M z&ZuHhdwQbNvwo`R*5eW>yO+A25v}W2a{L{9dlJ*^bL+IUHyx?#@tGvE(XjeVT4$}K zw8~AHF!rQo)@^k~LbA;|x@*GDdQ3^Mb~{_*T5&(?7}w*1*o|97?kS!*7{w|(>0gvZ z-nRXB^g7<>Wcul5*i^i_c;Wi{soev(IwX2(!%3{I)7h@czz*;$5ez%S>kU ziM$Va#@uu-$1&>Vw4w~(ljx$8$ey%s=juQLR!?^osvco_ds`%^X{D!Y6^#7V9l zDlJE=;Xi>fU_5W7p1}z%^HtZa(3e gB~o;BRh{Nf<`BQqhz}nt13+bir>mdKI;Vst04D(k9{>OV literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconError.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconError.imageset/Contents.json new file mode 100644 index 0000000..0bba1f3 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconError.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconError.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconError.imageset/iconError.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconError.imageset/iconError.png new file mode 100644 index 0000000000000000000000000000000000000000..d417540d4d88fb9eb2d335f5fc37d35991cea396 GIT binary patch literal 9326 zcmX|n1yB@R)b=h53+mEHHz+CHv2=HXbS%9{cY`9`ut-Wuw}gmG<5JQoi*$$}()scJ z|2N;AdFGsZ<~cXcoH_U2nH#IEsf7EK@+klSz*SL}*L{>{k3i#q0RW&$L|MsW2k51% zBnzk;r`~()_`{4<>@_q1?2kGQ024?F!1|B!2q=*1|8zwlD**KW>=*z*j1vI!e>s|u z^1nv@i2r>4zXTNl|Cjw}E5i6c_E{0=|8(?!Zu)7N&X3}WyRwNF003(I55TjiLlppk zDOp8cM&BQJX#QluPi|3Z4#gF;O2D8}>Z(9O7^@oJUApwB%$8cJlR_=LX6El}7 zdumgQvFUHdUmDvv!;l56^^GSoG7yBWpIuz=v^!;W!%)y9{mmW9xz$`Rom}D&N95g`!|p%%Ja3V^&O+(K-g# z;w#>vG5n;2=qUkT<%0db+-JitFu7O#v1&2cd>Fm?$?V@T$b2c}CB54%a(=f6ZQPbk zzpmma)eMlf?R**8h;n`))_HTp;2_^#=mVkrGc!Z+c40Y{`$wo?bHNg?m!OYT;t%Zu zDb@+f^tiTWs4$FiYdjzbb&@wInzxCGyaQvsANfRw?WD>6mfoG0`7=zDuNxR#B>w}e zN?u_O6Z<8VMsxBZnL6zED?i;Xnr(RFo#q0E*D;SuM(aFAKkl2ohJF||qxCHGoiOt> z)RPGl+6Mw_RHbDP2mY+47#gUJ^#sl#dpzjX?W%^~RybFvu1M?5&2Co}Hi?F|zMwodh5JI6|}FYS6mu{c=B;q}tA3oJ+fl z$VjYGK5C?+KiF>2JLGx73c}NR$F$|mX2UBDGxtBbDi4ZoUh47q&jj4P2R`#E{7RbT zqT4Y9ek4v6@#E5Eww9|%rgiWjDfNI>(W{yL7~+{fOQrjcyxLI;YKolvhc&YG5>OJ! zw1dIN8aid$4LJ<0IxF*c$0lKlxl%j0X?Sg%?@VU@s$}_vCbo;#YiiM$>^y+ToeGn{ z;QR*&flTL#tfI)7kkTo`*DC=ms1|BX51W=qAX%8A+wR?yuN;oqT9pzk%4WV11XS#- z(O|+VBX`TMR5#eT^SM6AFJis0W--|q`B7vWBi)1Vr3aQBvEO&b%bjJC4>jUZc_75A znDwSb*`Jyp!L|pIGGKFh^KM@UF{<`xg!<(D)eA9`4{_n6_Zlx&6V*KqblFfjA-8kF zX^`-BU-VM}g@9(ua$iwF%8vEV>fC{*lO2net9|LIuiUEj{g@((lNRfz5~tkqp0{-m z#s}J?mBM(5_)Z3Dlkb%W&!%~aSV`7KvzUEfTg#n@(}EfjTT;ZxCb<%(gD)|mbWR>H;>o4DntZNVo@1FKG<0 znn0R}2&t?!I{{mI1T}Jp7Z)!+#McA0L>EG)^yZ8p&62nl-67>D0NM7IWHkxa;R+Y` zGxdx(3)$L7&GdN(fSVhZiC4eUgW;O$?qxWJZybz343enBJj7qlG}7eF#{Wg!#cFH1 z<9KswvX~KbqPua)c*sQc&)sMIDzE498pv|0=^A)T1u8o1uz(}D^d~zy3B>vEz%Fur zE;e&~y!a+K+HYV1=MQ)4JX!}@LwH1yf5Kl?d+W%>DcVWb)|{p`wTVa*FAA3neUY}V z>MX%y<(0wGXCK;`P=Z*VcBTyS)3{TdfwOSTm|IFm5hK(-(=Yw`ITRhy9(ivN$D@}> zg=wt@yO;HLg|Z*$CODB@E@nFZ#+a*hR#C%Vn~)>f0!7+;mGct3_19#V6-*!>!uAg-$kKJLl#iO(@6~Ns z@hVo)L_lxCD;NvW1h}v;m0ho{(a=8k;1cCQ4HGjPe_eNzKG5TZ4ZE07$X|!HZLp)a zoR2H(2gpU;fn3cl)2S$?&wTk)3kRnyxDt8!ulIFUFH__Ow$Kbv0~!?RcF2PZYSg$A zRgUZW9xu;uFA>Nu{!#Mq>E+m<`{v;V^|>pinEZjk8@YXV`w?iC?S9YPvyi;G%*F`C z{G$pyp%6OtdIpAEuKl#~!t}GwB=~iA5xnzL(6@Tvu!l)h*~uHX_NGDwE8(+v zOJD+@k?Vn-jLxLjRy(d0(UyHNFAo>ouT5B$X(*SidO~Z=O_85WIr<|;jNjL0h#_Lh zu?}h*A!P|!i@sQQxG(wHJ44y6`m@YVgcetPRuOP16E0X+=%G#LJa)^0_TR~~Oi={p zubrswrv;ue3+Ac_Wh#!v;QppNEk3*E z+*+674XX55RS=<13;&&GlW zip{Ru4Ti=YUcXR$u+=o216md@Y?V(MiJRleM&1E&atjm#aK1_sa!Uo3tlP_@`=Xy* zbVb!N(5kiWUe)dN)lQzZ6UEP(as3wQiW{6)_#lQva`uvY=@#4bhIrOzms9t4ymk*J^nY*LXhW7(8%6P!h9OX|$ zi<0?7+cC4*2Pp4TG=%=!pQF7hAXJ!ZZO)tlL>i?)0#B5;S5GUmcjiE-qMhK!z)dI%17Woyju2{ zOJh;`EDbqoA02G|v}$GU&-1a(j@7PGGx$(kj%F8^WtJHeqf->Lp_wqUv-3M_-mq|* z?6%Ns-rDr+Z^npXL-n`|kRaL0{2YEpyUniP>N~P;^C137HM|lF71`Pv5F&E;WXT?F zu;bLEI|@S^JUEsO;9!VabTLV*^oD6x2hnl<&6XvtH~!l)Cj2!VvrOV@X`C@8++3-t z`hFO5*sR<2tnudr-Wt8oyUlabCpae|vD%Abvj*81y;`7lrUq z0ia^)^9vw6G=2+`7SPf*xQNaUlLfAyBLPd}^Lftg*%`}B> ze*ofwS#DaZuL9ehIzM(E9B#}c7H3V~A1uP}8PeAMU{;aV^AnV}@hYj@9sHTu0G%Y{ z$&KfCk++SHkvDgiBTJWl3t{^VPcr&C)&3(us0QX^s*+EB#etDW@ly!?<~U*FhfqX8 zf8?~6$OWC_~ z@cDh4GhLf!StUxk@$RT>ZfV+IQijcD=f=_ne@2&?x>;-SESX;Qdjkcup2RSSigzdo zjxxU^!A@3#-{}|%&r!i5KYwN#Z1G_c2Kh7C9FQ6P>@QvhTv>cvPtu;65dl>YU>NNz z?Xwt~cB>YZGIjoi(t>!@e)ti$*-4SH-Uf|k{t*}phhu)(U&U`=P?O%WSS@zaUEZW? z);ucvy{~U{#|qxNLc_EVw(?V=nw{oNhOnq#iH27t2VxVDLJ-P`1SGL0;q{kMiapbCWpr3yUx9)W5yuInmAVX(4{{N)s^}+st=8BAROb z`sf)(ug3MejK8bT^|A!YU;vsx@vV5)4Kc;Meecf;CQ(n-(vB{42K6hSvu>#SP;E)+ z3=RRu$-pz^m0J*MsY@wbIvx>Hm z?qt#H&f~Md;FJ?(mXuY^j%KY&q67Ks*>WW?FQ2K6hB5xIk5z$JjUc5k#0GY1TAjmx z67Pdcu6@B-xVs6$%NiywVFXraXJw89-s6M@rUG1dmMhV4&h0UmxM6@|c?+>29j$Oy8w2qzq(2mzYEa`EEVJi}biEG5}lJuH*t=2M?aPiwQZ zcyGH}2SJM4TYVC5otu72k6X`ku)3p)Kbnr=ey)l&?ORp~e~tu*%?UN~c%$5gg)M;% zHzjGdvGbWr^QbK4L)n!6h!=fP+RM}eCqwY&hSErssG;uMurg1kMCto>fuZ^0a=2AlanRS z9VMCIH(_5plGoeE_(_?3yVy3Dw*TzrVqo0Zg=@NHW@Cy-@JX{6zi?2pZ4J+StL#UL z5`K|{Ugdu~-b{-W6~A_4AS96DlCEHTzNbaxe*cne!HnjP{V9&tCuS#jth<^WKI!^G z^kzsmn)Cx)b7jTw(vA0-fFjBx$e@3ZswDN9==Adt!#_LZlV1#q5nK(Yr&Z%K%38k= zrlg+nb7HcisRv)a^4ef(Bsd~35@&}cX?X3cD`%LlzZlkUWrkd08U*@9p!dd5PL=Z? zI!nqb;GDR#G2YLx{uc41{EI$e{F_1ZcwB$?>OFe;!>L+z*k`ap7c0H0WakC4o-lIN zh!ySow*qIa@GU()F)Ap&Vt@Bb7oqwST3&4 zIBlrD*-4W$BURiEP&e;|K2(vlP@NiiRXJFZ2T||g!DFS9NLef@%5^3K^^v8gy6hJY zB#0Ob08TZT4o|TPkLn;fdz0z`B2jUJ^+&#{Um}PKcCIl5Jv*$|zp!sCw@Qi$v*N2O z)Q|~>be8rpjFcx;2B3C?7c2srm~XgjtA;#TmLjM{b;mI&IMG>UBd|+LNxFr`3vh_mhex z3&*$kY{A|R2@w>)U^h{FhDp35>B5s_;$OSzi#M#~bX*OA8UjA6=jj zl;426m^&3z!YhYm|K!Ys4~cu7v3zZP;Yl*`oRfAmt_Q9`MNA4j{`FyG=Cw#T)d`#B z55+m0>9QC7cb00rwi(y%!sUQh%mi(7kw6-3b}JI)kc><%>`8> zF7KkWMj!5%k>sk`#yiZj?p44O_1JBQJX3T2K#niXGW= zx)SA%BCU>R4`Rq2p|Zn#NU$m9Y4TaRU18D|-@I=`zDk0BcG4`4XlTZp0@ouHI37%5 z%ep)i+|qbzu*9L)(3(iG`(s=++9wC^*OoRfXl9NK=0oKLdc0@|nT zb`z+Q+a?tzE)K*3U9#}iY5L4+1^@D>*7m^npPpd_k)`?>RV?j)bA^KTRTtd-ssWnqEq~xh+K?+V6Qr-E;P%HKiVpHG?R_$=r=H-K1$G|@adl{Bx1xPo zeTtLE-YXJ_`w0>a9NGaaD~zYF^y5=&J8r0hdzboZPQ(s($LV%gCweBP#{alFJaALB zlrVlHr!vqaJr1jGsC!rbhbR0&^E4cn>l-=8=Z6S(clzM^g`%5UTLAvoA4YSUS;Ye= z>>ZlpFjTeB zK#sJLLHtd(S=(y5>ah07QLKh6P$2oLq$=`U*0zrS$pn3RT@5)c1geis@D6`CjyS6} z{2fN-9F0PffOfPSV|%ieck1*QTvRA_SwQ};yrs5QqN-KG98Q}#1leJ09TX;7xUSN< z>E9Is0j!`9TLAy=7!W#hh<+axa6Q*ZIl)7LlutARQA|r}l|c%hX>+L=Tl;FEjI_t! z9$B2c^=W(Day|@D*tSj1qm)WlV`{uYp_FsrW#)tXzVu8t9{~zL%Fv$IbXt^!qN9DvBaN?B{RTxaEdyN8 zSD;WvA#d&O3{g`+_ROKEwwF_7oBDAE><>R*V(1m3!V@C~Do}u$ zNSgI&>DnB1!IUs7*hzuyi!=?&L{HRJs(uEZe&y{8y+19bkWH9Xh$oArRoRJFdh+bQ zcLsa#LWsu()WV_A!1wLbe!I1NJ9RPXvXkVr$^AF>P8*Ba8|IO8yQD>j$_~=!!XMigd5q+UVy<2sBa1pE+#d)nlQ24Nu=@+GZ^r zT&tj2tGM-40@Kn_mO>}xSTJM{@|`}nWJBr6CEB=J^!B1Q@CXvTDhu5{r1GHDq6V)j z*q8pdU4=i{37|H9Lthl~AY{`vb)2VIx|yc|J0KNLyYe=F6ZG)i^ZlL%NlONI?k&+(ttr$^;9j|{M zljAQ5mE}a(=G*dcDu*72)s~s5Zb`{P1#qK*W?)MVlfV?^Evf9-2`PmnEVNpMrdN8@ zH{C2x_RI(M#}p0y2eHappn0r*G5WL*%4AUDkRed zgEHlZ*+c_9H`~dZpb-(5eISTR57OnOm*LTijAioMA1MOA3DVJ=6kgfpJmICwbK2(u z9lhM`(tBj6B&*%L)GY)HUIyWBk%aWaSGAy|Z}~NT+OCD+@Ewhkz$Co;`r68M(O^OU zl|0Y5?scI;M!F7KFyl)NLh?(-#kG7yaq#o2VNtbFMKwBX!F98A&&PB;SX7?vJm+=C zkWuA*-!ax~O5|&aEx2o*bz++#dc=l$6UDD_2wO9Y%qrgK7%MR)2`$7HbR3+S57XYh ztzbREbNH|{0LYpdP$Fg%%UhOcF}I$WypX}|+$j&1gstMUp$Z?Dd1wVF+dB%v9D zfBx$Vjh2BYHKAd<8$#x9bK0@n%;OkCndKbX&bnQcqbRX2QVO!^S9@M?KFP4nBF_?W zcA;D^2$5k8f{t(z;l6@Wnr^fD};Ieb{>b!W^` zozz*`=3eg^vsb}B^U~**%T;3gcdxFq%3wNizA}kLAy!>oZM$1kAa==n^Scf*q*`YH zFK0Z^dD7fpH}XTJaF549?9-4q{?Mo;A2ol+Tp?9*-9`{M{jKPDr@5tvE_Umk^aHLz zMf>fxP?)1%ZL1JCs~kmrq4cIz^vF0L&)F~L?)`^LdUYM>(4mDX1XQiZFqA%eme`l{ z#z#BbZ;fy!&xXe<*C+))KV*A1MuXoQU>{ri`xrgoOfxh4HEZLc^rs@vcKtg(&e(ib zv(R%jozRqE&Q<=`S}Og^Ns=2+{+5cAw`)*anj_vK%3LnSr7vqYOOhR?;6&~*Y)${P z|ClaCW2{HKALVIb|6Wd*3hF<&j^+=v{dq;?k||3 zjU`RO-WHe5nzkR!HY7G@<_lfLtnA=c@QwCXi zg2Js^SuhYLu|VP3+xQ+DPx}q*r{|kLYco6H$|>u!q5vMBa95|D zR>!AiwB z6w!2GoM4cwc5hgYCayA;>HHnsmYK@&3CbT{+3ct5OOxKXFE#m+Xy+x*RAnrKJoQX@ z(esfaa-_?rYPJ~aHX@oXLl=ox$~Zh{+87e@=Y5GvOXdLokS4w@Bb`BS9rffHl0js> z%B#)G%v~!+b=xP{!?qbO!sYDHQ^wIhy%O4hF*>1nP5AR|DJysxf>-?RoUzyLrb=Lz zuel$EBPm(Nt2Wx)#JMh-$Dl#B@4^e1 z>9{}ERDJ*kx0zl5_^vNfU**vY81Nr^5b<`EEv?Ex)513H?;#N@k0r9~kr?5l%zO^? z(Q7r$MA*@9Kbf6P#!u(&daafQRWLM9vYp+aeY48Ed*gI^DId}Vm)cV$npKRw4o_xN zkLg;I2%CC z|MuiVnwOCN34~nGAIKQWV1jbiBV)4PZz-fhzi8KArZWvJ**?pMeJ(lA$-;_GP4}cw$l?=|rgKVIkv3^aTYwJ{xpLCQUab{Xu z5fxWwWpn<<=G^by<3#+f2fo7)SLvRi`?uTY$AMmqH1c5qa-%0@=}_+y2rFoU_gHty zYO)8hk+A$4OC536YkB?tIEURS3nkbUdM8#Rs&++DfqtqqqgR2O@VPKkUx%HZQF z!Ur)Ch1Y;6N+wB#K)t6W&UzHPKoElE9wqOw*7}#)@}t@9ljPPgMaDH}LyBE?kQ$+T z4F!Qq!t=v5>lNx;7H=zRT3P66vuZ=F(c+D18h|t?inCtU%O>Ewzb@~0drDELIAGL9O(c600d`2O+f$vv5yPg%`rJPbZLM0s7v% zm-q?pxZ^k>2>>#gOeT}bWHOmdCN>}7kByc)E%#bJxBqWiG5pnXYXAPy@~q{x{XIv! z-YB%xTK;G`kC1(pazJ>y1x8}dW@Axq3cHV@yA#+N+AT1hoxrYX-;B_WM}cC3 zKM1lQ-oox993jMYqHniJ(C!(Ib}R6g4lG$9C{k#s7l2XVMyAHA;cU=QLR zX(9=pksSh~Fux#5gQpM)1^dAqkjCYlT<|)ckbX@}Hh3Ks><8E2Hus4H*#nyjH>N^* zK_tk6S0NE9$buMS*e4mDB^A7m3ig9G67m5}=_?ruiJ~BLpoD))%shA<3NlB=zT+{( z^t3e=61)xtnL`bx1(6_sza(Vo2!fexl@xQc%^2sl4*Cns6oNcMO2{dNI;UoM5)fpg zfpfbZF}hspolV#5kPQ90thsc*NRVgq6BdeXjpbU=-$MSz`s_LjS4?(EGs&#gmcng~ z&H^ieAg_z7tanlrrU%c|yCptqBF5CLv0vm^e7%!GaC>8YRrO8^LH0q2)z&*H3c21* z#*Cx;m-N{2a&UZp{?0dqw@=wUBcadLWipveCX-2le=E^#w2z4OX8-^I07*qoM6N<$ Eg1#8gq5uE@ literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillDark.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillDark.imageset/Contents.json new file mode 100644 index 0000000..690ab03 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillDark.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconLikeHeartFillDark.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillDark.imageset/iconLikeHeartFillDark.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillDark.imageset/iconLikeHeartFillDark.png new file mode 100644 index 0000000000000000000000000000000000000000..16abacfe40cfe2a661971946f8bc2ed90ebe4248 GIT binary patch literal 2196 zcmbVOc~BE)6pz73z>(qz)_N`rtyJCYZVp0L0|BBW)gTBJJaMzTBpH%y%&sJes93aK zpj8HJfe~7)Q>R#{_oyvx@ft6L+7>UY_4vbLDpefEYWpomruMEo^XyVK&Yi49#hYO%ZqABrS7fIzZJY;4pHm4T$9sV4KY_t~6RGBc7D~Yk%3`^Zi z`qGpPYH2Q|q2c&AXo{Br3LFeiLSBd6$q`;H+@qHOvhW&(p&kgItA!H;gHVcALwy$v47%wYVwQedpEiYM5r9Crd?!zO5hoYfuR+gnl-uUwZLAX#G?Hd^ z39p5Lv%M@FF27nQ*B2=eGt^7EP+W!yta^Yn<;S^}xa~d0X$ocRjDvCV9Khm!tjo&s zEN5l^Mz#O*a|S?kO(wsMzx2i7@SEWHsd<1#UqJp6&1K}f7<3lHu}j<(Gc^ym87Z)F z5lL=_%1jW^a9H8;%prCGOk|+NaOjAS->voWUvduwS7}Vvoz>q(XL=tOf z-M}#LPSN9q$wU~P98Wqa#;DiAfVIqKqX|_khR2#UG{R_dG>9?>ClQTGMIo4yjKvsC zt%xP%{pa;8wM58m|9SdubUKq#b@E+35Bv?SS{zE~bzopm1HFPLekP8xtLWbJL#K_VVty?(5gigv8-LTrT9|?$&J` zZ))58%K3`#g6dL+M@J0~+ad`*C0QxlRE)Gky4n9Z#fB?-9eKRjunsZ9RhA zZaQ>hx!NEpFCE-ava!wZwETp0v$RV7EK9=34QJ*P~yXJ^u~K?BMll$Fwzy2VXL(@&+_g=ep~bZEnhyoXTByH?C+{dR1fD z#LU}@c`3Gv;>mB-`^<@*+Uf_}+Cwf)TVxztSXd=u-=20|nGqA@zMx$+%zH0>6aDyt zw&khx<-NJ*X2gRy9H}35b!e8v^r~sXo_8c6JLRJm6fq6T)*VV9Oa;QN%J!3 zSx~fLgfZ%Pya2t^Zs#R&t4~MHS$KAhW1uXN*#ZqFmfN%86-o4#=$TgoVv1h6)@G=P z_mw`lGAuvpS)tU?__zzJepns2@ZsoR&s@pcbnno_isV}6!BK91@}eEkVkE6Q=*oez zf&t5YkAJm%zrJv1Uhit>c#1Y84eRZkX;)oLV&fK|mGmC2GnLFRt zb%+yoHc!tywmMYWnZ9ZIjScf|cso4NMGaT)kDGpN^h*U}lY)!)ue5x5y5M-*nhP!B zZ?A-=Tq`-BXbvjQgC8NjR?kpel338#dg4gz_?D!^M#-ut`4=uPvn0LMq*6I=ABO4H z_XZ|TwjgOlM|;a_p=-9IgDQP?YnZgYxuEQR! zSNu1RDuYHww?8Yp8ql@<6nDH-!9=2(uB~tQ%i1tJ`eyu$-67#KAMUCY{u_)_Q}nwN H7p?jYoHHRJ literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillLight.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillLight.imageset/Contents.json new file mode 100644 index 0000000..ad1bbe9 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillLight.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconLikeHeartFillLight.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillLight.imageset/iconLikeHeartFillLight.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartFillLight.imageset/iconLikeHeartFillLight.png new file mode 100644 index 0000000000000000000000000000000000000000..0ede0561b29752fe14ee8ba896097e2757521d4e GIT binary patch literal 2708 zcmcgueN+=y77yX82()4=V0T&Ogdl=UW+opbGY}*gkRXAGY$dL)oy<%^jwBN@0|~UY zhCQO}vBk}H!KG5IAFU!77p;Pd(o;*RSZfiat z^%HOo?W7SaRA*1QDg_+b$tWx~pIIw2r4*+bH&KwyY7ziGA+d#YDQ)K*bL=D&EVNooV`W&}N>CcLQouzmGMh<^lHwFercj_k ziYh=UE*FCaM3Mr^Nf`wrD2z&Evg!3|nke_?*1LYP(n*@&Y<%xkP9ZpsA~0w)h!GGq zN~IvGkjp@+3^j67axqRCrmYp&&D_U^m)>vH%ZlVI$`ml7FrXwzp+*#x8W9{sWikSU zrMLp7V7Wwri@o(cQ6gB5nc`+!tDLZ$lq_v-4z~lKhYSgMC=a%bRhL>D`qcdVV z$7xLUR?tWgTU{f{z*IQjEjkPPvHZS}o*>!d+wwC~bkFy6V9nQh>XY@gmztoSfG=;R z>g#vCzeSVy?yb+Y*LZ~qp{(#h?X%W*2<=+_X200xtqB7``vcXtzX@w`wI#h??8(f% zdSqoz;?|undD>#{3?Se3-;I9tQs;Z?6|0WrBzm$}c;v37?lnYDqLP*y2uZOVm!)!`soK^+=2TKezU!`D|*aupeu9x3te>A zDdj7|j^VD3*jdHA6ZhW!t8nXD?K$W|K)!D5wc~NQVSdl<#D^~ad!A!)eefyOr`nc1 zf%&cm{IaH=DO&x>jy-{*nvKFG8(Yuz^I!k${NTxF4j$*aP^Q{Fk6E)`Gc+(-ChRq> zS^r!}!P-IH2f|aAsFuTB0#aC8*dMBY+VSTqRg@w;GW$s0mw_vXgvHTU$M*fPXRrN5 z(&cSm@Uu1ovpy~8+!R=0qO0{$?IBT%+R_F?UyGcVndJuf@6}zMJ2qb}tZn#4nC3Eig-9i#-x@Si9@>sUOw+1Gl$>H z9BMlAam?rwAMzWD)B7s^{#Y`4Hukq6^5~$`TDD2IW~e>*qs9H`@^hx_syEAWSMRe6cI#Jf zWGOFLYZPB^;;XbSWdxm+w{5QKq;7Ut(+Z(3LHFp2x>~pEifZ${K{;Nr>CLjJZeZq-x~Ra2Z&M#9G~%e;y*A5N7v28f zy#ok|h(~fS$6vo^=pR3GvRH&S%^CgE^9{Em<11#zH%4|R&3x$?znsxa`c7{^Li4JT h+b)ee5c9RMsH45uz2zVNMd|(DsL9G#@5_9;`oED1(F_0p literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartLight.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartLight.imageset/Contents.json new file mode 100644 index 0000000..a24503d --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartLight.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconLikeHeartLight.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartLight.imageset/iconLikeHeartLight.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconLikeHeartLight.imageset/iconLikeHeartLight.png new file mode 100644 index 0000000000000000000000000000000000000000..1620238aadfae5c3cacf1e7fc95204a5f47cf0d5 GIT binary patch literal 2593 zcmbVO2~-nj9-kmbK@cqkL8XlW#4DM}A%u|#78Ih1A_=!tCdq_El1xZ~36~5Ao^3^} zN&zj0u(E4uE49lC3$b*iJQZC*6qN-8g{Pw6^8gXt2?DQnyI1qxWWI0a_x=9=-~W2E zFJx1Yoy`Ip008W`!GWQ~J;ZdqXG#2jKJV$*#LZeA9Hj+-l^abLsho4P5&+Df$%T=+ zNInl1V@et#!9*y{pi~oR0PyuQs1b1jsw0cgc)5y0c~aXzA-s4A`7G(#Y&6>H>b zog7nLOVV*DgtKo|DAhBxD(zIHh?s!}L=DnukV(}fP$HhesgpE{N#hbRh$>Je zs?uo*EPV#6mSH+fE5rT`^~~#c3=q-f^Ji@QrY}n6j0vr7-3~&=R6u?ctraG#Q7{zM zVo4e?x^4&IrkhEP8V=B)hz`>TF-$R?tB`4z$qW_^A}{45V!6sBV%aZ_pn-@ELHZxk{T8Ohq&hvK zLD$9;(fS_>3MAYIO}+S53HWP~lka}fx6^Q97?_qbgNWG7j51V3%r6ZwsE!AbvxxcE z$_-pAG!zXMJv?;V>w}zw%n7U_3v$e_ByX^YiYQL9IJzP?^!##1nIN;>G1xV@3g=k} zt(yG&J+>Cq)fk5E^?Z5$QK!wd?UZS>1{e74c{X;e zqSUF_zOFPpFS>crV9oNQU9POTj-AgAH+rZkqrr@MkIKW2mo<5Kec$z2+~!r5(mB>_ zdt+E({GRLrcuu$8qa&}#owe(aC-Xkvr3y+Gj%~ayTeZ9ja&B^u%#{=28R%RORUNCo0mLBw6{N@RK@K2e~@qKp|&#|^=>0i>07d$V-DAstW z;m0@Ehvhq~mJh#46AApvypG*0I@Drb){o=&D>AaRQR7C7?gQIaR=0(*k6pJf00bpH z4LiTP6dK>NHQG;R#>?Iv@lDA6%0l(y*zvfiBMCS7F^MGSrSoz5wza&F${$1yaf{p1 zpExx0j@a~n(#eYjChogjT6FgPme>bYd_2CS=gEolm$qcs^w+oB-*P&l(dm2qhI$(g zorG*}35$o}+dCXaDbCwcb6DVDwzmJim6D^j=yrD=J(P;%J<8H=+}L!cB=M;tF}J$w-i7)N8^)rC z&P#);SFgxSPCsOM)9k)eMzu@f-q8Hjs^x9Viht%Z7ixDUzc_5$IcviQFD`_ex%$Sm z0MA;Z^tqd{JeARO%t%pAHc;&2b zwhy`1xTpO!?BvF~u7Cb|#PVdOp>L?x#xkb~z{!7!Fi+~KnVXu^Usx;L z#w-Q}q55^Znmz>1`TH_jYVt$gc>Hu~=%$1J{JlPnW%_CV`|3=hbtWubpzK5 zUk2P;WE z>)h_9r;gj~iR#N=kZ=GaRmYXRYA|;ix2wJr68P=C)8D1U#V*WOI_?X)eP!U5hMrpi z%)Lrwwui-K4_EO89p&4MTX%!|&qeTL2Rem-ndM!ppL_3~>WwX|&{%sv2daGw!kfIE zza86BI*%2G+R{vVl PM;v$ErogI?8FV@yB-3?hT@{xXC}3^oQyFoFNY7YSVN4kO?)f05uLOyCx~0%hFo9c3(W z(LpkX>KbZj4Gj$$eM5CkeND8Mez1Rls*IL~mKH+80HLX;rlp0{)fk@gN_c1!iV9oGP@l818}i;6F30&Us^;){lgX;^S7k{n;{7PQ3y?Sja{w&A`C?T zLl+erjrmJ>AQ};b35pED;$r|>&3|a4LUDLpOepSu!}_1c|49H~U3>d~Wc;^SA|wA1 z5remi1JwB2Apb3Oj7vgP5W*=a1{WKR4zh{^V9M=k6NR*l4)Vw2qFrz}%)fo*_;1KE zS~}_)GD`OT=rHWA63YK!N)XB)A7lat{HCp@simf=>7uEF)CGR^RW!7b8XEs1wZ{d9 z1t%O=*SG(kANc<{|73I+kY4_n|1qE4q}vS&q-|IX;I4$f zbHX|3?B7?IFqyyN0O^n3jc*e;de^Z*f$+bF!~Vw>_!ryw&>(>6|H0k=B8$NVdB9C z3J3&uIfk-uA(Ssq$CtZ(xzfKnIAl>E2)$F8_bijsii8e8)a4(p4IR-HNB54rZLYn6 zxp@{%Bp$o`?9u%R6y#=|`yE;S>HtBM71*K?uMAg;+%eEbQuhA|o{Jw$_|`qMzNCxz zc{i#k=!tR9yy?2J?$TJ3B?|SYwE%05s=)}7;qZa~@@EpIFXLo2#j%wUM>*4pFf_*=jHvI!rOlwXzjh(rx&bhjtP=W z-Il_8Ji-OpL-x-KGu`%BgW|!<)#4@5j;w;~mokn~e5fh5`;-V)rmZS*>Kk7^+#=*)S5?voR%K!=(5bI4xn4nrvH!(Ilq(grW*q{`z{VlNK6z|Cc?5AUmD2u+YJ zC}zY1!eN@6Ew(|4ep9f-_x2tqs4Bxc)#y#xt^!=3#3cY&Kx$wTMqcokiM(*^N&71+DLV7@lT zA#OatGFh2m6(D)u1TQZ5A=dyf&a)|zq=mSnc)3rORF%>kwe+O)^LNBcm;l{yG$iqT z6AMu3>tjK2#Dr!i|I3_AH+lQsjF%MpyF%MFWy0YWVerzOvKKUU+PQ~lz~GAwXF8e} zc2?{L+PEjdO%Xkle$bqzbQ|SCQQGm0rRuVai-5&C)Y1oN_aCODM`qC5%-D5X5uSb- z9_#(fzclbmnH`bKzAdYfW+Sn*wWFmmKwP|nQ5@QQQ_`Q9r}^2a1{(SMAF+=?M8Sv} zo%~^@oGq;`+!(|I1Y0IlgDpI!M{Ceii6D()Z@7|UZ$TU&wO0D@x7Ca*wUb;lh=Bx+ zn^t&T^kERpC%upInBq-}w2e_B1jQtRYywm!swf94BSLLznN-jDgUq|om;9V9m^xmf znec<&jA@d|#E25XOy^)3UcnHE8)7#NLQ3h)A`4?X#7PNbsOIs2W1VJ~7SA9e?kqZj#1(tnWFzi$Ev zcq+m}X=s}0@)sZyW?Mhm&jeB2-toBUt)w#B{Ijv2@bey>15eeB{uuIjPmp)GiY%+j zpdPEW^LrWM3+~rlz8$Buy|cIdB1ry96Mn>F)Fk7SFGRUFr1A5^DOT-AC&rZdAdph} zJ|NSg=AD;^msg)7ISv)`K5$*IyDLS(a-Le4yPTQhVe~G^QRt&leTsY z0Z2c>?o(%!DY~?uN)xTI6g!5A-|6MsEmZoO25NI5;=RzSFL+y}b6=PtXUpwdl=Tc~ zwfM1TPJY7doKfw%PZWR#X^41c zZ}UP6+%m4cm=n7R6a90u{+B?M9($iT4~kk=(M^2M(|bq!<&YP{-;al-!;j*GW>EgA_yJN4D!8 zR!<~|7)U-s0Ev4wvm?=z;{q3~2wTH*6^tgvJYTOo-IS|LF{IQmOrK?Bb|4)%u++J^ zxrtudE4Di0EyL$kphTQSJ-h$-QR-Cm4){+9UO3fzu+Ny3?Dlbbt*ZM zBw9Cbqd$Bi9+I{vHMd(-Vf*KSrW!%=+xLzfPSj5sEk@t)d!c_JDU@$nnr z+nmgfuWYXE{TM(Yfj7NH9b3ZJML!&$FyTw)sDLT!a^l`g@P6R>S%9rM`j9lb9Likt z%GZS%h)jdL5_#yaD)J){pQ%eUo^`IDonc3s`?=`nl?W<7TPTP-WpxxSh9XV>*C(25 zjg$%M(wY)MAHmn(H|DRX+DxrIb4*M)U{+$K7^t&%7}KrN5Z_{Kfc7`=lWYg&nqUR? z0sC2rAi2)p_s*IfULH!}-+XSmFB=>Fjf<;#=!&%xK|GE(?yX&cE69u^#}8L_4Divo zky;_Z?ru{~p*QqG9`+9ZEQwop5Ty_2?UeXy88GEs`Q3c@?NAEehC);Sg zQm6i6yO`-uli~f-XDMJMyz`oB)BzsvFpeg|+iMvr)nzn_2SZ#b%DMJz(Xgt=>Li{N zaR(R-WS9$fDtAd4NM$$cSWaZEpJ2=_DClX383=ZbpBUER=-yUQbDV3+=_Q_Nt#{}2 z+W+SWP%%fenD(t^K$-gGI>uNoHrZdFkF6QQGfOR}K_$&1#2=5ffi>Wd%B-tpJj16F zjhAbC9&jI*jqUu#X&ov9Y+kyY$z0c9bS@|mhfKKao9rg` zGjv+#)kTl=O5t!!u^*wANawYLI=?oE&({rIIU!_1h)6fe>nZ=fLLpJg8KyO7_5J$$ z=)j^@(6Zpk>jvTGUS}N;?u-D+=<`C5wY9$Nms6h^CM6sGbL#>6s7C0w>b&sKUy6E# zF_#ZmO@}WON=lypsmKhM%Es!AaoqQ0{ZNEho?5U=zr(c>X+B8#J)3@s1fDA`45DNP zZ-3Y%>c6XX0ro+!gfs~)prXBvJ0cjb%D@O+mb-Q;-IlROXW$gaXrrfF-N~n$;FFwV zX$K9&yzvV`N-P4fL3(XFYus_!>zymP8WJ)1%(aup+w3H0rk=6lSrECUgg?B`iia)@ zPU0L*6-Y9|o^ssM+Ei!7ikYP)No(wVJ9OooV9)2!su1NX+w%m?eX`<@GZOra<~#3` zIzA~Fj0=@;yj<#SYxyYM85=9q2_J?hc&)N~n?qKm!VI~}^c4Oz;!~Km@MK^4yq7bI z=Lk-PUMFiH-RGc{m)Gh}cO~oZ8TkX|@#e3;W86eI34V?oPZstJ>iAp>;V)VHtW3E5 z^ytugpM|R&CAKCRmKl*5lIf>uf|Lnhqt*0i>?Q(n&HGkS+CnN{cC+nee@Zs6i@<(f zIg=;3LM|zvuDF&fgyYpK_CMKw(>Xn5=n4}~|IOhBz8&#tu#2zDKhS#A=#{xt=DGl- zVn8?7|Dl)Fvq2dq`A>TA_8&t)isk7gCAoyX^lL=rK%Z3J@)h@!D5k(Nsxk$dRuM~E z9b8rWres;q-LfuIZbccO1oYp82aOAKwYEN1ndVjN!@?7)?RtDh@1_>TpNr{Maa<@M zZ1Rsnz0;d1FOF;{p1$_IU|l15{mgAnc3h((TrVIt+`5N-Rz7i3_KVQUc==Mw=;K>? z6u0Q#5goP-D)bD>dDsDg(qW93z`O9t1s4MB8{heW;$rF^?k`Jjr&Wyw-);RQ z2_P-9s!}PpZD*7@TjnqI-!>RKSn|B^xk5pL?OZL(B{SZJfp%zn4%vxn zI1DdibFf10d2k14r}f@FNDcutRfK!byV#(P%qAplyew)HyJE+>HRlqdm)g@+U>o$U zzZQ~cFj_yLaQ6VY3u0LjK7FoYMyRBfkaBQZy354ag@>9{;9Rku;aL%$Z~Oiaf0yA? z%Z;x&f|={?_mF&yBtK8ok&e9^mzmW1pGo&48H1UKIDr zs=0VB5(nZ#j_{YvZ5pNWO%$DNcwf1|Seu-Ygf`*<@NXZ&9=)$0%Xf$s6BH#+X8>rn z==DW;try%_Qb!r-KVL9R4t3=iMj#kTo}@gTnI9AZSS(V&;E0wMfe+uHJq8fF^h-L# zl1eLLEnp>8TVvGjU$^?bD*d##fJk8RM5|p2254 z&QCjNn#>}_^F3B!a+^b(guOt{NF_+@V6wgS=hTl7_~II7*Uq`18eT7{wO>r3*D=-( zIg$3hofdj|KP|vB`^=PdPf4qE-d=iSx{2iC2?}l@2jG5$;h&4_3K%T+vf8sE!`$yZ zreH8~poB?C=Ifw_$UeH2$1r(OKR^I1R$91^5}u1ZbNd#}_EgsTX-u&#>U)G3tJJbW z7N$EkD@kr5iYq=~^WiU?sM)){=!iZrM6Vj)CTGQq_!;FQk#A+3_7@{Z77BkX_tL3G z2SVo^LmpW2^1q}DGI<}Wwmo&wf3ynoDXw3^0WVF;1z|Mpvc_em<1B(B6N#quFO6U;7(PnBtyzi6dp%j@o zl_KaMV;Z*b(b0yg;-rcw-AbloH&pk7XBf*XjyO@%EM3&IK?z1|E;5^!-e}J`2ZRB? z*$P9uk=$a*OVKBo6h(x#sW_d`mI!Au93d=TpW-y7;$k`YCtR&1Z*fOBz-oH3DyQEf zf`3(is>&LdE0*rdYUfNuj=XctveoQ%U@M9zLcFz_!5f^o_)53ux~^41Ew-n+!Q`^D zg-xt8GQvj)*Q!i>O70|HV%mW5HR&q!M&Eu<;#1ss#D%rkq+1f;x#ZaUrS>D7 zv&EGR@4LF@ZmZjRj?YRzpN+TV&!6QdORaZ4 z=3EKL6_av%ao$#gb zV7kT*zThWRqxV%gY=Tw6OF627=Vlu^uAi{{T{pAOMC^acw`EtYHiTeI+DpccL)$>%^Aw&L`Ekzs2i4~t5(I)&< zBWjhk4P$REP?RbxiMbJHl7_3EC&Dx1OPwpS$`|u&^Kua}veM-0BT(;xeFD0o8X#qq4$M zvRHM})`hj*S3eL1)Ile2>G*~p*PScYMjAcmqx*((kbXE)kcm|lw9Qg`L9@%9(_%Tqr(@(UORyAOKCsQPO;0H(f9Iy~J z%*x+G0!tMJSRbTg8)A$T&)dr*kl=gB(eE20)0Hn66`6ym%A$>}T)~p7hTz*Bqrr@r z#x{!*YM1b%!TPa!hgeii&_Gnf4>!L;=cYmw;4ok*wDG?uj*|EG{20Fn-{@SyWyQU6 zi4p;e^#B9A24KlEf=r3MnKb5*ZnQ{dH9uSNr6ka%F!0ja9~Fzn9OPM-`xfu0(5MdQ ziYE&~0VOWHeRH8nhh|;wol@Sjvb8ZCvV+(a9Ht)C@Nf@dsNS{OX)pcmMpI&LbuI>8 zKf$wc*|~|E=$35>tmL40CKZQzvUEzL>{rJ43G;JBk?v ziqO?OjE6Xry$Xi4&5e!iOCfT7Z6vrc;+vZl2HgVCwR5mzz} zk`~pt9^3B$|6YYdj&)u-2Y`V3qS#UpD^Twecfd^xw8c&m4+{lsXHz+WN zHDQnu$Los4{L7~zn3L>OhqXEM%=ij&^u9Z=sT`#g7Of?MXMi23leKRjFx$GsZ{cXC ziVrd0N}FZm(SC3WdUMX@WX*|0{~6EeibXXDS1Bzl2U*`tpqeUt`0U;S(HJJ(vc2I| z2y8*SFI)*+I64WSGNs*eOzOX>2wpcB6HxA~qRbBHa&x?|h;UW?B7~rbZ!{-@oBQUU znv`gT^8R`Hcy6aOYT@W_z^azXGbAZc@@s%;iFd({;pFF@v>yk^{P*cNM*Qk6ph9w| ze)9Su%v1^=cAA-OdZ^7Zev;HZ$gv4}ydffAT4|FmC$ZGc$2`~W``B4puap;GdUS56up618?cDsxZum`l}~96ezJO( zWb@Cfs+8OlLeL_*`Q6yb{05qp&9=8Bj=nk7tn%{I!qIJ@EvXQY)N)JM|DJ?TOtVTU zw+Tr+E6HfQA~VHTA?CKn;qUFAnzZ4S!F!>gJ&*`Ul5F z3zpXlUgSRE-p^OJY2)W*J}vxu$rVDgDZ8;zSlGCNVYX)3PE_z**jKj+BSQC`l$p9r z2E2AF&_~E+Gx(<+=>>=}RyjGNcn{FVXLT&$AkD1un*{S)-G}Xdk+2N4^n2;vkZ{F> zj3DRF34NaPKb~QlanKKi(|n3fdg#1;-b$1kzu|jU0x|f&b6cc)kKsYla#484`S~(o6JCY!tG$d3HVVkkeP*d_; z77sB}11v=_z8x0<5HKI&@gs-}SdK@MMiAxF2M z@~dz`0VQ_UP*b~E|EDLT2WYT+l&lk$BDjq+y!j6g2l%?8^L%1+ShDI`g*na zOOG>|B216cd7?`4ox(o$?U?wWe8GWG26;gtJ)U$;-tO!@f6;caMRImGjfm{zXI`HY zFy8?hDdadxZSvg%ouClM(xL2VP6VxsUeb$S6wh3XK}AVBnPz3!q-Rx&*T>3|TI9P_ zJXx70p_{3AfwuPkCt!8HZcpHk38soh6A_Zd1u=)Hy9~1Wl!+f0twrW^Um)(6g=j*(Y^JQgqtZB(2})xR1cJ z?YRfsIB``b&|s~(wN9E1zPq_`_=W*=Gp#-XFSmAr3kHuX@T=4MwmQ}!X0Wep{YF6? z?X_?Rs5>*M}TsGKo8Q54Z$jO zs|?M9a=}2?E8mqZgsb>U`AGS*V6CTdfN-dbU1Nz+DTOqp;~*zXd=}KHZ2WQQ&PqlT zPE0Q{%>ggRdnhACJM2-X&K#PiNm|*n{_dg`En!V0YtuFdI1_Ltnap%li-%F9XpU>X z98;X@@UII6De&J=wv$7+FnY%MQoxk$c{V{@?@-eH#^ZRoLiapgT~VRwymPzMlSqCrcfQC|M z$y@h~<+ZItNtvpB??j zM{vUqFK}8zXhV_(ViBSc3GpEIE2bi8eCWrwM5giTB*4{y>gnwZ!h$?(^qme1WNeZ~ zS@L#?_QwU5VdVu)nB3>>PP!4qOTwK(ckO^)zWyQTj4>JWPH@mKD@%$?>hRlrSbiir zsm%uc!-QQNd2ew$-vpJU&{+aM#R>+_d`Qfv3)Wg%(q&tTX6*-W<(Yg@&uXV+(9ZMP zjBTI2Jyi4{MqIda#aiD#b&m8KQIlL7! z{8KHGCsxyD8*vhBklJ0SAJm4rH1C87jitk0xxJ3Ygbu!@oM4J?o@RPnPoS~;I37Uf z2F%wdTOuQR;wY{Uw}>+`NvE1GHsN%m4(m-jXw@>-Mx~Rql3nm}`#dsDh)LqmuXo** zdU#cP*%xP8wmkAp!f?E;^;;y}Ay`@b&|P+avw6p4%eS>{gD+>=`M1Hz{F{Mrm>^m6 z$^PVP-xHVOLC7wd33=Wm~msYgV-pVHh*hm}(8u!Cmf=Lg`uX(D=OG|;C6b9qu zEvaR-AKgLH2d48rPeN(@&v$@x0pOs|eky^IcCq+8?64#Pttey-xeo+AmlEOqIA_`Z zSpGPMZ;fV5#%*-c<4%T-KM(y6?I3jKb$VogXUQ{Fiqv)Q^W9*jd}r3&pev;(K(>6o zY=6xcpMLr|^1kZ=AI|G!Wa{^HLgpd2dyDoSOE}T5kh{fEmL_WmoIdr8QA8<+X|$ut z&5G%#DAKm^ugYA^sh+C+{^J9;VXb`MtQyclQQT2bJ%SGp@Zbc52r}jEQnvU$Z^ck& zxH8wGl@D;@NNs&NEHBXh-lE!LomU}z{_{BLJ+9B%<<6X9UA0NWC=DtSyBY1IW!t7v zT170HI8}ZxH%?Anko=`pF-n-F$yC=|T|dOy%SvKQFnpff$aLdEuTv}b?6*+)*x2~A z*;bnSL!oz>`r*5bE5EtGHY2H$Mcs|EZ`bwOLpC*7N-QsoQ7I2+i%#%yh787!?Z?n) z6{D96(S+6qIc7=A=Qyh*kCh6No$A3fdvY%^xpr5|%d7b=Bw}!hyLl94)l`PKhapq=~ zh+h*3pS@)88z5AjNg{`W{bak4&AQ3}90IMDeV?!W$hWNQ?`(JXbx^N@`)x0i{B5>hXNH~SAZpM;n8*lAr+WZ5K=+tAn?c{ZlXEu zq2stO@YhO62=?Z;^Pk)Q48l7tJcm0PjcS9zV0F&3(KChM>2z8Tg5VMWt^we40=8u4 z86rLs(c+YYWP&9t*L8=8*pCHV13(C1<~kyNjQ(Thxoz9+PN%ahbAVK^Qc5zrHyH}- z4ghA!tc)5>X1GyM>(di<%ybDBhk#*`l*wpJU z0Iapv^)m8i1yxGT0pJS&WJD0dJ9tzNGu-w#$2{ELX1F9eoy4RgWf z8vO%+w*^avM(QOIHC`xVaj(llseRvHitSmJ)hO$?c?T?t7q4+>9(i}KtP+tYF!LYJ z^O7Ac3=;>-hTj12Y`J~ke?Y`<0FdbkNy`kc05cCf&l3esUZ%520=W)&05%dyzpb7l zdAzeB;@7pID+sO0#tU*B9n@C-i$%2`0)7(d(Mx~({ zjpQd897M5&*1DAi&m4V>Z1R$bf6J&N-Yb3{*`K_O@~NAw*NAw%*=**n>(0${nef74 z&-7R6Ff#BREx9s?IMZ6+McJ8oEf-!0jz|*Bah&i@+O}QW?RG22ah6$TQv@#!KKWh& yKpy;6!E)FnJQ{~y9h`vIqkjJ;;IuNm8~8tli;6B5|7f280000t!%h!O+<07)lD zoF{)Z+%r*O{)|$3N98XdvZsR$z!*5Vz~6|G9DT?DATGOSAb|SY0Y1Qoc-))f?TSYQ zMMb~@f};Wnu!IN_9}NKL1Qg$mAW#CJ2@&CuWK;r1?K=X+_xHkZHRyK;ZBOW*@mHM`V#t4$ zBFTTZ#cvS4cLFzpA>jXT^Hb4#QIvZOk-%5prwB(a_$#Z=c#-Du*zEy;lf)>4>ayK_mibEi&JRZ-+#@5zW#WLw& z@PpS&oSho4vpRC3&&_z4hOy=53yYBv5zBZ-$N8RT&*qh@(e7Ub(5BRf%ahGxD*N~6 z3eul8H#gq^@+I1IIo-U7k4&nS{<RW)qi`UFJXt*AL{ykcGgu~RMb(x zSI<90eJXLjthN>*@}?erj_ZhQDz-{v1(edtnwrMI^J(}gh2woN5YZGMT!FNx@r`wN5%63TnBYZ46XGTd$g(-JZMmF*tQ( zV&t!li}ecj!P54tlTJWl1YjmE}Cf~eokwnxQ? zD{p^+9fjGFG#hyS)9lPl?rPq~r?;P`SiwAPTVnRHVsoELgw_e?vFNSB$vVOft>p)7 zOzK@HdgW`xn@blN3kwTOpiTm$9cF2vvK;1xe-~R{Xlta7Mvo6*wO|-upfLKuAHD?+0ODsVVh@OxE!5FyoMUaLUabHk)0Y*Og1L}wvoPm_4-hm3l=_2`XM8>ysT_^DmvKH%PUIj z@snGbPUs`?AIEKb{9cN>mR>h$3qc}fYGaOSzgSuAFEH=5O)$~^-BUQ$pS;N#9X%Z+ ztI*LZNDw?6Ww@?+xiMcs(v_9M905vvwIoKmYnVPQ1hLQ6RaK2&UaXJ=-^I@LETM651v&j_|73O!dv$;~L#(zZOI!hgHq5=a0?`&<=jY)qS(CA?|EeMM% z*7Q}~1#KC$jlK+(%2tq60(U+xHC5RzmEGj8Xx^(Jv_V*1*_ z>v(_ApIH3czB?c#xD42%P}46sMeWqpFSW1zlUteTcgP}VI)qRjufXBx4&~DV6bFYi zuyx(Qz8OgWqdst&IlCpvVJ!WcH0iuj$qH>s%DJ=-VYPURmC|i+8#Q{Ap%}}N{gQ&# zUfS){DAN(6^%Nn88$eXo!<#QYVQVJH#^+O4&<|`_n7pfQmxgEJ5Pu9Hiq3xo0oo)k!8kJIHNL{IpCBc2M>B0NgLOq%eV?oX9gTEr zJInxgn{u-f_jII5W=O0;Tu(!H(2CY`K?;dP0#ZVu#wXU=Yl3Pj!v#!sJ;xsX6zV6; zX6dB!j=2{W7B*J&;|Aq|QNWB+;mBzUb~T=9ujc3_m+(KE8#WB((A><37~(C!ZaCG^j>IKq_n{=Q0YfKmA?F3 zN+)%f`9XwpFH*ZrtribIy;#!3y1yv+TXvQHzEFRbDb+~1*ZkDNJk5q%kk&OcsC<7Z z@y>vHIZ^OH{rRhk$(fn6$QZGyv69l#LfIPe{j|F~3yPX)Y zv#}i0vaH(kAL(hj1#OWPO{q?#kfX*6Y+hBAhxXMvQG@9k*oD0&5V@F=T*p^l+2i^xrcu>se0pl!sxl+Vr4VKV5TZ#c!ckwA_Qx z4-+%ch&mN?!iohxSd#jzeQxeBT~YYGOk7UGX-Y~wEe*4JXee%euo#!pY##)vcUCHg zwVjJS=eR3>p|#y|acagiQ4oXp&~{1Sm~N{8!TN@Ght(rh%Nw^|4jwwB+r55p@UlYT zg-6jEqV)T+Cv~Rfd~(6zrbPiQ;Rl9hZD4NE{*bqg&%_mT9m2zKiVT)%gi4lfSf11L zIeSMNb!C95U{EYN{PaQ5hSofGIoaBr_|m0P$`a+$cO|>)=*^#+N>l=N)Ye(`xvclL zJ+xv8J3FC=pKd=$GsiY>XHxOj(iuax&ivP*8gbg@q~1N3u#!j%QD!Zt@gfJX0y(dG zr_qjF!hJ@9h(9H532zIrb3#Hx%|Gw^v7n#fvW)W5D@sD_4a-xitgZC` zSx2dZEmhO6Ql4a6{9$JHc)-Z*P1$zSjQmWQq@<)~0{!s&^yc%MZnLl7k$LxVx~tr? zX?Rz{6xI#rR8RWRJttAQs<&&re|LtLe4w_(NMY*8~0)l}bBPa!c~umd2OLf_!H(nJiE~doFS9fbSQXrRU!H5O+nSSo6u=&JHLs={Bf$A!BUYNBI+CXu}lnUkFxj$z}U F`fp&+mqh>o literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearchClose.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearchClose.imageset/Contents.json new file mode 100644 index 0000000..6c46a07 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearchClose.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconSearchClose.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearchClose.imageset/iconSearchClose.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconSearchClose.imageset/iconSearchClose.png new file mode 100644 index 0000000000000000000000000000000000000000..b580f47183189347fb59f99eb9ea2561f44750f8 GIT binary patch literal 781 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9EO-XP4l)OOlRpde#$ zkh>GZx^prwfgF}}M_)$E)e-c?47?>7$x;TbZFuuKgJ5b3{qU~W@Q?=6#0RtAJ z8zN@R-mI;+Lj~Hi7uJ&24{_R?xh0M8YufGNx zZHdrX)_(Y*U2S2F<)Pk^mPDax?f>;_?JQ?JIAYk4^5o2i#7j0>E}iTr>gNBP5!u3h z*j~_H?<2$U$A#q&^WNzQ><4P>=097$`1iqt3(qRIzFNORwtfAl z*Bhf4Hgr6w{INia!9=-2-fjguLobJ58^0Q(gOSsehs}`;6FLMke2wcEkT5UcdS?aIUE)eHer3oGS|emu})5OLda;`N7vsSGPb4}Sh| zFqh$l^ugaB4wf>!kWxJK;b1L;Mz28Xj|Cew?%%Gk@vHo?_I>~FN5x77|2Z^%D!*nH z|J|ooD7)bJ2md?n1=0%+eejQQFOXdD2*`IU5MS`6)pXDHh!^XRhBoM}&w8}&YF@Y0 z9hMiLCvAEaK7+W6aW9=F*cO<&dPR9mTSlVbbZ2iApnAE<_ye6>_v~ zc*a!K!m)}`r%b=1e}UM6qSqbIIkXsU-rW8ub?}qbL;oe=o4k}`ewQA4pP{4tD0_O0 z-dEvu!gULGwna-M&T5$%ub#89Ax>c7wW=fAebx(ayR-L#+M&>R^*4#HPweElUN-lG z@4m|JdUN&P4gWuH$Y0+1;qJ#=VL@~dxG;VF+w!Yr=Df+k)XU)M>gTe~DWM4f4QEf% literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/Contents.json new file mode 100644 index 0000000..616218b --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "iconStoryClose_1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconStoryClose_2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/iconStoryClose_1x.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/iconStoryClose_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..314acfbe88f3532522fc6b392ec12b1f1399ccdc GIT binary patch literal 2413 zcmbVM3s4hh9$y}w2r6>o336xG039Alb~g!+1VThYfjc4*umsE5EV~;BB-xlO0xEi; z3I)V!kpq=-cp~U{K0vMHpb}IB#F+{{P^u@|lQ-~RrO z-~Ux2Ul}vcd5JRwLG$8brHSAlwLMOb;P;gaHWz{%+|*G~aw*NgF}PX>^MZUK$Zr>+ zRMrkXxNp7WW3kBP$%)pbRu4}%&x4lDwWe~@9+T}X!^|xf47L>8WJH2g+Bs}$y=dvS zSSg%?eOjwc06zSvNYLlD( zV3Wgqx`F*BfGKJ8IsIpFZ|V@X*ERd`#RsGvSNi)CJ1}2~|LSEe%`HAbXA~WLMA&`^ zZue{Q2?9!XS+gC$IsUuNC50Q)Rkek?4hNL{{cR@}>wr7VmX5&}7Qp6HhvuG3CzVR& z0;ODuD)mYyWvtRqnMqc6pV*0epN}jmo9pTs!Q){8{J-*t(Uq#(=f?`;cK1{s-mdn& zTA;#)p<&%{1^d_Rwd~K>RjCIRNs57!uc=XLU)PJ0J0BE8{3Bt9e21)NMU8JwNQ=h& zN5iNw#n^5wu?jo0yIQv;6w{vVzZ|!>n`MeF%qq;@8o%|$oQ-qty7#z$&lyA-0zOR% zU-3iP1)n(Yp1{P){-^z2R4Mrt`FZ#COOJXbtEvxr)L%HlB$}f-qblEf-Zm(B9y(7} zPVbF5)sWTr=;j0GM`v$@HMHNX>p^?EuPb_`SFBYJ7oIE|p3M$k!)@BD7I!pU{j~E~ z-`S4+eNCN*ujUu_#t-=FyzaQ>r9Inp|M}IJD=EF7UzhmTVfuAfnuZ4UufT)vJ#UoVXvcWwHw2>ho$5mdBJ{MG4dzLs&)PS{)0&&31>c8XLxt) z@nYkV;ZcsFxm)$^>4TlUvr;r^i`rgx4dy?(6TIoRAh+zh8TkEj2 z_@?VylEIwYBlQmsw`ROs6KEdV6lZ;U@<{9Pgtk37Upzn7Ur;pL^{wCJH$P1sFDp&y zq3!>6YYRG7|1A0kue+`<-j8n|AAj}TxCEN->k?DlRGJEAWR5;I)d)c@3vG`bw713s zf*hZzlNF3Y7B3=bEf**0bc&m&)dMsHg-i1EIFU^;a5|Nt)`?jot?evWO^R75K{8aP zkD@Zwu^S9j(uS4E#D;7_NU|gmaCn{w7|>D-4(Dk#I-@90%$l$(0vtb^};~{7$f(3JUJP|)gB*5UQ!vYQs zq)L=1eP_xYcoVZS8AdNcklfr{ZZ4lo8!`|~C=?li$bqceI>TaZ#l z!l2eOYFY=|EaK^O4kKoPU?*8<^)qI5#;Ht!oFRF*9>KV%jnxE@BxZ2>9D`=UIY}Ut zhSE|x#t5+33|5~>Gqf?2{x_y)KL5x8$gWH_RSD?Gcaj3H;ofFEgu*(t-VD0E@~H_Iob~ zva^qqMkXt^J*nz&{s5g@^yQ(E8x@Ta*5x;q-LJL+;LP(i7r` z4sG+1h3wPL(5uoa_x*|!tJ!&}UT!WoA>BmjwW2w1e+yWDkOpTo)KAT znHP_qYq{llCi_d5uCYtk(q3XmhpO%@>U7@`{@#x8w%WbLi#zsL=Eggw-5XP^e$4|c bUN8T~-aBh3>PBS!#Lkb4UMW4cLRt7vfYqZr literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/iconStoryClose_2x.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconStoryClose.imageset/iconStoryClose_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b025057c3d0f179067380a4367d445dc7598f2 GIT binary patch literal 2539 zcmbVN2~-nz8Xp7~1r=Ro70+o1eO$>*CP9*DWRbXl5=a9=w64uCGl5Z(2}wADSPh~q zqF4~ti(0xxt);8QqZI)OA_auEN+_bJTj~p_OR2k_*jCy9An@$I?$!T$GxNx?Ka!rw*!H?+KTdAt5vYWY7OQ3)v$EcR+e7E zZ2|hL04Dz!_w1hl-`XIlFF)lglzk*`xN5hn8U#KeeyiU&cj_EB=nHj&5Rue>4A=Ws zaf5)6(*{>(a89mzH$P`nqV{l3(Q*I$@7|om;e0d;4wMhUm!`wjXFi^CF_F}0G}ARo z4XQC{CTSuxzM5omf6Hg@;ogm*I|`D;Up z^h5pn{=I?o1J?)E1@2pOL>;T{KK+t+2=ntyxS=4C&`6e#XOz9^|P1=Lt)f z|5$K|8|mE|penULv^P^b$v*N*OV{Orwve~>ADL5esnV>f4r>Z4efvpmkLZbbs$w^D zF#OEX4aWwq-*X$daBa!a`s?MbXlqNCx=nu7vG4xO(*^ymfs5Djs}9n#hNGRIH=XFX z(C}eLRnzfKOHNxxm7H`QrUlWBky! zvrU!#k9g`+E!uyaJ<`-RF(GB0XYKdRJ(hvni?eTuG76qu3%S`n7}dk8zI*4wVdsT; z*F6@6^rYQ-P;u{gO;UVWKy`0+q~qb~%9@igwFlB}J~?6Eyu;OF(E`h+fPE`Hy@QY`|A<#4*_wfByJJ*02nQVwyV}c;}ne62R9W0vz zK`xK!IJH@=h>{YFj*pW}BE`?t82}oBmWE^+aAG56h7+kIS})@~sHx|`G%4dG1SwF3 zA&g3hXV{6 zNv%{R|J|rL@FwFVo6QC(f@EZ5@H2#b#+ZZ%BoYaNVhD!u0D@<-=*@U0PjB)b(;%lz zgpoFwX+{sT8u3IX%`D>pXJ193GmNX%n?^GQa)xB$21LL|*{DWs{mX3UH!nfW)W$3OqX0LZRFF>d2$ebMR0O_I8h8Zc`%oyVsCS|Nv$}yK=OvFcFUjKsq_vjUp+P(pixXe~C&k1+fr7pvaWnp3!6YHo zGDaN^LZ)?i5``G_NgQ}Qk;gLR&;so2@G7iBOmLfT$Z2A{x;Fa2pWC|$#59NLZGcj6o z25zK6lR&oqhlWCc`v^OWuOdPIHOP@~ug&ck94rHt9A8A>Wqg%Uda%EYU{R@ZD;WrK z+8QYjjZ3x;_B3p0M5pKC)xF#+tI;89RYS#Bj^gf5oChEGh8fKg!J=Iws;By<$tDP61ZWTUvbK{-;xUS6;9u}{g zKd&XM=Ld1T(vRMAdJo}R`kqVl@g_Fa*`VQG1g%Cpd;#JjHR zo6JxNpck1xaP<3@rxn{eerqYdWX&8HYR`Td5M)1au`|$hm!wY$Z@nhw(C&ruPnx`r z+<4oiFE4hGWhV9cS7eo~tiYx%x=pFP?na3{BhE^&qr zq2ht@#1%n(7Sf`S6_F|mMOll2NBfCneX_0@B4et@0lH8 zAxkaIXPRR$7|WnQUO4*RtAD1Lp#L2Kty=VDh6JurU@+Xb`UhKzN%;bUF^LdIMk%BC z%h{kzLIfb004Ay=2#UsFe0)_10B(SlH~}maOF8)7vI;y-3~}(Q8GJGy;ld(uV5%IB zNDYYuQ#XJt2=BWH=c8hy0wk~!z^Nn&QUzPZ!H>#iqhtLt36C3vC^vBMi}ea|QT#9* zS0;yXEFzfzlF4KolSQO3DIk>@4+uPQR5F!HB72c23kg&zo5o<%DY)?;9#trZ;@RQ6 zfN^!`jDr^`l?ahx$A%O=gK)D!E zie*xqULqinB`P_1l>#N^2}nUWh{wUBRujcyh%FE>m=pk{ z5xf{MlR&2k1O$Le_9C!A1{K|k2beT);yh0VChB85aUMd?QyEM$jR`RbUQ8N=K&L@e zf`Bf72@IG<2LupZ0C~X^=R@UUw7h_XKP(5Wf&W@KA!RXYkpc~#V!T3@0K)N6f_RbM zOg&9H6J~f(A&@|)Qpp55ogp9y7Qzq#fFLH748+IBQ$Qb*z8ug)xUtcgAkxP*jwUHP zP^@Q=GOjlQ-Z;qsH=37h0MyqT2M_8K4TkXJ%i{M$x6}LC3>uz!O-FWG<^u!ssz!aCs z$L`o=VC!H!muMasGh?sT9k+3XU#lkln*X1+kyGDb82CgGH>+{Oayt z9yCnPHTN`)HM*XyO|aL}Yc39pw>6ZdrPgkHZe3#kCU>OTu-II6?(Gi^mBmI%*FKNp z^2*n<<~s!!HgNJSRDV%Tjk3``40JtSaEu+Qamecpgc2=9ggz4_sdZyR?Cfbk;n1Ge z0>8rsok`^`Hvf5QeQGEKpExD3|8SPcuzn)&81$<)aER+Qa=3t1rSnG2+C$wASv6Z7 zGQMna+2oz$3m_naud{D)i(?K*Q%An-_o=Gu^r@@3{ZnX0*j|FEyJ%fMrKIC)H{>WQVcK9?7UjSa zY?Z=V>+JonJ3$*ll_n(}X17xg_Lq*3@4Q*|MQ4QLaQ_8^OTIN1Y3i@JErTWIs@Yyl zWYDB|9Ao?7NAegMT~-v_i*$qeHBJMI!k!@|x#I3(hP8er zVtRDTy&mss)AYhu&g;U>&%`JigJ0cumF5@@+NKH1NFMp}-3CnTY0r&i7HZ>CO*gh` z)!$qThu0ga3({8Sls?`=xL9WV)A4DBi`Drrm)CFhA>>_92p_%X?O);dw9%}2RbM$c z<8$+Hmhp_oce8RJC*3Myn!WZmBZ^n;@3h)uMp(?gtZC7O(~F7(!slGl{b)75?&kG7 z9{H*RYyVNN3;BDAMl4VqIeB1f_o?j94}0J$Y`VDy$6OsP?R}$tclq0`Jxj6jF+CKs zY5UU^ev6KKUYQHpdnY75xO*$EYx5Gd#;nDWOk!|S9)w&rKFg{c2PVVingWwTE66BWtJ zQ#Z#Kgd4w#)>Q9)USyRs=W46RH*-M~?ZMiv9X}Jb55rHGKYOUpwOD{S-N?mhZyZ&|+MTL7SHwLx=5>^gaF96zA<2&ehjKcz zu?r1O+g~0@ZTYPAo!he%zH*t_(M!iI-mabbmB-d7waf-4r7h_z837K(i+(r>5=7z!CrwnDAN!oF%wW-}Lq7+IO z+N7yQQ;p45iVba{H0mXl%cjUB@0l*1-S^q|wtwt-o^yV`^E;pK=X?LoGr3_Q{s!}x z%-7J+FbE95M}X@$>RVR_eD?dPE`W<3H(;YcL&JAceQP#oWE5#=Xpb=?qlMALbyymQ z1*gzCR0dqc;(}-m4Nor-mqJTr2w_x45|fPshA&+KU`#p=h{6z&M6NF*nHiADXOJ>O zB59eaGG=H!}4p*p~vkWNkrq#FX|;^^drMPsneDA=b902T7-iP#9d z-zRn88xBYo3b|MWB0W7Fo{old_(=$qySqCA>4b1{as&~Mf(*8hB64I4mVaizGXyj~ zlPhF$*f2FCh0571!~vkOAH864=V;l2Pmuy+h7eJ>2oxNt_UZ$WPMgDVH}lgzD5uj9 zj5G#|!4?WYENTwRP38zWf@IFWp`QEv2L)hsiNrY_e`*VhHK#%#By0iQ_!N*oMGGP` zxC}%DL%`Y0r!fdyKr@%Cz2Rbg`3#DX!;j=}(mv-Z?6b)*CucYkwu(rhG1+P-?0+Z1 zz*B?_902AG?TB=BM7c$xP*@BS>+G@`iN+$4AE87Jotc>Nr%-1s3i$^pST}Tvkn&%_ zbQ(61!)H-ImzgX|5(B|yCjqdzKw^D4X&gSN7_<)k!3rV~8^{(2DQp@e5RU^uui;E4 z9qWd6qf=d6>5gtRB+AhlLvwd@N4ruSsfjLBcMRIa)j5&!Ssu@!ZC2;@vpoI(ln>=I z!SB{)j6C?)j(=Lq(`%nj13Qb+#IDn>3EQ1bwI%fXm2z;bX zPiBCm{~_HUVFFH~FrC6@_#}bR`X34k0h*6c_u@xS5dZ4rhi|{@+s|-t7^t^%g9vH0xWMfT-}yzbhslT)igDz2DFd+a z*8Z(ayXSR9l%#(jJisctJkdg@QR^gx4LKBk&KZ*+IZ$DHH`RJ({0TmHA$-G;CAHoy z$ZLJin4{Zz=P67q5#dBoCc0_%);*P|SI}a1Y}2mGp~B@0H2V|>SMScS94So9BUzhQ zyZebPB_#ZNN`eJ9o@RSOQ@`CoAkpjnqG%Q~646^!Ilnl+%li!)QjphuU12FM1!f_= zs!gURqHeb@8F;3A+w3J?Exyt|CSR^-kjNDW#aXHg_cb4z$#9BrMdg8;?Xhch(a+JY zJGm^8XRNPoaO%WR(V}Z__BM{cCN15*vGwGO?6UQ-Wh!X$$d4;_avLUc$a~-QOo4`f zn*~vZUBW64`MVPu9?oE1%Py$=O zwpirxGFC@!gwu}0zkF31&+FE-xc|N3QZjF*MhpeEdxXC<%@?E5H#>B*gLCOFJ}WWCl+grLtY!pwn~;aWn^6~@AM89m)$$$xw$r1ba1+% zxlFsnmT#zGZ6@nCF8g(Izt2fYWy_kq0z87>eMB_HlYTgmRhkxv}-p^x3M;d!2j4 zeP8bOnAd}P7eYN~*HqQkplCQB-Uuw%;Y~c3Zs&Dk59I#gB$FY?oyD?^3Meq{sxpbq zyC-?T+INmpdC9v9^5S`;VU-marBLW;|4{8IJ6@}ElZDcM%rvO{x;Scs*;!Lt%eD$- zQUCQzp0lfZv)W(#hjmCB&B>PvE2dKRYhGC-y9=o?8MR43Gq0YmwB|5!E-Lou+H{lJ z3LiUTq>@W#Ro$^lcMspCHv>vv+wktZU34w1sXlL8P|r0uZPFoCRx%+xHnAXc za#!Zy0mGA~GME1J^dl{n^Hd^5BESK0T}b;|tk zpmJHx=`P2uxv%#00NdA0+6T4>HtF3qlIa;)n~YM|jaSv$JqRksj8>n z7eEju{p+L?dMCKYYQ0NGDO9h}yoUS<^WG@H)lOvse5E@gELyz-I#@7I5-RPsSCH^S zE^59)<-2?K`}0Ib4q^S<$Vx+4$g*IRjp{~uKfp5O={vW)TRvi0WN9+$LD;4(s%+j^ zuKABC;PeuiM=p(QU%bdXSuFEWF4hb+mWAZ}>Yz&Lq=8iF)pxGiB-Ay}Y*LolsRo&6 z&P=v~r!OJzZTbGviG@a9VM^=4kqIEWd?@_7!SSC*%X7jod6@<22F|cml0oAmq$ha^ zlEJFedK-K(S)rkI-aQrO`X>(f)sqLYjk@O5TZ_F*A7x@$4mExG36hJnWf!j`>-Hm=zJ)`t4RhtJao@*-P^SiAJ^j9oy|sr&NB8%XXiz)@DnvGBcZ$;nnzJ_P&z7xg%FwHNXC+!+Oao0nH!aXudw~#Fh%M7;pJU#D~ zS=j#Dp=@bzB}v}>LPASj6&w0R@seaGSCcYv<^y<8UCD)>Qq|hAhqWC8HpcbDP4P%6 zCM@4w5!GtxMYLl)KgUUsI-1;pGAC@JkQx4m>sQEpL~R@T{pVb zB<2uH`DB6Z)vDI|yT{D>-$1h+!t(bRjlT+SFl_CMepPEC*LtvqdZX8+$jf2|{;p-f zDt2nu53og^o$!dM$)^iyj!x#r#1#x(u^RdxE{Rzp6C$fi$23$(a;(^_d zi5}fLDZ41D;)3@47elax8Z|OPRv|QHcQM{lx;1!Kj+YE7AedWeRIfIs^10=WdrA6G zk0uD_ZkozNrv?wl}Bj+B$RdW;#Xk_b#Je65I4^E9U1;sQ+RH5<>8&*Cy=v EC!;4H6aWAK literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/Contents.json b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/Contents.json new file mode 100755 index 0000000..14a2ee9 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "iconWebKitClose_1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "iconWebKitClose_2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "iconWebKitClose_3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/iconWebKitClose_1x.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/iconWebKitClose_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..a52f5eb93825e3b4b08e5a3a97b3745412cb7fbe GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+ia!(h>kP619lNi|!81T5>SM&

+o^be3dijj`cn6ew?!Obfdt>Efq?K9H%=tdh|Z> zHffd67w?7tu6#A|edTjeHgd-*4ncP1L&+R&OV%j=&95q1bGUoAn}70Sv%dVq ayts{5T(${1MLY*Ofx*+&&t;ucLK6U88bxma literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/iconWebKitClose_2x.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/iconWebKitClose_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0369a905ad7dd1ff7143fe7a9dd18c2bd4829f15 GIT binary patch literal 253 zcmV_Ti4{Y|SeejaW~Wj_ zg;A*N%*cGG*H>7$W1+Ow8#0O9emZXy3ujxIN#Ixb<8_4|uPe^3Nd9q0@f7=S#Ls@qQ@H|y5biZ4@U6|;+oCxd00000NkvXXu0mjf DO`2ya literal 0 HcmV?d00001 diff --git a/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/iconWebKitClose_3x.png b/Pods/REES46/REES46/Classes/Resources/Assets.xcassets/iconWebKitClose.imageset/iconWebKitClose_3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bba526c5de6d301a894624376b2f30fe81a7c86e GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhaw{&~7MhEy=Vy~fCP*nz?2V&fLe zaL%1MQ$0+X_J#@HxYUuv{fFo1pPdJodxE?)mrnV&(XZK0$yDm9{PD<86ULy$k*?mZ zOmmn#q?gxtOmDVm*i!gyuSRA-AmbAK^!vUm!h(I7=0x_UC>Zw5Jz`mRNwR=v$>wk21zf{!z7VpKQTCK}N>G zs94RHO=#D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/REES46/REES46/Classes/Resources/StoriesView.xib b/Pods/REES46/REES46/Classes/Resources/StoriesView.xib new file mode 100644 index 0000000..374ce09 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/StoriesView.xib @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/REES46/REES46/Classes/Resources/StoryCollectionViewCell.xib b/Pods/REES46/REES46/Classes/Resources/StoryCollectionViewCell.xib new file mode 100644 index 0000000..db2c3da --- /dev/null +++ b/Pods/REES46/REES46/Classes/Resources/StoryCollectionViewCell.xib @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/REES46/REES46/Classes/ServiceProtocols/NotificationHandlingService.swift b/Pods/REES46/REES46/Classes/ServiceProtocols/NotificationHandlingService.swift new file mode 100644 index 0000000..7d4ef88 --- /dev/null +++ b/Pods/REES46/REES46/Classes/ServiceProtocols/NotificationHandlingService.swift @@ -0,0 +1,17 @@ + +import Foundation + +protocol NotificationHandlingService { + func getAllNotifications( + type: String, + phone: String?, + email: String?, + userExternalId: String?, + userLoyaltyId: String?, + channel: String?, + limit: Int?, + page: Int?, + dateFrom: String?, + completion: @escaping(Result) -> Void + ) +} diff --git a/Pods/REES46/REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift b/Pods/REES46/REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift new file mode 100644 index 0000000..ef83e5c --- /dev/null +++ b/Pods/REES46/REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift @@ -0,0 +1,10 @@ + +import Foundation + +protocol PushTokenNotificationService { + func setPushToken( + token: String, + isFirebaseNotification: Bool, + completion: @escaping (Result) -> Void + ) +} diff --git a/Pods/REES46/REES46/Classes/ServiceProtocols/SubscriptionService.swift b/Pods/REES46/REES46/Classes/ServiceProtocols/SubscriptionService.swift new file mode 100644 index 0000000..0f40e9c --- /dev/null +++ b/Pods/REES46/REES46/Classes/ServiceProtocols/SubscriptionService.swift @@ -0,0 +1,28 @@ + +import Foundation + +protocol SubscriptionService { + func subscribeForPriceDrop(id: String, currentPrice: Double, email: String?, phone: String?, completion: @escaping (Result) -> Void) + func subscribeForBackInStock(id: String, email: String?, phone: String?, fashionSize: [String]?, completion: @escaping (Result) -> Void) + func unsubscribeForBackInStock(itemIds: [String], email: String?, phone: String?, completion: @escaping (Result) -> Void) + func manageSubscription( + email: String?, + phone: String?, + userExternalId: String?, + userLoyaltyId: String?, + telegramId: String?, + emailBulk: Bool?, + emailChain: Bool?, + emailTransactional: Bool?, + smsBulk: Bool?, + smsChain: Bool?, + smsTransactional: Bool?, + webPushBulk: Bool?, + webPushChain: Bool?, + webPushTransactional: Bool?, + mobilePushBulk: Bool?, + mobilePushChain: Bool?, + mobilePushTransactional: Bool?, + completion: @escaping (Result) -> Void + ) +} diff --git a/Pods/REES46/REES46/Classes/ServiceProtocols/TrackingService.swift b/Pods/REES46/REES46/Classes/ServiceProtocols/TrackingService.swift new file mode 100644 index 0000000..1984d6f --- /dev/null +++ b/Pods/REES46/REES46/Classes/ServiceProtocols/TrackingService.swift @@ -0,0 +1,11 @@ + +import Foundation + +protocol TrackEventService { + func track(event: Event, recommendedBy: RecomendedBy?, completion: @escaping (Result) -> Void) + func trackEvent(event: String, category: String?, label: String?, value: Int?, completion: @escaping (Result) -> Void) +} + +protocol TrackSourceService { + func trackSource(source: RecommendedByCase, code: String) +} diff --git a/Pods/REES46/REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift b/Pods/REES46/REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift new file mode 100644 index 0000000..b8c11d8 --- /dev/null +++ b/Pods/REES46/REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift @@ -0,0 +1,97 @@ +import Foundation + +class NotificationHandlerServiceImpl: NotificationHandlingService { + + private var sdk: PersonalizationSDK? + private let sessionQueue: SessionQueue + + init(sdk: PersonalizationSDK) { + self.sdk = sdk + self.sessionQueue = sdk.sessionQueue + } + + private struct Constants { + static let notificationPath = "notifications" + static let shopId = "shop_id" + static let did = "did" + static let seance = "seance" + static let sid = "sid" + static let segment = "segment" + static let type = "type" + static let email = "email" + static let phone = "phone" + static let externalId = "external_id" + static let loyaltyId = "loyalty_id" + static let channel = "channel" + static let limit = "limit" + static let page = "page" + } + + func getAllNotifications( + type: String, + phone: String? = nil, + email: String? = nil, + userExternalId: String? = nil, + userLoyaltyId: String? = nil, + channel: String? = nil, + limit: Int? = nil, + page: Int? = nil, + dateFrom: String? = nil, + completion: @escaping(Result) -> Void + ) { + guard let sdk = sdk else { return } + + sessionQueue.addOperation { + var params = [ + Constants.shopId: sdk.shopId, + Constants.did: sdk.deviceId, + Constants.seance: sdk.userSeance, + Constants.sid: sdk.userSeance, + Constants.segment: sdk.segment, + Constants.type: type, + ] + + if let userPhone = phone { + params[Constants.phone] = userPhone + } + if let userEmail = email { + params[Constants.email] = userEmail + } + if let userExternalId = userExternalId { + params[Constants.externalId] = userExternalId + } + if let userLoyaltyId = userLoyaltyId { + params[Constants.loyaltyId] = userLoyaltyId + } + if let channel = channel { + params[Constants.channel] = channel + } + if let limit = limit { + params[Constants.limit] = String(limit) + } + if let page = page { + params[Constants.page] = String(page) + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sdk.configureURLSession(configuration: sessionConfig) + + sdk.getRequest( + path: Constants.notificationPath, + params: params, + _: false, + completion: { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let result = UserPayloadResponse(json: resJSON) + completion(.success(result)) + case let .failure(error): + completion(.failure(error)) + } + } + ) + } + } +} diff --git a/Pods/REES46/REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift b/Pods/REES46/REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift new file mode 100644 index 0000000..9e20284 --- /dev/null +++ b/Pods/REES46/REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift @@ -0,0 +1,65 @@ + +import Foundation + +class PushTokenHandlerServiceImpl: PushTokenNotificationService { + + private var sdk: PersonalizationSDK? + private let sessionQueue: SessionQueue + + init(sdk: PersonalizationSDK) { + self.sdk = sdk + self.sessionQueue = sdk.sessionQueue + } + + private struct Constants { + static let mobilePushTokensPath = "mobile_push_tokens" + static let shopId = "shop_id" + static let did = "did" + static let iosFirebase = "ios_firebase" + static let ios = "ios" + static let platform = "platform" + static let token = "token" + } + + func setPushToken( + token: String, + isFirebaseNotification: Bool = false, + completion: @escaping (Result) -> Void + ) { + + guard let sdk = sdk else { + completion(.failure(.custom(error: "setPushToken: SDK is not initialized"))) + return + } + + sessionQueue.addOperation { + var params = [ + Constants.shopId: sdk.shopId, + Constants.did: sdk.deviceId, + Constants.token: token + ] + + if isFirebaseNotification { + params[Constants.platform] = Constants.iosFirebase + } else { + params[Constants.platform] = Constants.ios + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + + sdk.configureURLSession(configuration: sessionConfig) + sdk.postRequest( + path: Constants.mobilePushTokensPath, params: params, completion: { result in + switch result { + case .success: + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + } + ) + } + } +} diff --git a/Pods/REES46/REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift b/Pods/REES46/REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift new file mode 100644 index 0000000..9a43cd3 --- /dev/null +++ b/Pods/REES46/REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift @@ -0,0 +1,40 @@ + +import Foundation +import UIKit + +class PushTokenNotificationServiceImpl: PushTokenNotificationService { + + private let sdk: SimplePersonalizationSDK + private let sessionQueue: SessionQueue + + init(sdk: SimplePersonalizationSDK, sessionQueue: SessionQueue) { + self.sdk = sdk + self.sessionQueue = sessionQueue + } + + func setPushToken(token: String, isFirebaseNotification: Bool, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + var params = [ + "shop_id": self.sdk.shopId, + "did": self.sdk.deviceId, + "token": token + ] + + params["platform"] = isFirebaseNotification ? "ios_firebase" : "ios" + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + + self.sdk.urlSession = URLSession(configuration: sessionConfig) + self.sdk.postRequest(path: "mobile_push_tokens", params: params) { result in + switch result { + case .success: + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + } + } + } +} diff --git a/Pods/REES46/REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift b/Pods/REES46/REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift new file mode 100644 index 0000000..23da572 --- /dev/null +++ b/Pods/REES46/REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift @@ -0,0 +1,245 @@ +import Foundation +import UIKit + +class SubscriptionServiceImpl: SubscriptionService { + + private var sdk: PersonalizationSDK? + private var sessionQueue: SessionQueue + + init(sdk: PersonalizationSDK) { + self.sdk = sdk + self.sessionQueue = sdk.sessionQueue + } + + private struct Constants { + static let subscribeForProductPricePath = "subscriptions/subscribe_for_product_price" + static let subscribePath = "subscriptions/subscribe_for_product_available" + static let unsubscribePath = "subscriptions/unsubscribe_from_product_available" + static let manageSubscriptionPath = "subscriptions/manage" + + static let shopId = "shop_id" + static let did = "did" + static let seance = "seance" + static let sid = "sid" + static let segment = "segment" + static let itemId = "item_id" + static let itemIds = "item_ids" + static let properties = "properties" + static let fashionSize = "fashion_size" + static let email = "email" + static let phone = "phone" + static let price = "price" + + static let externalId = "external_id" + static let loyaltyId = "loyalty_id" + static let telegramId = "telegram_id" + static let emailBulk = "email_bulk" + static let emailChain = "email_chain" + static let emailTransactional = "email_transactional" + static let smsBulk = "sms_bulk" + static let smsChain = "sms_chain" + static let smsTransactional = "sms_transactional" + static let webPushBulk = "web_push_bulk" + static let webPushChain = "web_push_chain" + static let webPushTransactional = "web_push_transactional" + static let mobilePushBulk = "mobile_push_bulk" + static let mobilePushChain = "mobile_push_chain" + static let mobilePushTransactional = "mobile_push_transactional" + } + + func subscribeForPriceDrop( + id: String, + currentPrice: Double, + email: String? = nil, + phone: String? = nil, + completion: @escaping (Result) -> Void + ) { + guard let sdk = sdk else { + completion(.failure(.custom(error: "subscribeForPriceDrop: SDK is not initialized"))) + return + } + + sessionQueue.addOperation { + var params: [String: Any] = [ + Constants.shopId: sdk.shopId, + Constants.did: sdk.deviceId, + Constants.seance:sdk.userSeance, + Constants.sid: sdk.userSeance, + Constants.segment: sdk.segment, + Constants.itemId: id, + Constants.price: currentPrice + ] + + if let email = email { + params[Constants.email] = email + } + + if let phone = phone { + params[Constants.phone] = phone + } + + sdk.postRequest( + path: Constants.subscribeForProductPricePath, params: params, completion: { result in + switch result { + case .success(_): + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + } + ) + } + } + + func subscribeForBackInStock( + id: String, + email: String? = nil, + phone: String? = nil, + fashionSize: [String]? = nil, + completion: @escaping (Result) -> Void + ) { + guard let sdk = sdk else { + completion(.failure(.custom(error: "subscribeForBackInStock: SDK is not initialized"))) + return + } + + sdk.sessionQueue.addOperation { + var params: [String: Any] = [ + Constants.shopId: sdk.shopId, + Constants.did: sdk.deviceId, + Constants.seance: sdk.userSeance, + Constants.sid: sdk.userSeance, + Constants.segment: sdk.segment, + Constants.itemId: id + ] + + if let fashionSize = fashionSize { + let tmpSizesArray = sdk.generateString(array: fashionSize) + params[Constants.properties] = [Constants.fashionSize: tmpSizesArray] + } + + if let email = email { + params[Constants.email] = email + } + if let phone = phone { + params[Constants.phone] = phone + } + + sdk.postRequest( + path: Constants.subscribePath, params: params, completion: { result in + switch result { + case .success(_): + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + } + ) + } + } + + func unsubscribeForBackInStock( + itemIds: [String], + email: String? = nil, + phone: String? = nil, + completion: @escaping (Result) -> Void + ) { + guard let sdk = sdk else { + completion(.failure(.custom(error: "unsubscribeForBackInStock: SDK is not initialized"))) + return + } + + sdk.sessionQueue.addOperation { + var params: [String: Any] = [ + Constants.shopId: sdk.shopId, + Constants.did: sdk.deviceId, + Constants.itemIds: itemIds + ] + + if let email = email { + params[Constants.email] = email + } + if let phone = phone { + params[Constants.phone] = phone + } + + sdk.postRequest( + path: Constants.unsubscribePath, params: params, completion: { result in + switch result { + case .success(_): + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + } + ) + } + } + + func manageSubscription( + email: String? = nil, + phone: String? = nil, + userExternalId: String? = nil, + userLoyaltyId: String? = nil, + telegramId: String? = nil, + emailBulk: Bool? = nil, + emailChain: Bool? = nil, + emailTransactional: Bool? = nil, + smsBulk: Bool? = nil, + smsChain: Bool? = nil, + smsTransactional: Bool? = nil, + webPushBulk: Bool? = nil, + webPushChain: Bool? = nil, + webPushTransactional: Bool? = nil, + mobilePushBulk: Bool? = nil, + mobilePushChain: Bool? = nil, + mobilePushTransactional: Bool? = nil, + completion: @escaping(Result) -> Void + ) { + guard let sdk = sdk else { + completion(.failure(.custom(error: "manageSubscription: SDK is not initialized"))) + return + } + var params: [String: Any] = [ + Constants.shopId: sdk.shopId, + Constants.did: sdk.deviceId, + Constants.seance: sdk.userSeance, + Constants.sid: sdk.userSeance, + Constants.segment: sdk.segment + ] + + if let email = email { + params[Constants.email] = email + } + if let phone = phone { + params[Constants.phone] = phone + } + + if let userExternalId = userExternalId { params[Constants.externalId] = userExternalId } + if let userLoyaltyId = userLoyaltyId { params[Constants.loyaltyId] = userLoyaltyId } + if let telegramId = telegramId { params[Constants.telegramId] = telegramId } + if let emailBulk = emailBulk { params[Constants.emailBulk] = emailBulk } + if let emailChain = emailChain { params[Constants.emailChain] = emailChain } + if let emailTransactional = emailTransactional { params[Constants.emailTransactional] = emailTransactional } + if let smsBulk = smsBulk { params[Constants.smsBulk] = smsBulk } + if let smsChain = smsChain { params[Constants.smsChain] = smsChain } + if let smsTransactional = smsTransactional { params[Constants.smsTransactional] = smsTransactional } + if let webPushBulk = webPushBulk { params[Constants.webPushBulk] = webPushBulk } + if let webPushChain = webPushChain { params[Constants.webPushChain] = webPushChain } + if let webPushTransactional = webPushTransactional { params[Constants.webPushTransactional] = webPushTransactional } + if let mobilePushBulk = mobilePushBulk { params[Constants.mobilePushBulk] = mobilePushBulk } + if let mobilePushChain = mobilePushChain { params[Constants.mobilePushChain] = mobilePushChain } + if let mobilePushTransactional = mobilePushTransactional { params[Constants.mobilePushTransactional] = mobilePushTransactional } + + sdk.postRequest( + path: Constants.manageSubscriptionPath, params: params, completion: { result in + switch result { + case .success(_): + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + } + ) + } +} diff --git a/Pods/REES46/REES46/Classes/ServicesImplementation/TrackServiceImpl.swift b/Pods/REES46/REES46/Classes/ServicesImplementation/TrackServiceImpl.swift new file mode 100644 index 0000000..8f46cf4 --- /dev/null +++ b/Pods/REES46/REES46/Classes/ServicesImplementation/TrackServiceImpl.swift @@ -0,0 +1,295 @@ + +import Foundation + +class TrackEventServiceImpl: TrackEventService { + + private var sdk: PersonalizationSDK? + private let sessionQueue: SessionQueue + + init(sdk: PersonalizationSDK) { + self.sdk = sdk + self.sessionQueue = sdk.sessionQueue + } + + private struct Constants { + static let trackStoriesPath = "track/stories" + static let trackCustomEventPath = "push/custom" + + static let id = "id" + static let amount = "amount" + static let price = "price" + static let shopId = "shop_id" + static let did = "did" + static let seance = "seance" + static let sid = "sid" + static let segment = "segment" + static let itemId = "item_id" + static let email = "email" + static let phone = "phone" + static let event = "event" + static let label = "label" + static let value = "value" + static let source = "source" + static let status = "status" + static let success = "success" + static let cart = "cart" + static let items = "items" + static let timeStartSaveKey = "timeStartSave" + static let sourceFrom = "from" + static let sourceCode = "code" + static let fullCartValue = "true" + static let statusSuccess = "success" + static let storyId = "story_id" + static let slideId = "slide_id" + static let view = "view" + static let click = "click" + static let searchQuery = "search_query" + static let search = "search" + static let categoryId = "category_id" + static let category = "category" + static let recomendedCode = "recomendedCode" + static let recomendedType = "recomendedType" + static let timeStartSave = "timeStartSave" + static let orderId = "order_id" + static let orderPrice = "order_price" + static let promocode = "promocode" + static let deliveryType = "delivery_type" + static let deliveryAddress = "delivery_address" + static let removeFromCart = "remove_from_cart" + static let removeWish = "remove_wish" + static let paymentType = "payment_type" + static let taxFree = "tax_free" + static let fullCart = "full_cart" + static let fullWish = "full_wish" + static let wish = "wish" + static let purchase = "purchase" + } + + func track(event: Event, recommendedBy: RecomendedBy?, completion: @escaping (Result) -> Void) { + guard let sdk = sdk else { + completion(.failure(.custom(error: "track: SDK is not initialized"))) + return + } + + sessionQueue.addOperation { + var path = "push" + + var paramEvent = "" + var params: [String: Any] = [ + Constants.shopId: sdk.shopId, + Constants.did: sdk.deviceId, + Constants.seance: sdk.userSeance, + Constants.sid: sdk.userSeance, + Constants.segment: sdk.segment + ] + switch event { + case let .slideView(storyId, slideId): + params[Constants.storyId] = storyId + params[Constants.slideId] = slideId + params[Constants.sourceCode] = sdk.storiesCode + path = Constants.trackStoriesPath + + paramEvent = Constants.view + case let .slideClick(storyId, slideId): + params[Constants.storyId] = storyId + params[Constants.slideId] = slideId + params[Constants.sourceCode] = sdk.storiesCode + path = Constants.trackStoriesPath + + paramEvent = Constants.click + case let .search(query): + params[Constants.searchQuery] = query + paramEvent = Constants.search + case let .categoryView(id): + params[Constants.categoryId] = id + paramEvent = Constants.category + case let .productView(id): + params[Constants.items] = [[Constants.id:id]] + paramEvent = Constants.view + case let .productAddedToCart(id, amount): + params[Constants.items] = [[Constants.id:id, Constants.amount:amount] as [String : Any]] + paramEvent = Constants.cart + case let .productAddedToFavorites(id): + params[Constants.items] = [[Constants.id:id]] + paramEvent = Constants.wish + case let .productRemovedFromCart(id): + params[Constants.items] = [[Constants.id:id]] + paramEvent = Constants.removeFromCart + case let .productRemovedFromFavorites(id): + params[Constants.items] = [[Constants.id:id]] + paramEvent = Constants.removeWish + case let .orderCreated(orderId, totalValue, products, deliveryAddress, deliveryType, promocode, paymentType, taxFree): + var tempItems: [[String: Any]] = [] + for (_, item) in products.enumerated() { + tempItems.append( + [ + Constants.id: item.id, + Constants.amount: String(item.amount), + Constants.price: item.price + ] + ) + } + params[Constants.items] = tempItems + params[Constants.orderId] = orderId + params[Constants.orderPrice] = "\(totalValue)" + if let deliveryAddress = deliveryAddress { + params[Constants.deliveryAddress] = deliveryAddress + } + if let deliveryType = deliveryType { + params[Constants.deliveryType] = deliveryType + } + if let promocode = promocode { + params[Constants.promocode] = promocode + } + if let paymentType = paymentType { + params[Constants.paymentType] = paymentType + } + if let taxFree = taxFree { + params[Constants.taxFree] = taxFree + } + paramEvent = Constants.purchase + case let .synchronizeCart(items): + var tempItems: [[String: Any]] = [] + for (_, item) in items.enumerated() { + tempItems.append([ + Constants.id: item.productId, + Constants.amount: String(item.quantity) + ]) + } + params[Constants.items] = tempItems + params[Constants.fullCart] = Constants.fullCartValue + paramEvent = Constants.cart + case let .synchronizeFavorites(ids): + var tempItems: [[String: Any]] = [] + for id in ids { + tempItems.append([ + Constants.id: id + ]) + } + params[Constants.items] = tempItems + params[Constants.fullWish] = Constants.fullCartValue + paramEvent = Constants.wish + } + + params[Constants.event] = paramEvent + + // Process recommendedBy parameter + if let recommendedBy = recommendedBy { + let recomendedParams = recommendedBy.getParams() + for item in recomendedParams { + params[item.key] = item.value + } + } + + // Check source tracker params + let timeValue = UserDefaults.standard.double(forKey: Constants.timeStartSaveKey) + let nowTimeValue = Date().timeIntervalSince1970 + let diff = nowTimeValue - timeValue + if diff > 48*60*60 { + // Recomended params is invalidate + UserDefaults.standard.setValue(nil, forKey: Constants.recomendedCode) + UserDefaults.standard.setValue(nil, forKey: Constants.recomendedType) + } else { + let savedCode = UserDefaults.standard.string(forKey: Constants.recomendedCode) ?? "" + let savedType = UserDefaults.standard.string(forKey: Constants.recomendedType) ?? "" + let sourceParams: [String: Any] = [ + Constants.sourceFrom: savedType, + Constants.sourceCode: savedCode + ] + params[Constants.source] = sourceParams + } + + sdk.postRequest( + path: path, params: params, completion: { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let status = resJSON[Constants.status] as? String ?? "" + if status == Constants.success { + completion(.success(Void())) + } else { + completion(.failure(.responseError)) + } + case let .failure(error): + completion(.failure(error)) + } + } + ) + } + } + + func trackEvent(event: String, category: String?, label: String?, value: Int?, completion: @escaping (Result) -> Void) { + guard let sdk = sdk else { + completion(.failure(.custom(error: "trackEvent: SDK is not initialized"))) + return + } + + sessionQueue.addOperation { + + var params: [String: Any] = [ + Constants.shopId: sdk.shopId, + Constants.did: sdk.deviceId, + Constants.seance: sdk.userSeance, + Constants.sid: sdk.userSeance, + Constants.segment: sdk.segment, + Constants.event: event + ] + + if let category = category { + params[Constants.category] = category + } + if let label = label { + params[Constants.label] = label + } + if let value = value { + params[Constants.value] = String(value) + } + + // Check source tracker params + let timeValue = UserDefaults.standard.double(forKey: Constants.timeStartSave) + let nowTimeValue = Date().timeIntervalSince1970 + let diff = nowTimeValue - timeValue + if diff > 48*60*60 { + // Recomended params is invalidate + UserDefaults.standard.setValue(nil, forKey: Constants.recomendedCode) + UserDefaults.standard.setValue(nil, forKey: Constants.recomendedType) + } else { + let savedCode = UserDefaults.standard.string(forKey: Constants.recomendedCode) ?? "" + let savedType = UserDefaults.standard.string(forKey: Constants.recomendedType) ?? "" + let sourceParams: [String: Any] = [ + Constants.sourceFrom: savedType, + Constants.sourceCode: savedCode + ] + params[Constants.source] = sourceParams + } + + sdk.postRequest(path: Constants.trackCustomEventPath, params: params, completion: { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let status = resJSON[Constants.status] as? String ?? "" + if status == Constants.success { + completion(.success(Void())) + } else { + completion(.failure(.responseError)) + } + case let .failure(error): + completion(.failure(error)) + } + }) + } + } +} + +class TrackSourceServiceImpl: TrackSourceService { + private struct Constants { + static let recomendedCode = "recomendedCode" + static let recomendedType = "recomendedType" + static let timeStartSave = "timeStartSave" + } + func trackSource(source: RecommendedByCase, code: String) { + UserDefaults.standard.setValue(Date().timeIntervalSince1970, forKey: Constants.timeStartSave) + UserDefaults.standard.setValue(code, forKey: Constants.recomendedCode) + UserDefaults.standard.setValue(source.rawValue, forKey: Constants.recomendedType) + } +} diff --git a/Pods/REES46/REES46/Classes/Shared/ColorExtensions.swift b/Pods/REES46/REES46/Classes/Shared/ColorExtensions.swift new file mode 100644 index 0000000..2932b4f --- /dev/null +++ b/Pods/REES46/REES46/Classes/Shared/ColorExtensions.swift @@ -0,0 +1,32 @@ +import Foundation +import UIKit + + +extension UIColor { + public func withBrightness(brightness: CGFloat) -> UIColor { + var H: CGFloat = 0, S: CGFloat = 0, B: CGFloat = 0, A: CGFloat = 0 + if getHue(&H, saturation: &S, brightness: &B, alpha: &A) { + B += (brightness - 1.0) + B = max(min(B, 1.0), 0.0) + return UIColor(hue: H, saturation: S, brightness: B, alpha: A) + } + return self + } + + public func withOpacity(from opacityString: String) -> UIColor { + guard let opacityValue = extractOpacity(from: opacityString) else { + return self + } + let colorWithOpacity = self.withAlphaComponent(opacityValue) + + return colorWithOpacity + } + + private func extractOpacity(from opacityString: String) -> CGFloat? { + let percentageString = opacityString.trimmingCharacters(in: CharacterSet(charactersIn: "%")) + if let percentage = Double(percentageString) { + return CGFloat(percentage) / 100.0 + } + return nil + } +} diff --git a/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift b/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift new file mode 100644 index 0000000..fc9de19 --- /dev/null +++ b/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift @@ -0,0 +1,1272 @@ +// +// SimplePersonaliztionSDK.swift +// REES46 +// +// Created by REES46 +// Copyright (c) 2023. All rights reserved. +// + +import UIKit +import Foundation +import AdSupport +import AppTrackingTransparency + +public var global_EL: Bool = true + +class SimplePersonalizationSDK: PersonalizationSDK { + + struct Constants { + static let shopId: String = "shop_id" + static let searchQuery: String = "search_query" + static let deviceId: String = "did" + static let userSeance: String = "seance" + static let type: String = "type" + static let segment: String = "segment" + static let limit: String = "limit" + static let offset: String = "offset" + static let categoryLimit: String = "category_limit" + static let categories: String = "categories" + static let extended: String = "extended" + static let sortBy: String = "sort_by" + static let sortDir: String = "sort_dir" + static let locations: String = "locations" + static let brands: String = "brands" + static let filters: String = "filters" + static let priceMin: String = "price_min" + static let priceMax: String = "price_max" + static let colors: String = "colors" + static let fashionSizes: String = "fashion_sizes" + static let exclude: String = "exclude" + static let email: String = "email" + static let disableClarification: String = "no_clarification" + static let defaultTimeout: Double = 1.0 + static let noClarificationValue: String = "1" + } + + var storiesCode: String? + + var shopId: String + var deviceId: String + var userSeance: String + var stream: String + + var baseURL: String + let baseInitJsonFileName = ".json" + let autoSendPushToken: Bool + + let sdkBundleId = Bundle(for: SimplePersonalizationSDK.self).bundleIdentifier + let appBundleId = Bundle(for: SimplePersonalizationSDK.self).bundleIdentifier + + var userEmail: String? + var userPhone: String? + var userLoyaltyId: String? + + var segment: String + var urlSession: URLSession + + var userInfo: InitResponse = InitResponse() + + let sessionQueue = SessionQueue.manager + + private var requestOperation: RequestOperation? + + let bodyMutableData = NSMutableData() + + private let initSemaphore = DispatchSemaphore(value: 0) + private let serialSemaphore = DispatchSemaphore(value: 0) + + lazy var trackEventService: TrackEventService = { + return TrackEventServiceImpl(sdk: self) + }() + + lazy var trackSourceService: TrackSourceService = { + return TrackSourceServiceImpl() + }() + + lazy var subscriptionService: SubscriptionService = { + return SubscriptionServiceImpl(sdk: self) + }() + + lazy var notificationService: NotificationHandlingService = { + return NotificationHandlerServiceImpl(sdk: self) + }() + + lazy var pushTokenService: PushTokenNotificationService = { + return PushTokenHandlerServiceImpl(sdk: self) + }() + + init( + shopId: String, + userEmail: String? = nil, + userPhone: String? = nil, + userLoyaltyId: String? = nil, + apiDomain: String, + stream: String = "ios", + enableLogs: Bool = false, + autoSendPushToken: Bool = true, + completion: ((SDKError?) -> Void)? = nil + ) { + + + self.shopId = shopId + self.autoSendPushToken = autoSendPushToken + + global_EL = enableLogs + self.baseURL = "https://" + apiDomain + "/" + + self.userEmail = userEmail + self.userPhone = userPhone + self.userLoyaltyId = userLoyaltyId + self.stream = stream + self.storiesCode = nil + + // Generate seance + userSeance = UUID().uuidString + + // Generate segment + segment = ["A", "B"].randomElement() ?? "A" + + // Trying to fetch user session (permanent user Id) + deviceId = UserDefaults.standard.string(forKey: "device_id") ?? "" + + urlSession = URLSession.shared + sessionQueue.addOperation { + self.sendInitRequest { initResult in + switch initResult { + case .success: + if let res = try? initResult.get() { + self.userInfo = res + self.userSeance = res.seance + self.deviceId = res.deviceId + if let completion = completion { + completion(nil) + } + } else { + if let completion = completion { + completion(.decodeError) + } + } + self.initSemaphore.signal() + case .failure(let error): + if let completion = completion { + completion(error) + } + self.initSemaphore.signal() + break + } + } + self.initSemaphore.wait() + } + } + + func getDeviceId() -> String { + return deviceId + } + + func getSession() -> String { + return userSeance + } + + func getCurrentSegment() -> String { + return segment + } + + func getShopId() -> String { + return shopId + } + + func setPushTokenNotification(token: String, isFirebaseNotification: Bool = false, completion: @escaping (Result) -> Void) { + pushTokenService.setPushToken(token: token, isFirebaseNotification: isFirebaseNotification, completion: completion) + } + + func getAllNotifications(type: String, phone: String? = nil, email: String? = nil, userExternalId: String? = nil, userLoyaltyId: String? = nil, channel: String?, limit: Int?, page: Int?, dateFrom: String?, completion: @escaping (Result) -> Void) { + notificationService.getAllNotifications(type: type, phone: phone, email: email, userExternalId: userExternalId, userLoyaltyId: userLoyaltyId, channel: channel, limit: limit, page: page, dateFrom: dateFrom, completion: completion) + } + + func configureURLSession(configuration: URLSessionConfiguration) { + self.urlSession = URLSession(configuration: configuration) + } + + func review(rate: Int, channel: String, category: String, orderId: String?, comment: String?, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "nps/create" + let params: [String : String] = [ + "did": self.deviceId, + "shop_id": self.shopId, + "rate": String(rate), + "channel": channel, + "category": category, + "order_id": orderId ?? "", + "comment": comment ?? "" + ] + if rate < 1 || rate > 10 { + completion(.failure(.custom(error: "Error: rating can be between 1 and 10 only"))) + return // Exit from review + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + self.postRequest(path: path, params: params) { (result) in + switch result { + case .success: + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + func searchBlank(completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "search/blank" + let params: [String : String] = [ + "did": self.deviceId, + "shop_id": self.shopId + ] + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + self.getRequest(path: path, params: params) { (result) in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = SearchBlankResponse(json: resJSON) + completion(.success(resultResponse)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + func search(query: String, limit: Int?, offset: Int?, categoryLimit: Int?, categories: String?, extended: String?, sortBy: String?, sortDir: String?, locations: String?, brands: String?, filters: [String: Any]?, priceMin: Double?, priceMax: Double?, colors: [String]?, fashionSizes: [String]?, exclude: String?, email: String?, timeOut: Double?, disableClarification: Bool?, completion: @escaping (Result) -> Void) { + + sessionQueue.addOperation { + let path = "search" + var params: [String: String] = [ + Constants.shopId: self.shopId, + Constants.deviceId: self.deviceId, + Constants.userSeance: self.userSeance, + Constants.segment: Constants.type, + Constants.segment: self.segment, + Constants.type: "full_search", + Constants.searchQuery: query, + ] + + if let limit = limit { + params[Constants.limit] = String(limit) + } + if let offset = offset { + params[Constants.offset] = String(offset) + } + if let categoryLimit = categoryLimit { + params[Constants.categoryLimit] = String(categoryLimit) + } + if let categories = categories { + params[Constants.categories] = categories + } + if let extended = extended { + params[Constants.extended] = extended + } + if let sortBy = sortBy { + params[Constants.sortBy] = String(sortBy) + } + if let sortDir = sortDir { + params[Constants.sortDir] = String(sortDir) + } + if let locations = locations { + params[Constants.locations] = locations + } + if let brands = brands { + params[Constants.brands] = brands + } + if let filters = filters { + if let theJSONData = try? JSONSerialization.data( + withJSONObject: filters, + options: []) { + let theJSONText = String(data: theJSONData, + encoding: .utf8) + params[Constants.filters] = theJSONText + } + } + if let priceMin = priceMin { + params[Constants.priceMin] = String(priceMin) + } + if let priceMax = priceMax { + params[Constants.priceMax] = String(priceMax) + } + if let colors = colors { + let colorsArray = self.generateString(array: colors) + params[Constants.colors] = colorsArray + } + if let fashionSizes = fashionSizes { + let fashionSizesArray = self.generateString(array: fashionSizes) + params[Constants.fashionSizes] = fashionSizesArray + } + if let exclude = exclude { + params[Constants.exclude] = exclude + } + if let email = email { + params[Constants.email] = email + } + if let disableClarification = disableClarification { + if disableClarification == true { + params[Constants.disableClarification] = Constants.noClarificationValue + } + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = timeOut ?? Constants.defaultTimeout + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + + self.getRequest(path: path, params: params) { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = SearchResponse(json: resJSON) + completion(.success(resultResponse)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + func setProfileData(userEmail: String?, userPhone: String?, userLoyaltyId: String?, birthday: Date?, age: Int?, firstName: String?, lastName: String?, location: String?, gender: Gender?, fbID: String?, vkID: String?, telegramId: String?, loyaltyCardLocation: String?, loyaltyStatus: String?, loyaltyBonuses: Int?, loyaltyBonusesToNextLevel: Int?, boughtSomething: Bool?, userId: String?, customProperties: [String: Any?]?, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "profile/set" + var paramsTemp: [String: Any?] = [ + "shop_id": self.shopId, + "did": self.deviceId, + "seance": self.userSeance, + "sid": self.userSeance, + ] + + if let userEmail = userEmail { + paramsTemp["email"] = String(userEmail) + } + + if let firstName = firstName { + paramsTemp["first_name"] = String(firstName) + } + + if let lastName = lastName { + paramsTemp["last_name"] = String(lastName) + } + + if let userPhone = userPhone { + paramsTemp["phone"] = String(userPhone) + } + + if let location = location { + paramsTemp["location"] = String(location) + } + + if let loyaltyCardLocation = loyaltyCardLocation { + paramsTemp["loyalty_card_location"] = String(loyaltyCardLocation) + } + + if let userLoyaltyId = userLoyaltyId { + paramsTemp["loyalty_id"] = String(userLoyaltyId) + } + + if let loyaltyStatus = loyaltyStatus { + paramsTemp["loyalty_status"] = String(loyaltyStatus) + } + + if let fbID = fbID { + paramsTemp["fb_id"] = String(fbID) + } + + if let vkID = vkID { + paramsTemp["vk_id"] = String(vkID) + } + + if let telegramId = telegramId { + paramsTemp["telegram_id"] = String(telegramId) + } + + if let userId = userId { + paramsTemp["id"] = String(userId) + } + + if gender == .male { + paramsTemp["gender"] = "m" + } + if gender == .female { + paramsTemp["gender"] = "f" + } + + if let birthday = birthday { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + let birthdayString = dateFormatter.string(from: birthday) + paramsTemp["birthday"] = birthdayString + } + + if let loyaltyBonuses = loyaltyBonuses { + paramsTemp["loyalty_bonuses"] = String(loyaltyBonuses) + } + + if let loyaltyBonusesToNextLevel = loyaltyBonusesToNextLevel { + paramsTemp["loyalty_bonuses_to_next_level"] = String(loyaltyBonusesToNextLevel) + } + + if let boughtSomething = boughtSomething { + paramsTemp["bought_something"] = boughtSomething == true ? "1" : "0" + } + + if let age = age { + paramsTemp["age"] = String(age) + } + + // Merge custom properties (custom properties overwrite initial values) + if let customProperties = customProperties { + paramsTemp.merge(customProperties) { (_, new) in new } + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + self.urlSession = URLSession(configuration: sessionConfig) + + var params: [String: Any] = [String: Any]() + for item in paramsTemp { + if item.value is Date { + let formatter = DateFormatter() + formatter.dateFormat = "YYYY-MM-dd" + guard let date = item.value as? Date else {continue} + params[item.key] = formatter.string(from: date) + } else { + params[item.key] = item.value + } + } + + self.postRequest(path: path, params: params, completion: { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let status = resJSON["status"] as? String ?? "" + if status == "success" { + completion(.success(Void())) + } else { + completion(.failure(.responseError)) + } + case let .failure(error): + completion(.failure(error)) + } + }) + } + } + + func track(event: Event, recommendedBy: RecomendedBy?, completion: @escaping (Result) -> Void) { + trackEventService.track(event: event, recommendedBy: recommendedBy, completion: completion) + } + + func trackEvent(event: String, category: String?, label: String?, value: Int?, completion: @escaping (Result) -> Void) { + trackEventService.trackEvent(event: event, category: category, label: label, value: value, completion: completion) + } + + func trackSource(source: RecommendedByCase, code: String) { + trackSourceService.trackSource(source: source, code: code) + } + + func recommend(blockId: String, currentProductId: String?, currentCategoryId: String?, locations: String?, imageSize: String?, timeOut: Double?, withLocations: Bool = false, extended: Bool = false, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "recommend/\(blockId)" + var params = [ + "shop_id": self.shopId, + "did": self.deviceId, + "seance": self.userSeance, + "sid": self.userSeance, + "extended": "true", + "resize_image": "180", + "segment": self.segment + ] + + if let productId = currentProductId { + params["item_id"] = productId + } + if let categoryId = currentCategoryId { + params["categories"] = categoryId + } + if let imageSize = imageSize { + params["resize_image"] = imageSize + } + if let locations = locations { + params["locations"] = locations + } + + if extended { + params["extended"] = "true" + if withLocations { + params["with_locations"] = "true" + } + } else { + params.removeValue(forKey: "with_locations") + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = timeOut ?? 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + + self.getRequest(path: path, params: params) { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = RecommenderResponse(json: resJSON) + completion(.success(resultResponse)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + func suggest(query: String, locations: String?, timeOut: Double?, extended: String?, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "search" + var params = [ + "shop_id": self.shopId, + "did": self.deviceId, + "seance": self.userSeance, + "sid": self.userSeance, + "type": "instant_search", + "search_query": query, + "segment": self.segment + ] + + if let locations = locations { + params["locations"] = locations + } + if let extended = extended { + params["extended"] = extended + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = timeOut ?? 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + + self.getRequest(path: path, params: params) { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = SearchResponse(json: resJSON) + completion(.success(resultResponse)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + func getProductsList(brands: String?, merchants: String?, categories: String?, locations: String?, limit: Int?, page: Int?, filters: [String: Any]?, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "products" + var params: [String: String] = [ + "shop_id": self.shopId, + "did": self.deviceId, + "seance": self.userSeance, + "sid": self.userSeance + ] + if let brands = brands { + params["brands"] = brands + } + if let merchants = merchants { + params["merchants"] = merchants + } + if let categories = categories { + params["categories"] = categories + } + if let locations = locations { + params["locations"] = locations + } + if let limit = limit { + params["limit"] = String(limit) + } + if let page = page { + params["page"] = String(page) + } + if let filters = filters { + if let theJSONData = try? JSONSerialization.data( + withJSONObject: filters, + options: []) { + let theJSONText = String(data: theJSONData, + encoding: .utf8) + params["filters"] = theJSONText + } + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + + self.getRequest(path: path, params: params) { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = ProductsListResponse(json: resJSON) + completion(.success(resultResponse)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + func getProductInfo(id: String, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "products/get" + let params: [String : String] = [ + "shop_id": self.shopId, + "did": self.deviceId, + "seance": self.userSeance, + "sid": self.userSeance, + "item_id": id + ] + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + + self.getRequest(path: path, params: params) { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = ProductInfo(json: resJSON) + completion(.success(resultResponse)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + func getProductsFromCart(completion: @escaping (Result<[CartItem], SDKError>) -> Void) { + sessionQueue.addOperation { + let path = "products/cart" + let params: [String : String] = [ + "shop_id": self.shopId, + "did": self.deviceId + ] + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + + self.getRequest(path: path, params: params) { result in + switch result { + case let .success(responseJson): + guard let data = responseJson["data"] as? [String: Any], + let itemsJSON = data["items"] as? [[String: Any]] + else { + completion(.failure(.custom(error: "cant find JSON data"))) + return + } + let items = itemsJSON.map({ CartItem(json: $0)}) + completion(.success(items)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + // Send tracking event when user clicked mobile push notification + func notificationClicked(type: String, code: String, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "track/clicked" + let params: [String: String] = [ + "shop_id": self.shopId, + "did": self.deviceId, + "code": code, + "type": type + ] + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + + self.postRequest(path: path, params: params, completion: { result in + switch result { + case .success: + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + }) + } + } + + // Send tracking event when user receive mobile push notification + func notificationReceived(type: String, code: String, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "track/received" + let params: [String: String] = [ + "shop_id": self.shopId, + "did": self.deviceId, + "code": code, + "type": type + ] + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + + self.postRequest(path: path, params: params, completion: { result in + switch result { + case .success: + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + }) + } + } + + func subscribeForPriceDrop( + id: String, + currentPrice: Double, + email: String? = nil, + phone: String? = nil, + completion: @escaping (Result) -> Void + ) { + subscriptionService.subscribeForPriceDrop( + id:id, + currentPrice: currentPrice, + email: email, + phone: phone, + completion: completion + ) + } + + func subscribeForBackInStock(id: String, email: String? = nil, phone: String? = nil, fashionSize: [String]? = nil, completion: @escaping (Result) -> Void) { + subscriptionService.subscribeForBackInStock(id: id, email: email, phone: phone, fashionSize: fashionSize, completion: completion) + } + + func unsubscribeForBackInStock(itemIds: [String], email: String? = nil, phone: String? = nil, completion: @escaping (Result) -> Void) { + subscriptionService.unsubscribeForBackInStock(itemIds: itemIds, email: email, phone: phone, completion: completion) + } + + func manageSubscription( + email: String? = nil, + phone: String? = nil, + userExternalId: String? = nil, + userLoyaltyId: String? = nil, + telegramId: String? = nil, + emailBulk: Bool? = nil, + emailChain: Bool? = nil, + emailTransactional: Bool? = nil, + smsBulk: Bool? = nil, + smsChain: Bool? = nil, + smsTransactional: Bool? = nil, + webPushBulk: Bool? = nil, + webPushChain: Bool? = nil, + webPushTransactional: Bool? = nil, + mobilePushBulk: Bool? = nil, + mobilePushChain: Bool? = nil, + mobilePushTransactional: Bool? = nil, + completion: @escaping(Result) -> Void + ) { + subscriptionService.manageSubscription( + email:email, + phone:phone, + userExternalId:userExternalId, + userLoyaltyId:userLoyaltyId, + telegramId:telegramId, + emailBulk:emailBulk, + emailChain:emailChain, + emailTransactional:emailTransactional, + smsBulk:smsBulk, + smsChain:smsChain, + smsTransactional:smsTransactional, + webPushBulk:webPushBulk, + webPushChain:webPushChain, + webPushTransactional:webPushTransactional, + mobilePushBulk:mobilePushBulk, + mobilePushChain:mobilePushChain, + mobilePushTransactional:mobilePushTransactional, + completion: completion + ) + } + + func addToSegment(segmentId: String, email: String? = nil, phone: String? = nil, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "segments/add" + var params: [String: Any] = [ + "shop_id": self.shopId, + "did": self.deviceId, + "seance": self.userSeance, + "sid": self.userSeance, + "segment_id": segmentId + ] + + // If has email + if let email = email { + params["email"] = email + } + + // If has phone + if let phone = phone { + params["phone"] = phone + } + + self.postRequest(path: path, params: params, completion: { result in + switch result { + case .success(_): + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + }) + } + } + + func removeFromSegment(segmentId: String, email: String? = nil, phone: String? = nil, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "segments/remove" + var params: [String: Any] = [ + "shop_id": self.shopId, + "did": self.deviceId, + "seance": self.userSeance, + "sid": self.userSeance, + "segment_id": segmentId + ] + + if let email = email { + params["email"] = email + } + if let phone = phone { + params["phone"] = phone + } + + self.postRequest(path: path, params: params, completion: { result in + switch result { + case .success(_): + completion(.success(Void())) + case let .failure(error): + completion(.failure(error)) + } + }) + } + } + + private func sendInitRequest(completion: @escaping (Result) -> Void) { + let path = "init" + var secondsFromGMT: Int { return TimeZone.current.secondsFromGMT() } + let hours = secondsFromGMT/3600 + + var params: [String: String] = [ + "shop_id": shopId, + "tz": String(hours) + ] + let deviceId = UserDefaults.standard.string(forKey: "device_id") ?? "" + if deviceId != "" { + params["did"] = deviceId + } + + let advId = UserDefaults.standard.string(forKey: "IDFA") ?? nil + if (advId != "00000000-0000-0000-0000-000000000000" && advId != nil) { + params["ios_advertising_id"] = advId + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + self.urlSession = URLSession(configuration: sessionConfig) + + let convertedInitJsonFileName = self.shopId + baseInitJsonFileName + let initFileNamePath = SdkGlobalHelper.sharedInstance.getSdkDocumentsDirectory().appendingPathComponent(convertedInitJsonFileName) + + let initData = NSData(contentsOf: initFileNamePath) + let json = try? JSONSerialization.jsonObject(with: initData as? Data ?? Data()) + if let jsonObject = json as? [String: Any] { + let resultResponse = InitResponse(json: jsonObject) + let successInitDeviceId: String? = resultResponse.deviceId + let successSeanceId: String? = resultResponse.seance + let keychainDid: String? = UserDefaults.standard.string(forKey: "device_id") ?? "" + if (keychainDid == nil || keychainDid == "") { + DispatchQueue.onceTechService(token: "keychainDid") { + UserDefaults.standard.set(successInitDeviceId, forKey: "device_id") + } + UserDefaults.standard.set(successSeanceId, forKey: "seance_id") + sleep(1) + completion(.success(resultResponse)) + self.serialSemaphore.signal() + } else { + if let keychainIpfsSecret = try? InitService.getKeychainDidToken(identifier: sdkBundleId!, instanceKeychainService: appBundleId!) { + try? FileManager.default.removeItem(at: initFileNamePath) + let jsonSecret = try? JSONSerialization.jsonObject(with: keychainIpfsSecret) + let resultResponse = InitResponse(json: jsonSecret as! [String : Any]) + self.storeSuccessInit(result: resultResponse) + + try? self.saveDataToJsonFile(keychainIpfsSecret, jsonInitFileName: convertedInitJsonFileName) + } + sleep(1) + completion(.success(resultResponse)) + self.serialSemaphore.signal() + } + + } else if let keychainIpfsSecret = try? InitService.getKeychainDidToken(identifier: sdkBundleId!, instanceKeychainService: appBundleId!) { + try? FileManager.default.removeItem(at: initFileNamePath) + let jsonSecret = try? JSONSerialization.jsonObject(with: keychainIpfsSecret) + let resultResponse = InitResponse(json: jsonSecret as! [String : Any]) + self.storeSuccessInit(result: resultResponse) + + try? self.saveDataToJsonFile(keychainIpfsSecret, jsonInitFileName: convertedInitJsonFileName) + sleep(1) + completion(.success(resultResponse)) + self.serialSemaphore.signal() + } else { + getRequest(path: path, params: params, true) { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = InitResponse(json: resJSON) + self.storeSuccessInit(result: resultResponse) + completion(.success(resultResponse)) + self.serialSemaphore.signal() + case let .failure(error): + completion(.failure(error)) + } + } + } + self.serialSemaphore.wait() + } + + public func sendIDFARequest(idfa: UUID, completion: @escaping (Result) -> Void) { + let path = "init" + var secondsFromGMT: Int { return TimeZone.current.secondsFromGMT() } + let hours = secondsFromGMT/3600 + + var params: [String: String] = [ + "shop_id": shopId, + "tz": String(hours) + ] + + let dId = UserDefaults.standard.string(forKey: "device_id") ?? "" + if dId != "" { + params["did"] = dId + } + + let advId = idfa.uuidString + if advId == "00000000-0000-0000-0000-000000000000" || advId == "" { + return + } + params["ios_advertising_id"] = advId + UserDefaults.standard.set(advId, forKey: "IDFA") + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + self.urlSession = URLSession(configuration: sessionConfig) + + getRequest(path: path, params: params, true) { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = InitResponse(json: resJSON) + completion(.success(resultResponse)) + case let .failure(error): + completion(.failure(error)) + } + } + } + + public func deleteUserCredentials() { + let convertedInitJsonFileName = self.shopId + baseInitJsonFileName + let initFileNamePath = SdkGlobalHelper.sharedInstance.getSdkDocumentsDirectory().appendingPathComponent(convertedInitJsonFileName) + try? FileManager.default.removeItem(at: initFileNamePath) + + UserDefaults.standard.set(nil, forKey: "device_id") + UserDefaults.standard.set(nil, forKey: "seance_id") + } + + func getStories(code: String, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + self.storiesCode = code + let path = "stories/\(code)" + let params: [String: String] = [ + "shop_id": self.shopId, + "did": self.deviceId + ] + let sessionConfig = URLSessionConfiguration.default + if SdkConfiguration.stories.storiesSlideReloadManually { + sessionConfig.timeoutIntervalForRequest = SdkConfiguration.stories.storiesSlideReloadTimeoutInterval + sessionConfig.waitsForConnectivity = false + sessionConfig.shouldUseExtendedBackgroundIdleMode = false + } else { + sessionConfig.timeoutIntervalForRequest = 5 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + } + self.urlSession = URLSession(configuration: sessionConfig) + + self.getRequest(path: path, params: params, false) { result in + switch result { + case let .success(successResult): + let res = StoryContent(json: successResult) + completion(.success(res)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + func saveDataToJsonFile(_ data: Data, jsonInitFileName: String = "sdkinit.json") throws { + let jsonFileURL = SdkGlobalHelper.sharedInstance.getSdkDocumentsDirectory().appendingPathComponent(jsonInitFileName) + do { + let fileExists = (try? jsonFileURL.checkResourceIsReachable()) ?? false + print("SDK Success initialization with exist json file\n\(jsonFileURL)\n") + if !fileExists { + try data.write(to: jsonFileURL) + } + + } catch let error as NSError { + print(error) + try data.write(to: jsonFileURL) + } + } + + func storeSuccessInit(result: InitResponse) { + let successInitDeviceId: String? = result.deviceId + let successSeanceId: String? = result.seance + let keychainDid: String? = UserDefaults.standard.string(forKey: "device_id") ?? "" + if (keychainDid == nil || keychainDid == "") { + DispatchQueue.onceTechService(token: "keychainDid") { + UserDefaults.standard.set(successInitDeviceId, forKey: "device_id") + } + } + UserDefaults.standard.set(successSeanceId, forKey: "seance_id") + } + + internal func configuration() -> SdkConfiguration.Type { + return SdkConfiguration.self + } + + func getRequest(path: String, params: [String: String], _ isInit: Bool = false, completion: @escaping (Result<[String: Any], SDKError>) -> Void) { + + let urlString = baseURL + path + var url = URLComponents(string: urlString) + + var queryItems = [URLQueryItem]() + for item in params { + queryItems.append(URLQueryItem(name: item.key, value: item.value)) + } + + queryItems.append(URLQueryItem(name: "stream", value: stream)) + url?.queryItems = queryItems + + if (!isInit && path == "init") { + let convertedInitJsonFileName = self.shopId + baseInitJsonFileName + let initFileNamePath = SdkGlobalHelper.sharedInstance.getSdkDocumentsDirectory().appendingPathComponent(convertedInitJsonFileName) + let iData = NSData(contentsOf: initFileNamePath) + let json = try? JSONSerialization.jsonObject(with: iData! as Data) + if let jsonObject = json as? [String: Any] { + completion(.success(jsonObject)) + } else { + completion(.failure(.decodeError)) + } + } + + if let endUrl = url?.url { + urlSession.dataTask(with: endUrl) { result in + switch result { + case .success(let (response, data)): + guard let statusCode = (response as? HTTPURLResponse)?.statusCode, 200 ..< 299 ~= statusCode else { + let json = try? JSONSerialization.jsonObject(with: data) + if let jsonObject = json as? [String: Any] { + let statusMessage = jsonObject["message"] as? String ?? "" + print("\nStatus message: ", statusMessage) + } + completion(.failure(.invalidResponse)) + return + } + do { + if isInit { + let convertedInitJsonFileName = self.shopId + self.baseInitJsonFileName + try self.saveDataToJsonFile(data, jsonInitFileName: convertedInitJsonFileName) + try InitService.insertKeychainDidToken(data, identifier: self.sdkBundleId!, instanceKeychainService: self.appBundleId!) + } + + let json = try JSONSerialization.jsonObject(with: data) + if let jsonObject = json as? [String: Any] { + completion(.success(jsonObject)) + } else { + completion(.failure(.decodeError)) + } + } catch { + completion(.failure(.decodeError)) + } + case .failure: + let networkManager = NetworkStatus.nManager + let connectionStatus = networkManager.connectionStatus + + if connectionStatus == .Online { + completion(.failure(.invalidResponse)) + } else if connectionStatus == .Offline { + completion(.failure(.networkOfflineError)) + } + } + }.resume() + } else { + completion(.failure(.invalidResponse)) + } + } + + func postRequest(path: String, params: [String: Any], completion: @escaping (Result<[String: Any], SDKError>) -> Void) { + var requestParams : [String: Any] = [ + "stream": stream + ] + for (key, value) in params { + requestParams[key] = value + } + if self.deviceId == "" { + self.sessionQueue.pause() + sleep(5) + let dId = UserDefaults.standard.string(forKey: "device_id") ?? "" + self.deviceId = dId + requestParams["did"] = dId + self.sessionQueue.resume() + } + if let url = URL(string: baseURL + path) { + var request = URLRequest(url: url) + request.httpMethod = "POST" + + do { + request.httpBody = try JSONSerialization.data(withJSONObject: requestParams, options: .prettyPrinted) + } catch let error { + completion(.failure(.custom(error: "00001: \(error.localizedDescription)"))) + return + } + + request.addValue("application/json", forHTTPHeaderField: "Content-Type") + request.addValue("application/json", forHTTPHeaderField: "Accept") + + urlSession.postTask(with: request) { result in + switch result { + case .success(let (response, data)): + guard let statusCode = (response as? HTTPURLResponse)?.statusCode, 200 ..< 299 ~= statusCode else { + if let json = try? JSONSerialization.jsonObject(with: data) { + if let jsonObject = json as? [String:Any] { + if let status = jsonObject["status"] as? String, status == "error" { + if let errorMessage = jsonObject["message"] as? String { + completion(.failure(.custom(error: errorMessage))) + } + } + } + } + completion(.failure(.invalidResponse)) + return + } + do { + if data.isEmpty { + if path.contains("clicked") || path.contains("closed") || path.contains("received") { + completion(.success([:])) + return + } + } + let json = try JSONSerialization.jsonObject(with: data) + if let jsonObject = json as? [String: Any] { + completion(.success(jsonObject)) + } else { + completion(.failure(.decodeError)) + } + } catch { + completion(.failure(.decodeError)) + } + case .failure: + let networkManager = NetworkStatus.nManager + let connectionStatus = networkManager.connectionStatus + + if connectionStatus == .Online { + completion(.failure(.invalidResponse)) + } else if connectionStatus == .Offline { + completion(.failure(.networkOfflineError)) + } + } + }.resume() + } else { + completion(.failure(.invalidResponse)) + } + } + + func generateString(array : [String]) -> String { + let mapArray = array.map{ String($0) } + return mapArray.joined(separator: ",") + } + + private let jsonDecoder: JSONDecoder = { + let jsonDecoder = JSONDecoder() + jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + jsonDecoder.dateDecodingStrategy = .formatted(dateFormatter) + return jsonDecoder + }() +} + +extension Data { + mutating func append(_ string: String) { + if let data = string.data(using: .utf8) { + append(data) + } + } +} + + +extension URLSession { + func dataTask(with url: URL, result: @escaping (Result<(URLResponse, Data), Error>) -> Void) -> URLSessionDataTask { + return dataTask(with: url) { data, response, error in + if let error = error { + result(.failure(error)) + return + } + guard let response = response, let data = data else { + let error = NSError(domain: "error", code: 0, userInfo: nil) + result(.failure(error)) + return + } + result(.success((response, data))) + } + } + + func postTask(with request: URLRequest, result: @escaping (Result<(URLResponse, Data), Error>) -> Void) -> URLSessionDataTask { + return dataTask(with: request) { data, response, error in + if let error = error { + result(.failure(error)) + return + } + guard let response = response, let data = data else { + let error = NSError(domain: "error", code: 0, userInfo: nil) + result(.failure(error)) + return + } + result(.success((response, data))) + } + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift b/Pods/REES46/REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift new file mode 100644 index 0000000..b03be10 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift @@ -0,0 +1,395 @@ +import UIKit + +class StoriesCollectionViewPreviewCell: UICollectionViewCell { + + static let cellId = "NewStoriesPreviewCellId" + + var storyImage = UIImageView() + let storyBackCircle = UIView() + let storyWhiteBackCircle = UIView() + let storySuperClearBackCircle = UIView() + let storyAuthorNameLabel = UILabel() + let pinSymbolView = UIView() + let pinSymbolLabel = UILabel() + public let storiesBlockAnimatedLoader = StoriesSlideReloadIndicator() + + private var task: URLSessionDataTask? + + override init(frame: CGRect) { + super.init(frame: frame) + + let bgColor = UIColor(red: 214/255, green: 214/255, blue: 214/255, alpha: 0.8) + storyBackCircle.backgroundColor = .clear + storyBackCircle.contentMode = .scaleToFill + storyBackCircle.isUserInteractionEnabled = true + storyBackCircle.translatesAutoresizingMaskIntoConstraints = false + storyBackCircle.alpha = 1.0 + addSubview(storyBackCircle) + + storyWhiteBackCircle.backgroundColor = bgColor + storyWhiteBackCircle.contentMode = .scaleToFill + storyWhiteBackCircle.isHidden = true + storyWhiteBackCircle.translatesAutoresizingMaskIntoConstraints = false + storyBackCircle.addSubview(storyWhiteBackCircle) + + storySuperClearBackCircle.backgroundColor = .white + storySuperClearBackCircle.contentMode = .scaleToFill + storySuperClearBackCircle.isHidden = true + storySuperClearBackCircle.translatesAutoresizingMaskIntoConstraints = false + storyBackCircle.addSubview(storySuperClearBackCircle) + + storyImage.isHidden = false + storyImage.backgroundColor = bgColor + storyImage.alpha = 0.0 + storyImage.contentMode = .scaleAspectFit + storyImage.layer.masksToBounds = true + storyImage.translatesAutoresizingMaskIntoConstraints = false + storySuperClearBackCircle.addSubview(storyImage) + + storiesBlockAnimatedLoader.contentMode = .scaleToFill + storiesBlockAnimatedLoader.translatesAutoresizingMaskIntoConstraints = false + storiesBlockAnimatedLoader.lineWidth = SdkConfiguration.stories.iconBorderWidth + 1.6 //3.9 + storiesBlockAnimatedLoader.numSegments = Int(Double(Int.random(in: 9..<17))) + storiesBlockAnimatedLoader.animationDuration = Double(Int.random(in: 2..<3)) + storiesBlockAnimatedLoader.rotationDuration = 7 + storiesBlockAnimatedLoader.alpha = 0 + storyWhiteBackCircle.addSubview(storiesBlockAnimatedLoader) + + storyAuthorNameLabel.textAlignment = .center + storyAuthorNameLabel.numberOfLines = SdkConfiguration.stories.storiesBlockNumberOfLines + if SdkConfiguration.stories.storiesBlockCharWrapping { + storyAuthorNameLabel.lineBreakMode = .byTruncatingTail + } else { + storyAuthorNameLabel.lineBreakMode = .byWordWrapping //.byTruncatingTail + //storyAuthorNameLabel.allowsDefaultTighteningForTruncation = false + } + storyAuthorNameLabel.translatesAutoresizingMaskIntoConstraints = false + storyAuthorNameLabel.backgroundColor = bgColor + addSubview(storyAuthorNameLabel) + + pinSymbolView.backgroundColor = .white + pinSymbolView.translatesAutoresizingMaskIntoConstraints = false + pinSymbolView.isHidden = true + addSubview(pinSymbolView) + + pinSymbolLabel.text = "" + pinSymbolLabel.translatesAutoresizingMaskIntoConstraints = false + pinSymbolView.addSubview(pinSymbolLabel) + + makeStoiesBlockCollectionConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + task?.cancel() + } + + private func setImage(imagePathSdk: String) { + guard let url = URL(string: imagePathSdk) else { + return + } + + self.storyImage.load.request(with: url) + } + + public func configure(story: Story) { + setImage(imagePathSdk: story.avatar) + if SdkConfiguration.stories.storiesBlockCharWrapping { + storyAuthorNameLabel.text = "\(story.name)".truncWords(length: SdkConfiguration.stories.storiesBlockCharCountWrap) + } else { + storyAuthorNameLabel.text = "\(story.name)" + } + pinSymbolView.isHidden = !story.pinned + } + + func configureCell(settings: StoriesSettings?, viewed: Bool, viewedLocalKey: Bool, storyId: String) { + storyWhiteBackCircle.isHidden = false + storySuperClearBackCircle.isHidden = false + layoutIfNeeded() + + if let settings = settings { + storyAuthorNameLabel.font = SdkStyle.shared.currentColorScheme?.storiesBlockSelectFontName.withSize(SdkStyle.shared.currentColorScheme!.storiesBlockSelectFontSize) + let labelColor = settings.color.hexToRGB() + + storiesBlockAnimatedLoader.strokeColor = .white + storyAuthorNameLabel.backgroundColor = .clear + + if (SdkStyle.shared.currentColorScheme?.storiesBlockFontColor == UIColor.sdkDefaultBlackColor) { + storyAuthorNameLabel.textColor = UIColor(red: labelColor.red, green: labelColor.green, blue: labelColor.blue, alpha: 1) + } else { + if SdkConfiguration.isDarkMode { + storyAuthorNameLabel.textColor = SdkConfiguration.stories.storiesBlockTextColorChanged_Dark + } else { + storyAuthorNameLabel.textColor = SdkConfiguration.stories.storiesBlockTextColorChanged_Light + } + } + + if SdkConfiguration.stories.storiesBlockFontNameChanged != nil { + if SdkConfiguration.stories.storiesBlockMinimumFontSizeChanged != nil { + storyAuthorNameLabel.font = SdkStyle.shared.currentColorScheme?.storiesBlockSelectFontName.withSize(SdkStyle.shared.currentColorScheme!.storiesBlockSelectFontSize) + } else { + storyAuthorNameLabel.font = SdkStyle.shared.currentColorScheme?.storiesBlockSelectFontName + } + } else { + if SdkConfiguration.stories.storiesBlockMinimumFontSizeChanged != 0.0 { + let size = SdkStyle.shared.currentColorScheme?.storiesBlockSelectFontSize ?? 15.0 + storyAuthorNameLabel.font = .systemFont(ofSize: CGFloat(size)) + } else { + storyAuthorNameLabel.font = .systemFont(ofSize: CGFloat(settings.fontSize)) + } + } + + storyBackCircle.backgroundColor = .white + + let pinBgColor = settings.backgroundPin.hexToRGB() + if SdkConfiguration.stories.pinColor != "" { + var updPinColor = SdkConfiguration.stories.pinColor.hexToRGB() + + if SdkConfiguration.isDarkMode { + updPinColor = SdkConfiguration.stories.pinColorDarkMode.hexToRGB() + } + + pinSymbolView.backgroundColor = UIColor(red: updPinColor.red, green: updPinColor.green, blue: updPinColor.blue, alpha: 1) + } else { + pinSymbolView.backgroundColor = UIColor(red: pinBgColor.red, green: pinBgColor.green, blue: pinBgColor.blue, alpha: 1) + } + + pinSymbolLabel.text = settings.pinSymbol + + let storiesViewdBg = settings.borderViewed.hexToRGB() + let storiesNotViewBg = settings.borderNotViewed.hexToRGB() + + if (viewed) { + if SdkConfiguration.stories.iconViewedBorderColor == "" { + storyWhiteBackCircle.backgroundColor = viewed ? + UIColor(red: storiesViewdBg.red, green: storiesViewdBg.green, blue: storiesViewdBg.blue, alpha: 1) : + UIColor(red: storiesViewdBg.red, green: storiesViewdBg.green, blue: storiesViewdBg.blue, alpha: 1) + + storiesBlockAnimatedLoader.strokeColor = viewed ? + //UIColor(red: storiesViewdBg.red, green: storiesViewdBg.green, blue: storiesViewdBg.blue, alpha: 1) : + //UIColor(red: storiesNotViewBg.red, green: storiesNotViewBg.green, blue: storiesNotViewBg.blue, alpha: 1) + UIColor(red: 255/255, green: 118/255, blue: 0/255, alpha: 1) : + UIColor(red: 255/255, green: 118/255, blue: 0/255, alpha: 1) + } else { + var updViewedColor = SdkConfiguration.stories.iconViewedBorderColor.hexToRGB() + let animatedLoaderColor = SdkConfiguration.stories.iconAnimatedLoaderColor.hexToRGB() + + if SdkConfiguration.isDarkMode { + updViewedColor = SdkConfiguration.stories.iconViewedBorderColorDarkMode.hexToRGB() + } + + storyWhiteBackCircle.backgroundColor = UIColor(red: updViewedColor.red, green: updViewedColor.green, blue: updViewedColor.blue, alpha: 1) + + storiesBlockAnimatedLoader.strokeColor = UIColor(red: animatedLoaderColor.red, green: animatedLoaderColor.green, blue: animatedLoaderColor.blue, alpha: 1) + } + } else { + if SdkConfiguration.stories.iconNotViewedBorderColor == "" { + storyWhiteBackCircle.backgroundColor = viewedLocalKey ? + UIColor(red: storiesViewdBg.red, green: storiesViewdBg.green, blue: storiesViewdBg.blue, alpha: 1) : + UIColor(red: storiesNotViewBg.red, green: storiesNotViewBg.green, blue: storiesNotViewBg.blue, alpha: 1) + + storiesBlockAnimatedLoader.strokeColor = UIColor(red: storiesViewdBg.red, green: storiesViewdBg.green, blue: storiesViewdBg.blue, alpha: 1) + } else { + var updNotViewedColor = SdkConfiguration.stories.iconNotViewedBorderColor.hexToRGB() + let animatedLoaderColor = SdkConfiguration.stories.iconAnimatedLoaderColor.hexToRGB() + + if SdkConfiguration.isDarkMode { + updNotViewedColor = SdkConfiguration.stories.iconNotViewedBorderColorDarkMode.hexToRGB() + } + + storyWhiteBackCircle.backgroundColor = UIColor(red: updNotViewedColor.red, green: updNotViewedColor.green, blue: updNotViewedColor.blue, alpha: 1) + + storiesBlockAnimatedLoader.strokeColor = UIColor(red: animatedLoaderColor.red, green: animatedLoaderColor.green, blue: animatedLoaderColor.blue, alpha: 1) + } + } + storyWhiteBackCircle.layer.masksToBounds = true + if storyImage.image == nil { + if SdkConfiguration.stories.iconDisplayFormatSquare { + //Square implementation not needed corner + } else { + storyWhiteBackCircle.layer.cornerRadius = storyWhiteBackCircle.frame.width / 2 + } + } + + if SdkConfiguration.stories.iconViewedTransparency != SdkConfiguration.stories.defaultIconViewedTransparency { + UIView.animate(withDuration: 1.0, animations: { + self.storyImage.alpha = SdkConfiguration.stories.iconViewedTransparency + }) + } else { + if (viewed || viewedLocalKey) { + UIView.animate(withDuration: 1.0, animations: { + self.storyImage.alpha = 0.9 + }) + } else { + UIView.animate(withDuration: 1.0, animations: { + self.storyImage.alpha = 1.0 + }) + } + } + + storySuperClearBackCircle.backgroundColor = .white + storySuperClearBackCircle.alpha = 1.0 + storySuperClearBackCircle.layer.masksToBounds = true + if SdkConfiguration.stories.iconDisplayFormatSquare { + //Square implementation coming soon + } else { + storySuperClearBackCircle.layer.cornerRadius = storySuperClearBackCircle.frame.width / 2 + } + } else { + UIView.animate(withDuration: 1.0, animations: { + self.storyImage.alpha = 0.9 + }) + storyBackCircle.backgroundColor = .white + storyWhiteBackCircle.backgroundColor = .white + storySuperClearBackCircle.backgroundColor = .white + pinSymbolView.isHidden = true + } + + let sId = storyId + DispatchQueue.onceTechService(token: sId) { + + if SdkConfiguration.stories.storiesBlockPreloadIndicatorDisabled { + //Cell indicator disabled + } else { + UIView.animate(withDuration: 0.7, animations: { + self.storiesBlockAnimatedLoader.alpha = 1 + }) + } + storiesBlockAnimatedLoader.startAnimating() + + let preffixStart = Double(Int.random(in: 3..<5)) + let preffixEnd = Double(Int.random(in: 8..<11)) + DispatchQueue.main.asyncAfter(deadline: .now() + Double(Double.random(in: preffixStart.. SdkConfiguration.stories.iconSize) { + let delta = (SdkConfiguration.stories.labelWidth / 2) + 10 + storyAuthorNameLabel.leadingAnchor.constraint(equalTo: storyBackCircle.leadingAnchor, constant: -delta).isActive = true + storyAuthorNameLabel.trailingAnchor.constraint(equalTo: storyBackCircle.trailingAnchor, constant: delta).isActive = true + } else { + storyAuthorNameLabel.leadingAnchor.constraint(equalTo: storyBackCircle.leadingAnchor, constant: -10).isActive = true + storyAuthorNameLabel.trailingAnchor.constraint(equalTo: storyBackCircle.trailingAnchor, constant: 10).isActive = true + } + + pinSymbolView.bottomAnchor.constraint(equalTo: storyBackCircle.bottomAnchor).isActive = true + if SdkConfiguration.stories.iconDisplayFormatSquare { + pinSymbolView.trailingAnchor.constraint(equalTo: storyBackCircle.trailingAnchor, constant: 0).isActive = true + } else { + pinSymbolView.trailingAnchor.constraint(equalTo: storyBackCircle.trailingAnchor, constant: -4).isActive = true + } + pinSymbolView.heightAnchor.constraint(equalToConstant: 32).isActive = true + pinSymbolView.widthAnchor.constraint(equalToConstant: 32).isActive = true + + pinSymbolLabel.centerXAnchor.constraint(equalTo: pinSymbolView.centerXAnchor).isActive = true + pinSymbolLabel.centerYAnchor.constraint(equalTo: pinSymbolView.centerYAnchor).isActive = true + } + + public func showSdkPreloadIndicator() { + storiesBlockAnimatedLoader.startAnimating() + } + + public func hideSdkPreloadIndicator() { + storiesBlockAnimatedLoader.stopAnimating() + } + + override func layoutSubviews() { + super.layoutSubviews() + if SdkConfiguration.stories.iconDisplayFormatSquare { + //Square implementation coming soon + } else { + storyBackCircle.layer.cornerRadius = storyBackCircle.frame.width / 2 + storyImage.layer.cornerRadius = storyImage.frame.width / 2 + storyWhiteBackCircle.layer.cornerRadius = storyWhiteBackCircle.frame.width / 2 + storySuperClearBackCircle.layer.cornerRadius = storySuperClearBackCircle.frame.width / 2 + pinSymbolView.layer.cornerRadius = pinSymbolView.frame.width / 2 + + if storyImage.image == nil { + storyBackCircle.layer.cornerRadius = bounds.width / 2 + } + } + } +} + + +private extension UIColor { + private var rgbHexAlpha: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) { + var red = CGFloat.zero + var green = CGFloat.zero + var blue = CGFloat.zero + var alpha = CGFloat.zero + + guard getRed(&red, green: &green, blue: &blue, alpha: &alpha) else { + return (1.0, 1.0, 1.0, 1.0) + } + return (red, green, blue, alpha) + } + + static func == (lhs: UIColor, rhs: UIColor) -> Bool { + return lhs.rgbHexAlpha == rhs.rgbHexAlpha + } +} + + +extension String { + enum TruncationPosition { + case head + case middle + case tail + } + + public func truncWords(length: Int, trailing: String = "…") -> String { + if (self.count <= length) { + return self + } + var truncated = self.prefix(length) + while truncated.last != " " { + + guard truncated.count > length else { + break + } + truncated = truncated.dropLast() + } + return truncated + trailing + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift new file mode 100644 index 0000000..240b606 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift @@ -0,0 +1,33 @@ +import Foundation +import UIKit + +protocol ImageLoadingProtocol { + func loadImage(from url: URL, completion: @escaping (Result) -> Void) +} + +class DefaultImageLoader: ImageLoadingProtocol { + + func loadImage(from url: URL, completion: @escaping (Result) -> Void) { + let task = URLSession.shared.dataTask(with: url) { data, response, error in + DispatchQueue.main.async { + if let error = error { + completion(.failure(ImageLoaderError.networkError(error))) + return + } + + if let httpResponse = response as? HTTPURLResponse, !(200...299).contains(httpResponse.statusCode) { + completion(.failure(ImageLoaderError.serverError(httpResponse.statusCode))) + return + } + + guard let data = data, let image = UIImage(data: data) else { + completion(.failure(ImageLoaderError.dataConversionError)) + return + } + + completion(.success(image)) + } + } + task.resume() + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift new file mode 100644 index 0000000..e29d781 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift @@ -0,0 +1,8 @@ +import Foundation +import UIKit + +public struct ImageData { + let url: URL + let image: UIImage? + let error: Error? +} diff --git a/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift new file mode 100644 index 0000000..2ead731 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift @@ -0,0 +1,21 @@ +import Foundation + +enum ImageLoaderError: Error { + case networkError(Error) + case serverError(Int) + case dataConversionError + case unknownError + + var localizedDescription: String { + switch self { + case .networkError(let error): + return error.localizedDescription + case .serverError(let statusCode): + return "Server returned status code \(statusCode)" + case .dataConversionError: + return "Failed to convert data to image" + case .unknownError: + return "An unknown error occurred" + } + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift new file mode 100644 index 0000000..a2153db --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift @@ -0,0 +1,6 @@ +import Foundation +import UIKit + +protocol ImageLoading { + func loadImage(from url: URL, completion: @escaping (Result) -> Void) +} diff --git a/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift new file mode 100644 index 0000000..8214b80 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift @@ -0,0 +1,9 @@ +import UIKit + +protocol SlideView: AnyObject { + func showLoadingIndicator() + func hideLoadingIndicator() + func showImage(_ image: UIImage) + func showError() + func showReloadButton() +} diff --git a/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift new file mode 100644 index 0000000..8aeab43 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift @@ -0,0 +1,142 @@ +import UIKit + +public class SlideViewController: UIViewController, SlideView { + + var imageView: UIImageView! + var loadingIndicator: UIActivityIndicatorView! + var reloadButton: UIButton! + var errorLabel: UILabel! + var loadTimer: Timer? + var autoReloadTimer: Timer? + var currentURL: URL? + private var reloadTimer: Timer? + private let imageLoader: ImageLoadingProtocol + + struct Constants { + static let imageURL = URL(string: "https://example.com/image.jpg")! + static let loadingTimeout: TimeInterval = 15 + static let reloadIconName = "iconReload" + static let messageKey = "error_message_failed_to_load" + static let errorMessageComment = "Error message for failed data loading" + } + + init(imageLoader: ImageLoadingProtocol) { + self.imageLoader = imageLoader + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func viewDidLoad() { + super.viewDidLoad() + setupUI() + loadImage(from: Constants.imageURL) + loadTimer = Timer.scheduledTimer(timeInterval: Constants.loadingTimeout, target: self, selector: #selector(checkLoadingTimeout), userInfo: nil, repeats: false) + } + + func setupUI() { + imageView = UIImageView(frame: view.bounds) + imageView.contentMode = .scaleAspectFit + view.addSubview(imageView) + + if #available(iOS 13.0, *) { + loadingIndicator = UIActivityIndicatorView(style: .large) + } + loadingIndicator.center = view.center + view.addSubview(loadingIndicator) + + reloadButton = UIButton(type: .system) + reloadButton.setImage(UIImage(named: Constants.reloadIconName), for: .normal) + reloadButton.frame = CGRect(x: (view.bounds.width - 50) / 2, y: view.bounds.height / 2 - 25, width: 50, height: 50) + reloadButton.addTarget(self, action: #selector(reloadData), for: .touchUpInside) + reloadButton.isHidden = true + view.addSubview(reloadButton) + + errorLabel = UILabel(frame: CGRect(x: 20, y: view.bounds.height / 2 + 50, width: view.bounds.width - 40, height: 50)) + errorLabel.textAlignment = .center + errorLabel.numberOfLines = 0 + errorLabel.isHidden = true + view.addSubview(errorLabel) + } + + func showLoadingIndicator() { + loadingIndicator.startAnimating() + reloadButton.isHidden = true + errorLabel.isHidden = true + } + + func hideLoadingIndicator() { + loadingIndicator.stopAnimating() + } + + func showImage(_ image: UIImage) { + hideLoadingIndicator() + imageView.image = image + } + + func showError() { + hideLoadingIndicator() + errorLabel.text = NSLocalizedString(Constants.messageKey, comment: Constants.errorMessageComment) + + errorLabel.isHidden = false + reloadButton.isHidden = false + + autoReloadTimer = Timer.scheduledTimer(timeInterval: Constants.loadingTimeout, target: self, selector: #selector(reloadData), userInfo: nil, repeats: false) + } + + func showReloadButton() { + hideLoadingIndicator() + reloadButton.isHidden = false + } + + @objc func reloadData() { + if let url = currentURL { + loadImage(from: url) + } + } + + @objc func checkLoadingTimeout() { + if imageView.image == nil { + showReloadButton() + } + } + + func loadImage(from url: URL) { + currentURL = url + showLoadingIndicator() + startLoadingTimeout() + + let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in + DispatchQueue.main.async { + guard let self = self else { return } + self.loadTimer?.invalidate() + + if let error = error { + self.showError() + return + } + + if let httpResponse = response as? HTTPURLResponse, !(200...299).contains(httpResponse.statusCode) { + self.showError() + return + } + + guard let data = data, let image = UIImage(data: data) else { + self.showError() + return + } + + self.showImage(image) + } + } + task.resume() + } + + private func startLoadingTimeout() { + reloadTimer = Timer.scheduledTimer(withTimeInterval: Constants.loadingTimeout, repeats: false) { [weak self] _ in + self?.showReloadButton() + } + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoriesView.swift b/Pods/REES46/REES46/Classes/Stories/StoriesView.swift new file mode 100644 index 0000000..5162753 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoriesView.swift @@ -0,0 +1,373 @@ +import Foundation +import UIKit + +public protocol StoriesCommunicationProtocol: AnyObject { + func receiveIosLink(text: String) + func receiveSelectedProductData(products: StoriesElement) + func receiveSelectedCarouselProductData(products: StoriesProduct) + func receiveSelectedPromocodeProductData(promoCodeSlide: StoriesPromoCodeElement) +} + +public protocol StoriesViewLinkProtocol: AnyObject { + func linkIosExternalUse(url: String) + func sendStructSelectedStorySlide(storySlide: StoriesElement) + func structOfSelectedCarouselProduct(product: StoriesProduct) + func sendStructSelectedPromocodeSlide(promoCodeSlide: StoriesPromoCodeElement) + func reloadStoriesCollectionSubviews() + func updateBgColor() +} + +public class StoriesView: UIView, UINavigationControllerDelegate { + + let cellId = "StoriesCollectionViewPreviewCell" + + private var collectionView: UICollectionView = { + let testFrame = CGRect(x: 0, y: 0, width: 300, height: 135) + let layout = UICollectionViewFlowLayout() + //layout.horizontalAlignment = .left + layout.minimumLineSpacing = 10 + layout.minimumInteritemSpacing = 10 + layout.scrollDirection = .horizontal + + layout.itemSize = CGSize(width: SdkConfiguration.stories.iconSize, height: 135) + layout.sectionInset = UIEdgeInsets(top: 0, left: SdkConfiguration.stories.iconMarginX, bottom: 0, right: SdkConfiguration.stories.iconMarginX) + + let collectionView = UICollectionView(frame: testFrame, collectionViewLayout: layout) + collectionView.showsHorizontalScrollIndicator = false + collectionView.showsVerticalScrollIndicator = false + return collectionView + }() + + private var stories: [Story]? + private var settings: StoriesSettings? + private var sdk: PersonalizationSDK? + + public weak var communicationDelegate: StoriesCommunicationProtocol? + + private var mainVC: UIViewController? + private var code: String = "" + + private var isInDownloadMode: Bool = true + + override init(frame: CGRect) { + super.init(frame: frame) + commonInit() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + commonInit() + } + + private func commonInit() { + self.addSubview(collectionView) + + collectionView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint(item: collectionView, attribute: NSLayoutConstraint.Attribute.left, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self, attribute: NSLayoutConstraint.Attribute.left, multiplier: 1, constant: 0).isActive = true + NSLayoutConstraint(item: collectionView, attribute: NSLayoutConstraint.Attribute.right, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self, attribute: NSLayoutConstraint.Attribute.right, multiplier: 1, constant: 0).isActive = true + NSLayoutConstraint(item: collectionView, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: 0).isActive = true + NSLayoutConstraint(item: collectionView, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1, constant: 0).isActive = true + configureView() + + NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil) + } + + @objc + func willEnterForeground() { + // + } + + @objc + func didEnterBackground() { + // + } + + public override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + let userInterfaceStyle = traitCollection.userInterfaceStyle + if UIApplication.shared.applicationState == .inactive { + switch userInterfaceStyle { + case .unspecified: + DispatchQueue.main.async { + self.collectionView.backgroundColor = SdkConfiguration.stories.storiesBlockBackgroundColorChanged_Light + self.reloadStoriesCollectionSubviews() + self.updateBgColor() + } + case .light: + DispatchQueue.main.async { + self.collectionView.backgroundColor = SdkConfiguration.stories.storiesBlockBackgroundColorChanged_Light + self.reloadStoriesCollectionSubviews() + self.updateBgColor() + } + case .dark: + DispatchQueue.main.async { + self.collectionView.backgroundColor = SdkConfiguration.stories.storiesBlockBackgroundColorChanged_Dark + self.reloadStoriesCollectionSubviews() + self.updateBgColor() + } + @unknown default: + break + } + } else { + DispatchQueue.main.async { + self.updateBgColor() + } + } + } + + private func configureView() { + collectionView.delegate = self + collectionView.dataSource = self + collectionView.register(StoriesCollectionViewPreviewCell.self, forCellWithReuseIdentifier: StoriesCollectionViewPreviewCell.cellId) + self.setBgColor() + + UserDefaults.standard.set(false, forKey: "MuteSoundSetting") + } + + public func configure(sdk: PersonalizationSDK, mainVC: UIViewController, code: String) { + self.sdk = sdk + self.mainVC = mainVC + self.code = code + loadStoriesData() + } + + private func setBgColor() { + if SdkConfiguration.isDarkMode { + DispatchQueue.main.async { + self.collectionView.backgroundColor = SdkConfiguration.stories.storiesBlockBackgroundColorChanged_Dark + self.reloadStoriesCollectionSubviews() + } + } else { + DispatchQueue.main.async { + self.collectionView.backgroundColor = SdkConfiguration.stories.storiesBlockBackgroundColorChanged_Light + self.reloadStoriesCollectionSubviews() + } + } + } + + private func setBgColor(color: String) { + let hex = color.hexToRGB() + DispatchQueue.main.async { + self.collectionView.backgroundColor = UIColor(red: hex.red, green: hex.green, blue: hex.blue, alpha: 0) + } + } + + private func loadStoriesData() { + sdk?.getStories(code: code) { result in + switch result { + case let .success(response): + self.stories = response.stories + self.settings = response.settings + DispatchQueue.main.async { + self.isInDownloadMode = false + self.collectionView.reloadData() + } + case let .failure(error): + switch error { + case let .custom(customError): + print("Error:", customError) + default: + print("Error:", error.description) + } + } + } + } + + public func pauseStoryNow() { + NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ExternalActionStoryPause"), object: nil) + } + + public func playStoryNow() { + NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ExternalActionStoryPlay"), object: nil) + } +} + + +extension StoriesView: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + public func numberOfSections(in collectionView: UICollectionView) -> Int { + return 1 + } + + public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return isInDownloadMode ? 4 : stories?.count ?? 0 + } + + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { + if (SdkConfiguration.stories.labelWidth > SdkConfiguration.stories.iconSize) { + return SdkConfiguration.stories.labelWidth / 2 + SdkConfiguration.stories.iconMarginX * 2 + } else { + return 18 + } + } + + public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: StoriesCollectionViewPreviewCell.cellId, for: indexPath) as? StoriesCollectionViewPreviewCell else {return UICollectionViewCell()} + + if let currentStory = stories?[indexPath.row] { + + let storyId = currentStory.id + let storyName = "viewed.slide." + storyId + + var allStoriesMainArray: [String] = [] + for (index, _) in currentStory.slides.enumerated() { + //print("Story has \(index + 1): \(currentStory.slides[(index)].id)") + allStoriesMainArray.append(currentStory.slides[(index)].id) + } + + let viewedSlidesStoriesCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(storyName)) as? [String] ?? [] + if (viewedSlidesStoriesCachedArray.count == allStoriesMainArray.count) { + cell.configureCell(settings: settings, viewed: currentStory.viewed, viewedLocalKey: true, storyId: currentStory.id) + cell.configure(story: currentStory) + } else { + cell.configureCell(settings: settings, viewed: currentStory.viewed, viewedLocalKey: false, storyId: currentStory.id) + cell.configure(story: currentStory) + } + } else { + if (isInDownloadMode && stories == nil) { + cell.storyBackCircle.alpha = 0.0 + + var placeholderColor = SdkConfiguration.stories.iconPlaceholderColor.hexToRGB() + + if SdkConfiguration.isDarkMode { + placeholderColor = SdkConfiguration.stories.iconPlaceholderColorDarkMode.hexToRGB() + } + + cell.storyBackCircle.backgroundColor = UIColor(red: placeholderColor.red, green: placeholderColor.green, blue: placeholderColor.blue, alpha: 1.0) + UIView.animate(withDuration: 5.0, animations: { + cell.storyBackCircle.alpha = 1.0 + }) + } + } + + return cell + } + + public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + showStoriesByUserClick(at: indexPath.row) + } + + public func showStories() { + guard let firstStory = stories?.first else { + return + } + + guard let index = stories?.firstIndex(where: { $0.id == firstStory.id }) else { + return + } + + showStories(at: index, for: firstStory) + } + private func showStoriesByUserClick(at index: Int) { + guard let story = stories?[index] else { + return + } + + showStories(at: index, for: story) + } + + private func showStories(at index: Int, for story: Story) { + let storyVC = StoryViewController() + storyVC.sdkLinkDelegate = self + storyVC.sdk = sdk + storyVC.stories = stories ?? [] + + let sId = "viewed.slide." + story.id + + var allSlidesIDs: [String] = [] + for slide in story.slides { + allSlidesIDs.append(slide.id) + } + + let viewedSlidesCachedIDs: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(sId)) as? [String] ?? [] + + if let lastViewedSlideID = viewedSlidesCachedIDs.last, + let defaultIndex = allSlidesIDs.firstIndex(of: lastViewedSlideID) { + let nextIndex = defaultIndex + 1 + storyVC.currentPosition = IndexPath(row: nextIndex, section: index) + storyVC.startWithIndexPath = IndexPath(row: nextIndex, section: index) + } else { + storyVC.currentPosition = IndexPath(row: story.startPosition, section: index) + storyVC.startWithIndexPath = IndexPath(row: story.startPosition, section: index) + } + + storyVC.modalPresentationStyle = .fullScreen + mainVC?.present(storyVC, animated: true) + } +} + + +extension StoriesView: StoriesViewLinkProtocol { + public func sendStructSelectedStorySlide(storySlide: StoriesElement) { + self.communicationDelegate?.receiveSelectedProductData(products: storySlide) + print("\nSDK Received story slide button tap links for external use:") + printSlideObject(objElementClass: storySlide) + } + + public func structOfSelectedCarouselProduct(product: StoriesProduct) { + self.communicationDelegate?.receiveSelectedCarouselProductData(products: product) + print("\nSDK Received carousel selected product link for external use:") + printCarouselObject(objProductClass: product) + } + + public func sendStructSelectedPromocodeSlide(promoCodeSlide: StoriesPromoCodeElement) { + self.communicationDelegate?.receiveSelectedPromocodeProductData(promoCodeSlide: promoCodeSlide) + print("\nSDK Received promocode slide button tap links for external use:") + printPromoObject(objPromoClass: promoCodeSlide) + } + + public func linkIosExternalUse(url: String) { + self.communicationDelegate?.receiveIosLink(text: url) + print("\nSDK Received linkIos for external use: \(url)\n\n") + } + + public func reloadStoriesCollectionSubviews() { + UICollectionView.performWithoutAnimation { + self.collectionView.layoutIfNeeded() + self.collectionView.reloadData() + } + } + + public func updateBgColor() { + DispatchQueue.main.async { + self.collectionView.reloadItems(at: self.collectionView.indexPathsForVisibleItems) + self.setBgColor() + } + } + + public func printSlideObject(objElementClass: StoriesElement) { + print("Deeplink iOS: \(objElementClass.deeplinkIos ?? "")") + print("Link iOS: \(objElementClass.linkIos ?? "")") + print("Link Web: \(objElementClass.link ?? "")") + } + + public func printCarouselObject(objProductClass: StoriesProduct) { + print("ProductName: \(objProductClass.name)") + print("ProductUrl: \(objProductClass.url)") + print("ProductCategory: \(objProductClass.category.name)") + print("ProductCategoryUrl: \(objProductClass.category.url)") + print("ProductPrice: \(objProductClass.price)") + print("ProductPriceFormatted: \(objProductClass.price_formatted)") + print("ProductPicture: \(objProductClass.picture)\n\n") + } + + public func printPromoObject(objPromoClass: StoriesPromoCodeElement) { + print("Deeplink iOS: \(objPromoClass.deeplinkIos )") + print("Link Web: \(objPromoClass.url )") + } +} + +class CustomCollectionViewCell: UICollectionViewCell { + override var isSelected: Bool { + didSet { + contentView.backgroundColor = isSelected ? .red : .white + } + } +} + + +extension UIViewController { + func embedInNavigationController() -> UINavigationController { + return UINavigationController(rootViewController: self) + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift new file mode 100644 index 0000000..15d7779 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift @@ -0,0 +1,1124 @@ +import UIKit +import AVKit +import AVFoundation + +protocol StoryCollectionViewCellDelegate: AnyObject { + func didTapUrlButton(url: String, slide: Slide) + func didTapOpenLinkExternalServiceMethod(url: String, slide: Slide) + func sendStructSelectedStorySlide(storySlide: StoriesElement) + func sendStructSelectedPromocodeSlide(promoCodeSlide: StoriesPromoCodeElement) + func openProductsCarouselView(withProducts: [StoriesProduct], hideLabel: String) + func closeProductsCarousel() +} + +class StoryCollectionViewCell: UICollectionViewCell { + + static let cellId = "StoryCollectionViewCellId" + + let videoView = UIView() + let storySlideImageView = UIImageView() + let storyButton = StoryButton() + let productsButton = ProductsButton() + let muteButton = UIButton() + let reloadButton = ReloadButton() + + private var currentSlide: Slide? + private var selectedElement: StoriesElement? + private var selectedProductsElement: StoriesElement? + private var selectedPromoCodeElement: StoriesPromoCodeElement? + + public let productWithPromocodeSuperview = PromoCodeView() + public let promocodeBannerView = PromocodeBanner(location: PromocodeBannerLocation.bottomLeft) + public var sdkPopupAlertView = SdkPopupAlertView(title: SdkConfiguration.stories.defaultCopyToClipboardMessageText) + + public weak var cellDelegate: StoryCollectionViewCellDelegate? + public weak var mainStoriesDelegate: StoriesViewLinkProtocol? + + private var customConstraints = [NSLayoutConstraint]() + + var player = AVPlayer() + private let timeObserverKeyPath: String = "timeControlStatus" + + private var audioSession: AVAudioSession! + var outputVolumeObservation: NSKeyValueObservation? + + fileprivate let kVolumeKey = "volume" + fileprivate var kAudioLevel : Float = 0.0 + + override init(frame: CGRect) { + super.init(frame: frame) + + promocodeBannerView.removeFromSuperview() + + if currentSlide?.backgroundColor != nil { + //let color = currentSlide?.backgroundColor.hexToRGB() + //self.backgroundColor = UIColor(red: color!.red, green: color!.green, blue: color!.blue, alpha: 1) + } else { + self.backgroundColor = .black + } + videoView.backgroundColor = .black + + NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil) + + NotificationCenter.default.addObserver(self, selector: #selector(pauseVideo(_:)), name: .init(rawValue: "PauseVideoLongTap"), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(playVideo(_:)), name: .init(rawValue: "PlayVideoLongTap"), object: nil) + + audioSession = AVAudioSession.sharedInstance() + listenVolumeButton() + + videoView.contentMode = .scaleToFill + videoView.isOpaque = true + videoView.clearsContextBeforeDrawing = true + videoView.autoresizesSubviews = true + videoView.translatesAutoresizingMaskIntoConstraints = false + addSubview(videoView) + + storySlideImageView.contentMode = .scaleAspectFit + storySlideImageView.clipsToBounds = true + storySlideImageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(storySlideImageView) + + productWithPromocodeSuperview.translatesAutoresizingMaskIntoConstraints = false + productWithPromocodeSuperview.isHidden = true + productWithPromocodeSuperview.autoresizesSubviews = true + addSubview(productWithPromocodeSuperview) + + storyButton.translatesAutoresizingMaskIntoConstraints = false + storyButton.setTitle("Continue", for: .normal) + storyButton.addTarget(self, action: #selector(didTapButton), for: .touchUpInside) + addSubview(storyButton) + + productsButton.translatesAutoresizingMaskIntoConstraints = false + productsButton.setTitle("Continue", for: .normal) + productsButton.addTarget(self, action: #selector(didTapOnProductsButton), for: .touchUpInside) + addSubview(productsButton) + + self.setMuteButtonToDefault() + + makeConstraints() + } + + public func configure(slide: Slide) { + self.currentSlide = slide + + // Set the background color + setupBackgroundColor() + + // Hide sdkPopupAlertView if it exists + hideSdkPopupAlertIfNeeded() + + // Delete previous text blocks + removePreviousTextBlocks() + + // Setting for video or image + configureMedia(for: slide) + + // Create and configure text blocks + setupTextBlocks(for: slide.elements) + + // Button configuration + configureButtons(for: slide) + + // Move important subviews to the top + bringImportantSubviewsToFront() + } + + private func setupBackgroundColor() { + if let backgroundColorHex = currentSlide?.backgroundColor, !backgroundColorHex.isEmpty { + let color = backgroundColorHex.hexToRGB() + self.backgroundColor = UIColor(red: color.red, green: color.green, blue: color.blue, alpha: 1) + } else { + self.backgroundColor = UIColor.black + } + } + + private func hideSdkPopupAlertIfNeeded() { + if sdkPopupAlertView.window != nil { + hideSdkPopupAlertView() + } + } + + private func removePreviousTextBlocks() { + self.subviews.filter { $0 is TextBlockView || $0 is UIStackView }.forEach { $0.removeFromSuperview() } + } + + private func configureMedia(for slide: Slide) { + if slide.type == .video { + configureVideoView(for: slide) + } else { + configureImageView(for: slide) + } + } + + private func setupTextBlocks(for elements: [StoriesElement]) { + let textBlockViews = elements + .filter { $0.type == .textBlock } + .map { TextBlockConfiguration(from: $0) } + .map { TextBlockView(with: $0) } + + guard !textBlockViews.isEmpty else { return } + + let stackView = createStackView() + addStackView(stackView) + + for textBlockView in textBlockViews { + stackView.addArrangedSubview(textBlockView) + } + + addSpacers(to: stackView, with: textBlockViews) + } + + private func createStackView() -> UIStackView { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.distribution = .equalSpacing + stackView.spacing = 32 + stackView.translatesAutoresizingMaskIntoConstraints = false + return stackView + } + + private func addStackView(_ stackView: UIStackView) { + addSubview(stackView) + + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor, constant: 16), + stackView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -16), + stackView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 16), + stackView.bottomAnchor.constraint(lessThanOrEqualTo: safeAreaLayoutGuide.bottomAnchor, constant: -32) + ]) + } + + private func addSpacers(to stackView: UIStackView, with textBlockViews: [TextBlockView]) { + if let firstTextBlockView = textBlockViews.first { + let topSpacingView = UIView() + topSpacingView.translatesAutoresizingMaskIntoConstraints = false + topSpacingView.heightAnchor.constraint(equalToConstant: 32).isActive = true + stackView.addArrangedSubview(topSpacingView) + + stackView.addArrangedSubview(firstTextBlockView) + } + + for index in 1.. 0 { + let soundSetting: Bool = UserDefaults.standard.bool(forKey: "MuteSoundSetting") + player.volume = soundSetting ? 1 : 0 + muteButton.isHidden = false + updateMuteButtonImage(isMuted: !soundSetting) + } else { + muteButton.isHidden = true + } + + self.videoView.layer.addSublayer(playerLayer) + player.play() + UserDefaults.standard.set(currentSlide!.id, forKey: "LastViewedSlideMemorySetting") + } else { + muteButton.isHidden = true + storySlideImageView.isHidden = false + videoView.isHidden = true + if let preview = slide.previewImage { + self.storySlideImageView.image = preview + } + } + } + + private func updateMuteButtonImage(isMuted: Bool) { + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + let imageName = isMuted ? "iconStoryMute" : "iconStoryVolumeUp" + muteButton.setImage(UIImage(named: imageName, in: frameworkBundle, compatibleWith: nil), for: .normal) + } + + private func configureImageView(for slide: Slide) { + muteButton.isHidden = true + storySlideImageView.isHidden = false + videoView.isHidden = true + + if let image = slide.downloadedImage { + storySlideImageView.image = image + } + } + + private func setImage(imagePath: String) { + guard let url = URL(string: imagePath) else { + return + } + + let task = URLSession.shared.dataTask(with: url, completionHandler: { data, _, error in + if error == nil { + guard let unwrappedData = data, let image = UIImage(data: unwrappedData) else { + return + } + DispatchQueue.main.async { + self.storySlideImageView.tintColor = UIColor.black + self.storySlideImageView.isOpaque = false + self.storySlideImageView.image = image + } + } else { + self.sdkErrorReloadTapHandle() + } + }) + task.resume() + } + + func listenVolumeButton() { + do { + try audioSession.setActive(true, options: []) + audioSession.addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) + kAudioLevel = audioSession.outputVolume + } catch { + print("SDK Output volume listener error") + } + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "outputVolume"{ + if audioSession.outputVolume > kAudioLevel { + kAudioLevel = audioSession.outputVolume + + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + do { + try audioSession.setCategory(.playback, mode: .default, options: []) + player.volume = audioSession.outputVolume + muteButton.setImage(UIImage(named: "iconStoryVolumeUp", in: frameworkBundle, compatibleWith: nil), for: .normal) + UserDefaults.standard.set(true, forKey: "MuteSoundSetting") + } catch let error { + player.volume = audioSession.outputVolume + muteButton.setImage(UIImage(named: "iconStoryMute", in: frameworkBundle, compatibleWith: nil), for: .normal) + print("Error in AVAudio Session\(error.localizedDescription)") + } + } + if audioSession.outputVolume < kAudioLevel { + player.volume = audioSession.outputVolume + } + if audioSession.outputVolume > 0.999 { + kAudioLevel = 0.9375 + } + if audioSession.outputVolume < 0.001 { + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + kAudioLevel = 0.0625 + muteButton.setImage(UIImage(named: "iconStoryMute", in: frameworkBundle, compatibleWith: nil), for: .normal) + UserDefaults.standard.set(false, forKey: "MuteSoundSetting") + } + } + } + + @objc + private func didTapOnMute() { + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + if player.volume == 1.0 { + player.volume = 0.0 + muteButton.setImage(UIImage(named: "iconStoryMute", in: frameworkBundle, compatibleWith: nil), for: .normal) + UserDefaults.standard.set(false, forKey: "MuteSoundSetting") + } else { + player.volume = 1.0 + do { + try audioSession.setCategory(.playback, mode: .default, options: []) + } catch let error { + print("SDK Error in AVAudio Session\(error.localizedDescription)") + } + + muteButton.setImage(UIImage(named: "iconStoryVolumeUp", in: frameworkBundle, compatibleWith: nil), for: .normal) + UserDefaults.standard.set(true, forKey: "MuteSoundSetting") + } + } + + private func setMuteButtonToDefault() { + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + + let soundSetting: Bool = UserDefaults.standard.bool(forKey: "MuteSoundSetting") + if soundSetting { + player.volume = 1 + muteButton.setImage(UIImage(named: "iconStoryVolumeUp", in: frameworkBundle, compatibleWith: nil), for: .normal) + UserDefaults.standard.set(true, forKey: "MuteSoundSetting") + } else { + player.volume = 0 + muteButton.setImage(UIImage(named: "iconStoryMute", in: frameworkBundle, compatibleWith: nil), for: .normal) + UserDefaults.standard.set(false, forKey: "MuteSoundSetting") + } + + muteButton.translatesAutoresizingMaskIntoConstraints = false + muteButton.isHidden = true + muteButton.addTarget(self, action: #selector(didTapOnMute), for: .touchUpInside) + addSubview(muteButton) + } + + @objc + func sdkNilTap(_ sender: UITapGestureRecognizer? = nil) { + // + } + + @objc + func sdkErrorReloadTapHandle(_ sender: UITapGestureRecognizer? = nil) { + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + let errorIcon = UIImage(named: "iconError", in: frameworkBundle, compatibleWith: nil)?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate) + + if #available(iOS 13.0, *) { + let popupView = SdkPopupAlertView( + title: "", + titleFont: .systemFont(ofSize: 5, weight: .light), + subtitle: SdkConfiguration.stories.storiesSlideReloadPopupMessageError, + subtitleFont: .systemFont(ofSize: SdkConfiguration.stories.storiesSlideReloadPopupMessageFontSize, weight: SdkConfiguration.stories.storiesSlideReloadPopupMessageFontWeight), + icon: errorIcon, + iconSpacing: 16, + position: .centerCustom, + onTap: { print("SDK Alert popup tapped") + } + ) + popupView.displayRealAlertTime = SdkConfiguration.stories.storiesSlideReloadPopupMessageDisplayTime + popupView.show() + } + } + + func displayPromocodeBanner(promoTitle: String?, promoCodeData: StoriesPromoCodeElement) { + + let screenSize: CGRect = UIScreen.main.bounds + promocodeBannerView.size = CGSize(width: screenSize.width - 32, height: 68) + promocodeBannerView.cornerRadius = 6 + promocodeBannerView.displayTime = 0 + promocodeBannerView.padding = (16, 90) + promocodeBannerView.animationDuration = 0.0 //0.75 + + let presentedBannerLabel = UILabel() + var bgPriceSectionColor = UIColor(red: 252/255, green: 107/255, blue: 63/255, alpha: 1.0) + if SdkConfiguration.stories.bannerPriceSectionBackgroundColor != nil { + bgPriceSectionColor = SdkConfiguration.stories.bannerPriceSectionBackgroundColor! + } + presentedBannerLabel.backgroundColor = bgPriceSectionColor + + let codePromo = promoCodeData.promocode + let clearPriceText = "" + let clearPriceAttributedString = NSMutableAttributedString(string:clearPriceText) + + var oldPriceText = " " + if promoCodeData.oldprice != 0 { + //if Int(promoData.oldprice) >= Int(promoData.price) + oldPriceText = " " + String(promoCodeData.oldprice_formatted) + if (promoCodeData.oldprice_formatted == "") { + oldPriceText = " " + String(promoCodeData.oldprice) + } + + var oldPriceTextColorBySdk = UIColor.white.withAlphaComponent(0.7) + if SdkConfiguration.stories.bannerOldPriceSectionFontColor != nil { + oldPriceTextColorBySdk = (SdkConfiguration.stories.bannerOldPriceSectionFontColor?.withAlphaComponent(0.7))! + } + + var promocodeBannerFontNameBySdk = UIFont.systemFont(ofSize: 16, weight: .heavy) + if SdkConfiguration.stories.promoCodeSlideFontNameChanged != nil { + promocodeBannerFontNameBySdk = UIFont(name: SdkConfiguration.stories.promoCodeSlideFontNameChanged!, size: 16)! + } + + var oldPriceTextAttrs = [NSAttributedString.Key.font: promocodeBannerFontNameBySdk, + NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.single.rawValue, + .foregroundColor: oldPriceTextColorBySdk] as [NSAttributedString.Key: Any] + + if oldPriceText.utf16.count >= 10 { + //oldPriceText = " " + String(promoData.oldprice) + oldPriceTextAttrs = [NSAttributedString.Key.font: promocodeBannerFontNameBySdk, + NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.single.rawValue, + .foregroundColor: oldPriceTextColorBySdk] as [NSAttributedString.Key: Any] + } + + let boldString = NSMutableAttributedString(string: oldPriceText, attributes:oldPriceTextAttrs) + clearPriceAttributedString.append(boldString) + + clearPriceAttributedString.addAttributes([ + .strikethroughColor: oldPriceTextColorBySdk.withAlphaComponent(0.5) + ], range: NSRange(location: 0, length: oldPriceText.count)) + + let spaceText = " \n" + let attrsSpace = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 1, weight: .thin), .foregroundColor: UIColor.white] + let boldStringSpace = NSMutableAttributedString(string: spaceText, attributes:attrsSpace) + clearPriceAttributedString.append(boldStringSpace) + } + + var formattedPriceWithPromocode = String(promoCodeData.price_with_promocode_formatted) + if formattedPriceWithPromocode == "" { + formattedPriceWithPromocode = String(promoCodeData.price_formatted) + } + let currentCurrency = promoCodeData.currency + let replaceCurrencyPriceWithPromocode = formattedPriceWithPromocode.replacingOccurrences(of: currentCurrency, with: "") + + let newPriceText = " " + replaceCurrencyPriceWithPromocode + + var priceSectionFontColorBySdk = UIColor.white + if SdkConfiguration.stories.bannerPriceSectionFontColor != nil { + priceSectionFontColorBySdk = SdkConfiguration.stories.bannerPriceSectionFontColor! + } + + var newPriceTextAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 28, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + if newPriceText.utf16.count <= 10 { + newPriceTextAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 26, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } else if newPriceText.utf16.count <= 11 { + newPriceTextAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 25, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } else if newPriceText.utf16.count <= 12 { + newPriceTextAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 23, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } else if newPriceText.utf16.count <= 16 { + newPriceTextAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } else { + newPriceTextAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } + + let boldString = NSMutableAttributedString(string: newPriceText, attributes:newPriceTextAttributes) + clearPriceAttributedString.append(boldString) + + let currencyText = " " + promoCodeData.currency + var currencyTextAttrs = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 19, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + if newPriceText.utf16.count <= 10 { + currencyTextAttrs = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 26, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } else if newPriceText.utf16.count <= 11 { + currencyTextAttrs = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 25, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } else if newPriceText.utf16.count <= 12 { + currencyTextAttrs = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 23, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } else if newPriceText.utf16.count <= 16 { + currencyTextAttrs = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } else { + currencyTextAttrs = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14, weight: .black), .foregroundColor: priceSectionFontColorBySdk] + } + + //let currencyTextAttrs = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 19, weight: .black), .foregroundColor: UIColor.white] + let currencyTextBoldString = NSMutableAttributedString(string: currencyText, attributes:currencyTextAttrs) + clearPriceAttributedString.append(currencyTextBoldString) + + presentedBannerLabel.numberOfLines = 3 + presentedBannerLabel.attributedText = clearPriceAttributedString + + let nextStepSymbol = " \n" + let percentSymbol = "%" + + var titlePromo = promoTitle! + nextStepSymbol + if codePromo == "" { + titlePromo = "" + } + let attributedDiscountSectionString = NSMutableAttributedString(string:"") + + let titlePromoAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .bold), .foregroundColor: UIColor.white] + let discountSectionString = NSMutableAttributedString(string: titlePromo, attributes:titlePromoAttributes) + attributedDiscountSectionString.append(discountSectionString) + + let nextStepSymbolAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 1, weight: .thin), .foregroundColor: UIColor.white] + let nextStepSymbolString = NSMutableAttributedString(string: nextStepSymbol, attributes:nextStepSymbolAttributes) + attributedDiscountSectionString.append(nextStepSymbolString) + + if codePromo == "" { + let percentReplacement = "-" + String(promoCodeData.discount_percent) + percentSymbol + + let priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 27, weight: .heavy), .foregroundColor: UIColor.black] + let promoCodeLabelAttributedString = NSMutableAttributedString(string: percentReplacement, attributes:priceLabelAttributes) + attributedDiscountSectionString.append(promoCodeLabelAttributedString) + } else { + var priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 25, weight: .heavy), .foregroundColor: UIColor.white] + if codePromo.utf16.count <= 4 { + priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 31, weight: .heavy), .foregroundColor: UIColor.white] + } else if codePromo.utf16.count <= 8 { + priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 27, weight: .heavy), .foregroundColor: UIColor.white] + } else if codePromo.utf16.count < 11 { + priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 25, weight: .heavy), .foregroundColor: UIColor.white] + } else if codePromo.utf16.count <= 12 { + priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20, weight: .heavy), .foregroundColor: UIColor.white] + } else if codePromo.utf16.count <= 14 { + priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16, weight: .heavy), .foregroundColor: UIColor.white] + } else if codePromo.utf16.count <= 16 { + priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 15, weight: .bold), .foregroundColor: UIColor.white] + } else if codePromo.utf16.count <= 18 { + priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .bold), .foregroundColor: UIColor.white] + } else { + priceLabelAttributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 11, weight: .regular), .foregroundColor: UIColor.white] + } + let promoCodeLabelAttributedString = NSMutableAttributedString(string: codePromo, attributes:priceLabelAttributes) + attributedDiscountSectionString.append(promoCodeLabelAttributedString) + } + + let v = UIView() + let tap = UITapGestureRecognizer(target: self, action: #selector(self.sdkNilTap(_:))) + //v.addGestureRecognizer(tap) + promocodeBannerView.addGestureRecognizer(tap) + v.addSubview(presentedBannerLabel) + + let promoBtn = UIButton() + if promoCodeData.discount_percent != 0 || codePromo != "" { + promoBtn.setAttributedTitle(attributedDiscountSectionString, for: .normal) + promoBtn.titleLabel?.textAlignment = .left + promoBtn.titleLabel?.numberOfLines = 3 + + var bgAdditionalColor = SdkConfiguration.stories.bannerPromocodeSectionBackgroundColor ?? UIColor(red: 23/255, green: 170/255, blue: 223/255, alpha: 1.0) + + if codePromo == "" { + bgAdditionalColor = SdkConfiguration.stories.bannerDiscountSectionBackgroundColor ?? UIColor(red: 251/255, green: 184/255, blue: 0/255, alpha: 1.0) + } else { + + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + let copyIcon = UIImage(named: "iconCopyLight", in: frameworkBundle, compatibleWith: nil) + + let copyIconImageView = UIImageView(image: copyIcon) + copyIconImageView.translatesAutoresizingMaskIntoConstraints = false + promoBtn.addSubview(copyIconImageView) + + let copyIconLength = CGFloat(17) + NSLayoutConstraint.activate([ + copyIconImageView.leadingAnchor.constraint(equalTo: promoBtn.trailingAnchor, constant: -28), + copyIconImageView.centerYAnchor.constraint(equalTo: promoBtn.centerYAnchor, constant: -15), + copyIconImageView.widthAnchor.constraint(equalToConstant: copyIconLength), + copyIconImageView.heightAnchor.constraint(equalToConstant: copyIconLength) + ]) + + promoBtn.addTarget(self, action: #selector(copyPromocodeToClipboard), for: .touchUpInside) + } + + promoBtn.backgroundColor = bgAdditionalColor + v.addSubview(promoBtn) + + } else { + var bgPriceSectionColor = UIColor(red: 252/255, green: 107/255, blue: 63/255, alpha: 1.0) + if SdkConfiguration.stories.bannerPriceSectionBackgroundColor != nil { + bgPriceSectionColor = SdkConfiguration.stories.bannerPriceSectionBackgroundColor! + } + promoBtn.backgroundColor = bgPriceSectionColor + v.addSubview(promoBtn) + } + + promocodeBannerView.setView(view: v) + showInCellPromocodeBanner(promoBanner: promocodeBannerView) + + if codePromo == "" { + presentedBannerLabel.frame = CGRect(x: 0, y: 0, width: v.frame.width * 0.72, height: v.frame.height) + promoBtn.frame = CGRect(x: (v.frame.width * 0.72) - 5, y: 0, width: v.frame.width - (v.frame.width * 0.72) + 10, height: v.frame.height) + } else { + if promoCodeData.discount_percent != 0 || codePromo != "" { + if SdkGlobalHelper.DeviceType.IS_IPHONE_14_PRO_MAX || SdkGlobalHelper.DeviceType.IS_IPHONE_14_PLUS { + if codePromo.utf16.count < 11 { + presentedBannerLabel.frame = CGRect(x: 0, y: 0, width: v.frame.width * 0.6, height: v.frame.height) + promoBtn.frame = CGRect(x: v.frame.width * 0.6, y: 0, width: v.frame.width - (v.frame.width * 0.6), height: v.frame.height) + } else if codePromo.utf16.count <= 12 { + presentedBannerLabel.frame = CGRect(x: 0, y: 0, width: v.frame.width * 0.54, height: v.frame.height) + promoBtn.frame = CGRect(x: v.frame.width * 0.54, y: 0, width: v.frame.width - (v.frame.width * 0.54), height: v.frame.height) + } else { + presentedBannerLabel.frame = CGRect(x: 0, y: 0, width: v.frame.width * 0.6, height: v.frame.height) + promoBtn.frame = CGRect(x: v.frame.width * 0.6, y: 0, width: v.frame.width - (v.frame.width * 0.6), height: v.frame.height) + } + } else { + presentedBannerLabel.frame = CGRect(x: 0, y: 0, width: v.frame.width * 0.53, height: v.frame.height) + promoBtn.frame = CGRect(x: v.frame.width * 0.53, y: 0, width: v.frame.width - (v.frame.width * 0.53), height: v.frame.height) + } + } else { + presentedBannerLabel.frame = CGRect(x: 0, y: 0, width: v.frame.width * 1.0, height: v.frame.height) + promoBtn.frame = CGRect(x: v.frame.width * 1.0, y: 0, width: v.frame.width - (v.frame.width * 1.0), height: v.frame.height) + } + } + } + + @objc + public func copyPromocodeToClipboard() { + let pasteboard = UIPasteboard.general + pasteboard.string = selectedPromoCodeElement?.promocode + + if (sdkPopupAlertView.window != nil) { + return + } + sdkPopupAlertView.show() + } + + @objc + public func hideSdkPopupAlertView() { + sdkPopupAlertView.hideImmediately() + } + + @objc + public func dismissPromocodeBanner() { + promocodeBannerView.dismiss() + } + + @objc + public func dismissPromocodeBannerWithoutAnimation() { + promocodeBannerView.dismissWithoutAnimation() + } + + @objc + private func didTapOnProductsButton() { + if let productsList = selectedProductsElement?.products, productsList.count != 0 { + UserDefaults.standard.set(currentSlide!.id, forKey: "LastViewedSlideMemorySetting") + let products = productsList + cellDelegate?.openProductsCarouselView(withProducts: products, hideLabel: (selectedProductsElement?.labels?.hideCarousel)!) + return + } + } + + @objc + private func didTapButton() { + + if let promoCodeDeeplinkIos = selectedPromoCodeElement?.deeplinkIos, !promoCodeDeeplinkIos.isEmpty { + if let currentSlide = currentSlide { + + UserDefaults.standard.set(currentSlide.id, forKey: "LastViewedSlideMemorySetting") + + //#warning ("TODO Production") + //cellDelegate?.didTapUrlButton(url: promoCodeDeeplinkIos, slide: currentSlide) + + cellDelegate?.sendStructSelectedPromocodeSlide(promoCodeSlide: selectedPromoCodeElement!) + cellDelegate?.didTapOpenLinkExternalServiceMethod(url: promoCodeDeeplinkIos, slide: currentSlide) + return + } + } + + if let deeplinkIos = selectedElement?.product?.deeplinkIos, !deeplinkIos.isEmpty { + if let currentSlide = currentSlide { + + UserDefaults.standard.set(currentSlide.id, forKey: "LastViewedSlideMemorySetting") + + cellDelegate?.sendStructSelectedStorySlide(storySlide: selectedElement!) + cellDelegate?.didTapOpenLinkExternalServiceMethod(url: deeplinkIos, slide: currentSlide) + return + } + } + + if let linkIos = selectedElement?.linkIos, !linkIos.isEmpty { + if let currentSlide = currentSlide { + + UserDefaults.standard.set(currentSlide.id, forKey: "LastViewedSlideMemorySetting") + + cellDelegate?.sendStructSelectedStorySlide(storySlide: selectedElement!) + cellDelegate?.didTapOpenLinkExternalServiceMethod(url: linkIos, slide: currentSlide) + return + } + } + + if let link = selectedElement?.link, !link.isEmpty { + if let currentSlide = currentSlide { + cellDelegate?.didTapUrlButton(url: link, slide: currentSlide) + return + } + } + } + + @objc + private func pauseVideo(_ notification: NSNotification) { + if let slideID = notification.userInfo?["slideID"] as? String { + if let currentSlide = currentSlide { + if currentSlide.id == slideID { + player.pause() + } + } + } + } + + @objc + private func playVideo(_ notification: NSNotification) { + if let slideID = notification.userInfo?["slideID"] as? String { + if let currentSlide = currentSlide { + if currentSlide.id == slideID { + player.play() + } + } + } + } + + @objc + func willEnterForeground() { + do { + try audioSession.setCategory(AVAudioSession.Category.playback) + } catch { + print("SDK Error in AVAudio Session\(error.localizedDescription)") + } + player.play() + } + + @objc + func didEnterBackground() { + player.pause() + } + + func stopPlayer() { + player.pause() + } + + func makeConstraints() { + videoView.topAnchor.constraint(equalTo: topAnchor).isActive = true + videoView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + videoView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true + videoView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + + storySlideImageView.topAnchor.constraint(equalTo: topAnchor).isActive = true + storySlideImageView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + storySlideImageView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true + storySlideImageView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + + productWithPromocodeSuperview.topAnchor.constraint(equalTo: topAnchor).isActive = true + productWithPromocodeSuperview.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + productWithPromocodeSuperview.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true + productWithPromocodeSuperview.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + + // reloadButton.widthAnchor.constraint(equalToConstant: 76).isActive = true + // reloadButton.heightAnchor.constraint(equalToConstant: 76).isActive = true + // reloadButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true + // reloadButton.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true + + if SdkGlobalHelper.sharedInstance.willDeviceHaveDynamicIsland() { + + clearConstraints() + let ds: Bool = UserDefaults.standard.bool(forKey: "DoubleProductButtonSetting") + if ds { + let storyButtonConstraints = [ + storyButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + storyButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16), + storyButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -18), + storyButton.heightAnchor.constraint(equalToConstant: 56) + ] + + var productsButtonConstraints = [ + productsButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 66), + productsButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -66), + productsButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -89), + productsButton.heightAnchor.constraint(equalToConstant: 36) + ] + if SdkGlobalHelper.DeviceType.IS_IPHONE_5 { + productsButtonConstraints = [ + productsButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 52), + productsButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -52), + productsButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -89), + productsButton.heightAnchor.constraint(equalToConstant: 36) + ] + } + + let muteButtonConstraints = [ + muteButton.leadingAnchor.constraint(equalTo: storyButton.leadingAnchor, constant: -7), + muteButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -83), + muteButton.widthAnchor.constraint(equalToConstant: 48), + muteButton.heightAnchor.constraint(equalToConstant: 48) + ] + + self.activate(constraints: storyButtonConstraints) + self.activate(constraints: productsButtonConstraints) + self.activate(constraints: muteButtonConstraints) + + } else { + + let storyButtonConstraints = [ + storyButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + storyButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16), + storyButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -18), + storyButton.heightAnchor.constraint(equalToConstant: 56) + ] + + var productsButtonConstraints = [ + productsButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 66), + productsButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -66), + productsButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -28), + productsButton.heightAnchor.constraint(equalToConstant: 36) + ] + if SdkGlobalHelper.DeviceType.IS_IPHONE_5 { + productsButtonConstraints = [ + productsButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 52), + productsButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -52), + productsButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -28), + productsButton.heightAnchor.constraint(equalToConstant: 36) + ] + } + + var muteButtonConstraints = [ + muteButton.leadingAnchor.constraint(equalTo: storyButton.leadingAnchor, constant: -7), + muteButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -83), + muteButton.widthAnchor.constraint(equalToConstant: 48), + muteButton.heightAnchor.constraint(equalToConstant: 48) + ] + if selectedPromoCodeElement != nil { + muteButtonConstraints = [ + muteButton.leadingAnchor.constraint(equalTo: storyButton.leadingAnchor, constant: -7), + muteButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -163), + muteButton.widthAnchor.constraint(equalToConstant: 48), + muteButton.heightAnchor.constraint(equalToConstant: 48) + ] + } + + self.activate(constraints: storyButtonConstraints) + self.activate(constraints: productsButtonConstraints) + self.activate(constraints: muteButtonConstraints) + } + layoutIfNeeded() + + } else { + + clearConstraints() + + let ds: Bool = UserDefaults.standard.bool(forKey: "DoubleProductButtonSetting") + if ds { + let storyButtonConstraints = [ + storyButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + storyButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16), + storyButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -22), + storyButton.heightAnchor.constraint(equalToConstant: 56) + ] + + var productsButtonConstraints = [ + productsButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 66), + productsButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -66), + productsButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -89), + productsButton.heightAnchor.constraint(equalToConstant: 36) + ] + if SdkGlobalHelper.DeviceType.IS_IPHONE_5 { + productsButtonConstraints = [ + productsButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 52), + productsButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -52), + productsButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -89), + productsButton.heightAnchor.constraint(equalToConstant: 36) + ] + } + + let muteButtonConstraints = [ + muteButton.leadingAnchor.constraint(equalTo: storyButton.leadingAnchor, constant: -7), + muteButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -83), + muteButton.widthAnchor.constraint(equalToConstant: 48), + muteButton.heightAnchor.constraint(equalToConstant: 48) + ] + + self.activate(constraints: storyButtonConstraints) + self.activate(constraints: productsButtonConstraints) + self.activate(constraints: muteButtonConstraints) + + } else { + + let storyButtonConstraints = [ + storyButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16), + storyButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16), + storyButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -22), + storyButton.heightAnchor.constraint(equalToConstant: 56) + ] + + var productsButtonConstraints = [ + productsButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 66), + productsButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -66), + productsButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -28), + productsButton.heightAnchor.constraint(equalToConstant: 36) + ] + if SdkGlobalHelper.DeviceType.IS_IPHONE_5 { + productsButtonConstraints = [ + productsButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 52), + productsButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -52), + productsButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -28), + productsButton.heightAnchor.constraint(equalToConstant: 36) + ] + } + + var muteButtonConstraints = [ + muteButton.leadingAnchor.constraint(equalTo: storyButton.leadingAnchor, constant: -7), + muteButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -83), + muteButton.widthAnchor.constraint(equalToConstant: 48), + muteButton.heightAnchor.constraint(equalToConstant: 48) + ] + if selectedPromoCodeElement != nil { + muteButtonConstraints = [ + muteButton.leadingAnchor.constraint(equalTo: storyButton.leadingAnchor, constant: -7), + muteButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -163), + muteButton.widthAnchor.constraint(equalToConstant: 48), + muteButton.heightAnchor.constraint(equalToConstant: 48) + ] + } + + self.activate(constraints: storyButtonConstraints) + self.activate(constraints: productsButtonConstraints) + self.activate(constraints: muteButtonConstraints) + } + layoutIfNeeded() + } + } + + private func clearConstraints() { + customConstraints.forEach { $0.isActive = false } + customConstraints.removeAll() + } + + private func activate(constraints: [NSLayoutConstraint]) { + customConstraints.append(contentsOf: constraints) + customConstraints.forEach { $0.isActive = true } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + audioSession.removeObserver(self, forKeyPath: "outputVolume", context: nil) + } +} + + +extension AVPlayer { + var isAudioAvailable: Bool? { + return self.currentItem?.asset.tracks.filter({$0.mediaType == .audio}).count != 0 + } + + var isVideoAvailable: Bool? { + return self.currentItem?.asset.tracks.filter({$0.mediaType == .video}).count != 0 + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift new file mode 100755 index 0000000..3cd0c50 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift @@ -0,0 +1,243 @@ +import UIKit +import WebKit + +class CarouselCollectionView: UICollectionView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + + var cells = [StoriesProduct]() + var hideButton = UIButton() + var hideLabel: String? + + public weak var carouselProductsDelegate: CarouselCollectionViewCellDelegate? + + init() { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + super.init(frame: .zero, collectionViewLayout: layout) + + backgroundColor = UIColor(red: 240/255, green: 240/255, blue: 240/255, alpha: 255/255) + delegate = self + dataSource = self + register(CarouselCollectionViewCell.self, forCellWithReuseIdentifier: CarouselCollectionViewCell.reuseCarouselId) + + translatesAutoresizingMaskIntoConstraints = false + layout.minimumLineSpacing = CarouselProductsConstants.productCarouselMinimumLineSpacing + + if SdkGlobalHelper.DeviceType.IS_IPHONE_SE { + contentInset = UIEdgeInsets(top: 0, left: CarouselProductsConstants.cLeftDistanceToView, bottom: 70, right: CarouselProductsConstants.cRightDistanceToView) + } else { + contentInset = UIEdgeInsets(top: 0, left: CarouselProductsConstants.cLeftDistanceToView, bottom: 60, right: CarouselProductsConstants.cRightDistanceToView) + } + + showsHorizontalScrollIndicator = false + showsVerticalScrollIndicator = false + + let stackView = UIStackView() + stackView.axis = .horizontal + stackView.distribution = .fill + stackView.backgroundColor = .clear + stackView.translatesAutoresizingMaskIntoConstraints = false + addSubview(stackView) + + if SdkGlobalHelper.DeviceType.IS_IPHONE_XS { + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 58), + stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -58), + stackView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor, constant: 9), + stackView.heightAnchor.constraint(equalToConstant: 36) + ]) + } else if SdkGlobalHelper.DeviceType.IS_IPHONE_XS_MAX { + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 58), + stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -58), + stackView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor, constant: 9), + stackView.heightAnchor.constraint(equalToConstant: 36) + ]) + } else if SdkGlobalHelper.DeviceType.IS_IPHONE_14 { + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 58), + stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -58), + stackView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor, constant: 9), + stackView.heightAnchor.constraint(equalToConstant: 36) + ]) + } else if SdkGlobalHelper.DeviceType.IS_IPHONE_14_PLUS { + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 58), + stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -58), + stackView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor, constant: 9), + stackView.heightAnchor.constraint(equalToConstant: 36) + ]) + } else if SdkGlobalHelper.DeviceType.IS_IPHONE_14_PRO { + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 58), + stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -58), + stackView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor, constant: 9), + stackView.heightAnchor.constraint(equalToConstant: 36) + ]) + } else if SdkGlobalHelper.DeviceType.IS_IPHONE_5 { + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 58), + stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -58), + stackView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor, constant: -6), + stackView.heightAnchor.constraint(equalToConstant: 36) + ]) + } else if SdkGlobalHelper.DeviceType.IS_IPHONE_SE { + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 58), + stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -58), + stackView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor, constant: -19), + stackView.heightAnchor.constraint(equalToConstant: 36) + ]) + } else if SdkGlobalHelper.DeviceType.IS_IPHONE_8_PLUS { + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 58), + stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -58), + stackView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor, constant: -19), + stackView.heightAnchor.constraint(equalToConstant: 36) + ]) + } else { + NSLayoutConstraint.activate([ + stackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 58), + stackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -58), + stackView.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor, constant: 9), + stackView.heightAnchor.constraint(equalToConstant: 36) + ]) + } + + hideButton = UIButton(frame: CGRect(x: 0, y: 0, width: 85, height: 40)) + hideButton.translatesAutoresizingMaskIntoConstraints = false + hideButton.setTitle(hideLabel ?? SdkConfiguration.stories.defaultHideProductsButtonText, for: .normal) + if hideLabel == nil || hideLabel == "" { + hideButton.setTitle(SdkConfiguration.stories.defaultHideProductsButtonText, for: .normal) + } + + if SdkConfiguration.stories.slideProductsHideButtonFontNameChanged != nil { + hideButton.titleLabel?.font = UIFont(name: (SdkConfiguration.stories.slideProductsHideButtonFontNameChanged)!, size: 14) + } else { + hideButton.titleLabel?.font = .systemFont(ofSize: 14, weight: .bold) + } + hideButton.backgroundColor = .clear + hideButton.setTitleColor(UIColor.black, for: .normal) + hideButton.addTarget(self, action: #selector(self.closeButtonTapped), for: .touchUpInside) + + var frameworkBundle = Bundle(for: classForCoder) + #if SWIFT_PACKAGE + frameworkBundle = Bundle.module + #endif + let image = UIImage(named: "angleDownBlack", in: frameworkBundle, compatibleWith: nil) + + let imageView = UIImageView(image: image) + imageView.translatesAutoresizingMaskIntoConstraints = false + hideButton.addSubview(imageView) + + let length = CGFloat(21) + hideButton.titleEdgeInsets.right += length + + NSLayoutConstraint.activate([ + imageView.leadingAnchor.constraint(equalTo: hideButton.titleLabel!.trailingAnchor, constant: 6), + imageView.centerYAnchor.constraint(equalTo: hideButton.titleLabel!.centerYAnchor, constant: 1), + imageView.widthAnchor.constraint(equalToConstant: length), + imageView.heightAnchor.constraint(equalToConstant: length) + ]) + + stackView.addArrangedSubview(hideButton) + addSubview(stackView) + } + + @objc + func closeButtonTapped(sender: UIButton) { + carouselProductsDelegate?.closeProductsCarousel() + } + + func set(cells: [StoriesProduct]) { + self.cells = cells + redrawSubviews() + + self.hideButton.setTitle(hideLabel ?? SdkConfiguration.stories.defaultHideProductsButtonText, for: .normal) + if hideLabel == nil || hideLabel == "" { + hideButton.setTitle(SdkConfiguration.stories.defaultHideProductsButtonText, for: .normal) + } + } + + func redrawSubviews() { + if cells.count == 1 { + contentInset = UIEdgeInsets(top: 0, left: UIScreen.main.bounds.size.width/4 - 10, bottom: 70, right: 0) + } else { + if SdkGlobalHelper.DeviceType.IS_IPHONE_SE { + contentInset = UIEdgeInsets(top: 0, left: CarouselProductsConstants.cLeftDistanceToView, bottom: 70, right: CarouselProductsConstants.cRightDistanceToView) + } else { + contentInset = UIEdgeInsets(top: 0, left: CarouselProductsConstants.cLeftDistanceToView, bottom: 60, right: CarouselProductsConstants.cRightDistanceToView) + } + } + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return cells.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = dequeueReusableCell(withReuseIdentifier: CarouselCollectionViewCell.reuseCarouselId, for: indexPath) as! CarouselCollectionViewCell + + let url = URL(string: cells[indexPath.row].picture) + if url != nil { + cell.carouselMainImageView.load.request(with: url!) + } + cell.carouselProductNameLabel.text = cells[indexPath.row].name + + let mainProductText = cells[indexPath.row].oldprice_formatted + let textRange = NSMakeRange(0, mainProductText.count) + let attributedText = NSMutableAttributedString(string: mainProductText) + attributedText.addAttribute(NSAttributedString.Key.strikethroughStyle , value: NSUnderlineStyle.single.rawValue, range: textRange) + cell.carouselOldCostLabel.attributedText = attributedText + + if (cells[indexPath.row].discount_formatted == "0%" || cells[indexPath.row].discount_formatted == nil) { + cell.carouselDiscountLabel.isHidden = true + } else { + let discountPercent = cells[indexPath.row].discount_formatted ?? "10%" + let discountPercentFinal = " -" + discountPercent + " " + cell.carouselDiscountLabel.text = discountPercentFinal + cell.carouselDiscountLabel.isHidden = false + } + + cell.carouselNowCostLabel.text = cells[indexPath.row].price_formatted + + return cell + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let selectedCarouselProduct = cells[indexPath.row] + carouselProductsDelegate?.sendStructSelectedCarouselProduct(product: selectedCarouselProduct) + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + if SdkGlobalHelper.DeviceType.IS_IPHONE_5 { + return CGSize(width: CarouselProductsConstants.productCarouselItemSlimWidth, height: frame.height * 0.73) + } else { + return CGSize(width: CarouselProductsConstants.productCarouselItemWidth, height: frame.height * 0.73) + } + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + + +extension UIButton { + func addRightIcon(image: UIImage) { + + let imageView = UIImageView(image: image) + imageView.translatesAutoresizingMaskIntoConstraints = false + + addSubview(imageView) + + let length = CGFloat(21) + titleEdgeInsets.right += length + + NSLayoutConstraint.activate([ + imageView.leadingAnchor.constraint(equalTo: self.titleLabel!.trailingAnchor, constant: 6), + imageView.centerYAnchor.constraint(equalTo: self.titleLabel!.centerYAnchor, constant: 1), + imageView.widthAnchor.constraint(equalToConstant: length), + imageView.heightAnchor.constraint(equalToConstant: length) + ]) + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift new file mode 100755 index 0000000..05d1fd8 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift @@ -0,0 +1,137 @@ +import UIKit + +class CarouselCollectionViewCell: UICollectionViewCell { + + static let reuseCarouselId = "CarouselCollectionViewCell" + + let carouselMainImageView: UIImageView = { + let carouselProductImageView = UIImageView() + carouselProductImageView.translatesAutoresizingMaskIntoConstraints = false + carouselProductImageView.contentMode = .scaleAspectFit + return carouselProductImageView + }() + + let carouselProductNameLabel: UILabel = { + let cLabel = UILabel() + + if SdkConfiguration.stories.slideProductsHideButtonFontNameChanged != nil { + cLabel.font = UIFont(name: (SdkConfiguration.stories.slideProductsHideButtonFontNameChanged)!, size: 16) + } else { + cLabel.font = UIFont.systemFont(ofSize: 16, weight: .bold) + } + + cLabel.textColor = #colorLiteral(red: 0.007841579616, green: 0.007844132371, blue: 0.007841020823, alpha: 1) + cLabel.numberOfLines = 0 + cLabel.translatesAutoresizingMaskIntoConstraints = false + return cLabel + }() + + let carouselDescriptionLabel: UILabel = { + let cLabel = UILabel() + + if SdkConfiguration.stories.slideProductsHideButtonFontNameChanged != nil { + cLabel.font = UIFont(name: (SdkConfiguration.stories.slideProductsHideButtonFontNameChanged)!, size: 14) + } else { + cLabel.font = UIFont.systemFont(ofSize: 14, weight: .semibold) + } + + cLabel.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + cLabel.numberOfLines = 0 + cLabel.translatesAutoresizingMaskIntoConstraints = false + return cLabel + }() + + let carouselLikeImageView: UIImageView = { + let carouselLikeImageView = UIImageView() + carouselLikeImageView.image = UIImage(named: "iconLikeHeart") + carouselLikeImageView.translatesAutoresizingMaskIntoConstraints = false + return carouselLikeImageView + }() + + let carouselOldCostLabel: UILabel = { + let cLabel = UILabel() + + if SdkConfiguration.stories.slideProductsHideButtonFontNameChanged != nil { + cLabel.font = UIFont(name: (SdkConfiguration.stories.slideProductsHideButtonFontNameChanged)!, size: 14) + } else { + cLabel.font = UIFont.systemFont(ofSize: 14, weight: .regular) + } + + cLabel.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + cLabel.translatesAutoresizingMaskIntoConstraints = false + return cLabel + }() + + let carouselNowCostLabel: UILabel = { + let cLabel = UILabel() + + if SdkConfiguration.stories.slideProductsHideButtonFontNameChanged != nil { + cLabel.font = UIFont(name: (SdkConfiguration.stories.slideProductsHideButtonFontNameChanged)!, size: 18) + } else { + cLabel.font = UIFont.systemFont(ofSize: 18, weight: .bold) + } + + cLabel.textColor = #colorLiteral(red: 0.007841579616, green: 0.007844132371, blue: 0.007841020823, alpha: 1) + cLabel.translatesAutoresizingMaskIntoConstraints = false + return cLabel + }() + + let carouselDiscountLabel: UILabel = { + let cLabel = UILabel() + cLabel.frame = CGRect(x: 0, y: 0, width: 45, height: 20) + + if SdkConfiguration.stories.slideProductsHideButtonFontNameChanged != nil { + cLabel.font = UIFont(name: (SdkConfiguration.stories.slideProductsHideButtonFontNameChanged)!, size: 13) + } else { + cLabel.font = UIFont.systemFont(ofSize: 13, weight: .bold) + } + + cLabel.textColor = .white + cLabel.backgroundColor = UIColor(red: 0.925, green: 0.282, blue: 0.6, alpha: 1) + cLabel.layer.cornerRadius = 3 + cLabel.layer.masksToBounds = true + cLabel.translatesAutoresizingMaskIntoConstraints = false + return cLabel + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + addSubview(carouselMainImageView) + addSubview(carouselProductNameLabel) + addSubview(carouselOldCostLabel) + addSubview(carouselDiscountLabel) + addSubview(carouselNowCostLabel) + + backgroundColor = .white + + carouselMainImageView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + carouselMainImageView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true + carouselMainImageView.topAnchor.constraint(equalTo: topAnchor, constant: 20).isActive = true + carouselMainImageView.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 1/2).isActive = true + + carouselProductNameLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true + carouselProductNameLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8).isActive = true + carouselProductNameLabel.topAnchor.constraint(equalTo: carouselMainImageView.bottomAnchor, constant: 12).isActive = true + + carouselOldCostLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true + carouselOldCostLabel.topAnchor.constraint(equalTo: carouselProductNameLabel.bottomAnchor, constant: 14).isActive = true + + carouselDiscountLabel.leadingAnchor.constraint(equalTo: carouselOldCostLabel.trailingAnchor, constant: 10).isActive = true + carouselDiscountLabel.topAnchor.constraint(equalTo: carouselProductNameLabel.bottomAnchor, constant: 11).isActive = true + carouselDiscountLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true + + carouselNowCostLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true + carouselNowCostLabel.topAnchor.constraint(equalTo: carouselOldCostLabel.bottomAnchor, constant: 8).isActive = true + } + + override func layoutSubviews() { + super.layoutSubviews() + self.layer.cornerRadius = 7 + self.clipsToBounds = false + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift new file mode 100755 index 0000000..c3cf139 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift @@ -0,0 +1,16 @@ +import Foundation +import UIKit + +public struct CarouselProductsConstants { + public static let cLeftDistanceToView: CGFloat = 40 + public static let cRightDistanceToView: CGFloat = 40 + + public static let productCarouselMinimumLineSpacing: CGFloat = 10 + + public static let carouselWidthCoefficient: CGFloat = 1.4 // 1.65 + public static let carouselSlimWidthCoefficient: CGFloat = 1.2 + + public static let productCarouselItemWidth = (UIScreen.main.bounds.width - CarouselProductsConstants.cLeftDistanceToView - CarouselProductsConstants.cRightDistanceToView - (CarouselProductsConstants.productCarouselMinimumLineSpacing / 2)) / carouselWidthCoefficient + + public static let productCarouselItemSlimWidth = (UIScreen.main.bounds.width - CarouselProductsConstants.cLeftDistanceToView - CarouselProductsConstants.cRightDistanceToView - (CarouselProductsConstants.productCarouselMinimumLineSpacing / 2)) / carouselSlimWidthCoefficient +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift new file mode 100755 index 0000000..9fa60af --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift @@ -0,0 +1,10 @@ +import UIKit +import Foundation + +public struct RecommendationsConstants { + static let recommendationsLeftDistanceToView: CGFloat = 20 + static let recommendationsRightDistanceToView: CGFloat = 20 + static let recommendationsCollectionMinimumLineSpacing: CGFloat = 10 + + static let recommendationsCollectionItemWidth = (UIScreen.main.bounds.width - RecommendationsConstants.recommendationsLeftDistanceToView - RecommendationsConstants.recommendationsRightDistanceToView - (RecommendationsConstants.recommendationsCollectionMinimumLineSpacing / 2)) / 1.65 +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift new file mode 100755 index 0000000..644ef85 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift @@ -0,0 +1,511 @@ +import UIKit + +public protocol RecommendationsWidgetCommunicationProtocol: AnyObject { + func addToCartProductData(product: Recommended) + func addToFavoritesProductData(product: Recommended) + func didTapOnProduct(product: Recommended) +} + +open class RecommendationsWidgetView: UICollectionView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, RecommendationsWidgetViewCellDelegate { + + public var cells = [Recommended]() + + private static var rowsCount = 999 + + public let recommendationsCollectionWidgetIndicator = StoriesSlideReloadIndicator() + + public weak var recommendationsDelegate: RecommendationsWidgetCommunicationProtocol? + + public var recommendationsIndicatorView: SdkActivityIndicator! + + public var sdk: PersonalizationSDK? + + public init() { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + super.init(frame: .zero, collectionViewLayout: layout) + + self.setupWidgetBgColor() + + delegate = self + dataSource = self + register(RecommendationsWidgetViewCell.self, forCellWithReuseIdentifier: RecommendationsWidgetViewCell.reuseRecommCellId) + + translatesAutoresizingMaskIntoConstraints = false + layout.minimumLineSpacing = RecommendationsConstants.recommendationsCollectionMinimumLineSpacing + contentInset = UIEdgeInsets(top: 0, left: RecommendationsConstants.recommendationsLeftDistanceToView, bottom: 0, right: RecommendationsConstants.recommendationsRightDistanceToView) + + showsHorizontalScrollIndicator = false + showsVerticalScrollIndicator = false + +// setupRecommendationsActivityIndicator() + } + + func setupRecommendationsActivityIndicator() { + self.recommendationsIndicatorView = SdkActivityIndicator(frame: CGRect(x: 0, y: 0, width: 76, height: 76)) + self.recommendationsIndicatorView.lineWidth = 3 + self.recommendationsIndicatorView.indicatorColor = UIColor.green + self.addSubview(self.recommendationsIndicatorView) + + self.recommendationsIndicatorView.center = center + self.recommendationsIndicatorView.hideIndicatorWhenStopped = true + + self.recommendationsIndicatorView.startAnimating() + } + + public func loadWidget(sdk: PersonalizationSDK, blockId: String) { + self.sdk = sdk + sdk.recommend(blockId: blockId, timeOut: 0.5) { recommendationsWidgetResponse in + switch recommendationsWidgetResponse { + case let .success(response): + DispatchQueue.main.asyncAfter(deadline: .now() + 1.8) { + self.setWidget(cells: response.recommended) + self.reloadData() + } + case let .failure(error): + switch error { + case let .custom(customError): + print("Error:", customError) + default: + print("Error:", error.description) + } + } + } + } + + public func setWidget(cells: [Recommended]) { + self.cells = cells + } + + public func setupWidgetBgColor() { + if SdkConfiguration.isDarkMode { + let bgColor = SdkConfiguration.recommendations.widgetBackgroundColorDarkMode.hexToRGB() + backgroundColor = UIColor(red: bgColor.red, green: bgColor.green, blue: bgColor.blue, alpha: 1) + } else { + let bgColor = SdkConfiguration.recommendations.widgetBackgroundColor.hexToRGB() + backgroundColor = UIColor(red: bgColor.red, green: bgColor.green, blue: bgColor.blue, alpha: 1) + } + } + + public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return cells.count + } + + public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = dequeueReusableCell(withReuseIdentifier: RecommendationsWidgetViewCell.reuseRecommCellId, for: indexPath) as! RecommendationsWidgetViewCell + cell.widgetCellDelegate = self + + let url = URL(string: cells[indexPath.row].resizedImageUrl) + if url != nil { + cell.recommendationsImageView.load.request(with: url!) + } + + cell.recommendationsProductNameLabel.text = cells[indexPath.row].name + if SdkConfiguration.isDarkMode { + cell.recommendationsProductNameLabel.textColor = .white + } else { + cell.recommendationsProductNameLabel.textColor = .black + } + + cell.recommendationsClearLabel.text = "" + + let ss = cells[indexPath.row].oldPrice + if ss == 0 { + cell.recommendationsOldPrice.text = "" + } else { + cell.recommendationsOldPrice.attributedText = strikeThrough(str: cells[indexPath.row].oldPriceFormatted ?? "") + } + + cell.recommendationsDiscountLabel.text = " Cashback 20% " //sample coming soon + cell.recommendationsCreditLabel.text = " 0-0-12 " //sample coming soon + + let currentCurrency = cells[indexPath.row].currency + let priceNotFormatted = cells[indexPath.row].priceFullFormatted + let replaceCurrencyPriceWithPromocode = priceNotFormatted?.replacingOccurrences(of: currentCurrency, with: "") ?? cells[indexPath.row].priceFormatted + let updatedPrice = replaceCurrencyPriceWithPromocode! + currentCurrency + + cell.recommendationsPriceLabel.text = updatedPrice + + if SdkConfiguration.isDarkMode { + cell.recommendationsPriceLabel.textColor = .white + } else { + cell.recommendationsPriceLabel.textColor = .black + } + + let ratingForStars = cells[indexPath.row].rating + cell.update(Double(ratingForStars)) + if ratingForStars == 0 { + cell.recommendationsRatingStars.isHidden = true + cell.recommendationsRatingStarsNoReviewsLabel.isHidden = false + cell.recommendationsRatingStarsNoReviewsLabel.text = SdkConfiguration.recommendations.widgetNoReviewsDefaultText + } else { + cell.update(Double(ratingForStars)) + cell.recommendationsRatingStars.isHidden = false + cell.recommendationsRatingStarsNoReviewsLabel.isHidden = true + cell.recommendationsRatingStarsNoReviewsLabel.text = "" + } + + let pId = cells[indexPath.row].id + let productCartId = "cart.product." + pId + let cartItemsCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(productCartId)) as? [String] ?? [] + let itemIdExistInCart = cartItemsCachedArray.contains(where: { + $0.range(of: pId) != nil + }) + configureCartButton(cell: cell, itemIdExistInCart: itemIdExistInCart) + + if SdkConfiguration.isDarkMode { + let widgetCartButtonTextColorDarkMode = SdkConfiguration.recommendations.widgetCartButtonTextColorDarkMode.hexToRGB() + let tColor = UIColor(red: widgetCartButtonTextColorDarkMode.red, green: widgetCartButtonTextColorDarkMode.green, blue: widgetCartButtonTextColorDarkMode.blue, alpha: 1) + cell.recommendationsCartButton.setTitleColor(tColor, for: .normal) + + let widgetCartButtonBackgroundColorDarkMode = SdkConfiguration.recommendations.widgetCartButtonBackgroundColorDarkMode.hexToRGB() + let bgColor = UIColor(red: widgetCartButtonBackgroundColorDarkMode.red, green: widgetCartButtonBackgroundColorDarkMode.green, blue: widgetCartButtonBackgroundColorDarkMode.blue, alpha: 1) + cell.recommendationsCartButton.backgroundColor = bgColor + } else { + let widgetCartButtonTextColor = SdkConfiguration.recommendations.widgetCartButtonTextColor.hexToRGB() + let tColor = UIColor(red: widgetCartButtonTextColor.red, green: widgetCartButtonTextColor.green, blue: widgetCartButtonTextColor.blue, alpha: 1) + cell.recommendationsCartButton.setTitleColor(tColor, for: .normal) + + let widgetCartButtonBackgroundColor = SdkConfiguration.recommendations.widgetCartButtonBackgroundColor.hexToRGB() + let bgColor = UIColor(red: widgetCartButtonBackgroundColor.red, green: widgetCartButtonBackgroundColor.green, blue: widgetCartButtonBackgroundColor.blue, alpha: 1) + cell.recommendationsCartButton.backgroundColor = bgColor + } + + let productFavoritesId = "favorites.product." + pId + let favoritesItemsCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(productFavoritesId)) as? [String] ?? [] + let itemIdExistInFavorites = favoritesItemsCachedArray.contains(where: { + $0.range(of: pId) != nil + }) + configureFavoritesButton(cell: cell, itemIdExistInFavorites: itemIdExistInFavorites) + + return cell + } + + public func didTapWidgetAddToCartButtonInside(cell: RecommendationsWidgetViewCell, position: CGPoint) { + if let indexPath = indexPath(for: cell) { + let selectedProductForCartFromWidget = cells[indexPath.row] + + let productInCartId = "cart.product." + selectedProductForCartFromWidget.id + var viewedSlidesCartCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(productInCartId)) as? [String] ?? [] + let viewedCartSlideIdExists = viewedSlidesCartCachedArray.contains(where: { + $0.range(of: selectedProductForCartFromWidget.id) != nil + }) + + if !viewedCartSlideIdExists { + viewedSlidesCartCachedArray.append(selectedProductForCartFromWidget.id) + UserDefaults.standard.setValue(viewedSlidesCartCachedArray, for: UserDefaults.Key(productInCartId)) + + cell.recommendationsCartButton.setTitle(SdkConfiguration.recommendations.widgetRemoveFromCartButtonText, for: .normal) + sdkAddToCart(productId: selectedProductForCartFromWidget.id) + } else { + if let index = viewedSlidesCartCachedArray.firstIndex(of: selectedProductForCartFromWidget.id) { + viewedSlidesCartCachedArray.remove(at: index) + } + UserDefaults.standard.setValue(viewedSlidesCartCachedArray, for: UserDefaults.Key(productInCartId)) + + cell.recommendationsCartButton.setTitle(SdkConfiguration.recommendations.widgetAddToCartButtonText, for: .normal) + sdkRemoveFromCart(productId: selectedProductForCartFromWidget.id) + } + + configureCartButton(cell: cell, itemIdExistInCart: !viewedCartSlideIdExists) + + print("\nUser did tap Add/Remove 'Cart' from Recommendations widget\nUse 'recommendationsDelegate' for interactions\nProduct id: \(selectedProductForCartFromWidget.id)") + print("Product name: \(selectedProductForCartFromWidget.name)") + print("Product brand: \(selectedProductForCartFromWidget.brand)") + print("Product model: \(selectedProductForCartFromWidget.model)") + print("Product imageUrl: \(selectedProductForCartFromWidget.imageUrl)") + print("Product resizedImageUrl: \(selectedProductForCartFromWidget.resizedImageUrl)") + print("Product url: \(selectedProductForCartFromWidget.url)") + print("Product deeplinkIos: \(selectedProductForCartFromWidget.deeplinkIos)") + print("Product price: \(selectedProductForCartFromWidget.price)") + print("Product priceFormatted: \(String(describing: selectedProductForCartFromWidget.priceFormatted))") + print("Product priceFull: \(selectedProductForCartFromWidget.priceFull)") + print("Product priceFullFormatted: \(String(describing: selectedProductForCartFromWidget.priceFullFormatted))") + print("Product currency: \(selectedProductForCartFromWidget.currency)\n") + + if SdkConfiguration.recommendations.widgetCartButtonNeedOpenWebUrl { + openWidgetUrl(link: selectedProductForCartFromWidget.url) + } + } + } + + public func didTapWidgetAddToFavoritesButtonInside(cell: RecommendationsWidgetViewCell, position: CGPoint) { + if let indexPath = indexPath(for: cell) { + let selectedProductForFavoritesFromWidget = cells[indexPath.row] + let productFavoritesId = "favorites.product." + selectedProductForFavoritesFromWidget.id + + var viewedSlidesFavoritesCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(productFavoritesId)) as? [String] ?? [] + let viewedFavoritesSlideIdExists = viewedSlidesFavoritesCachedArray.contains(where: { + $0.range(of: selectedProductForFavoritesFromWidget.id) != nil + }) + + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + if !viewedFavoritesSlideIdExists { + viewedSlidesFavoritesCachedArray.append(selectedProductForFavoritesFromWidget.id) + UserDefaults.standard.setValue(viewedSlidesFavoritesCachedArray, for: UserDefaults.Key(productFavoritesId)) + + sdkAddToFavorites(productId: selectedProductForFavoritesFromWidget.id) + + var heartFillIcon = UIImage(named: "iconLikeHeartFillDark", in: frameworkBundle, compatibleWith: nil) + if SdkConfiguration.isDarkMode { + heartFillIcon = UIImage(named: "iconLikeHeartFillLight", in: frameworkBundle, compatibleWith: nil) + } + let heartFillImageRender = heartFillIcon?.withRenderingMode(.alwaysTemplate) + let heartFillImageView = UIImageView(image: heartFillImageRender) + + cell.recommendationsFavoritesButton.setImage(heartFillImageView.image, for: .normal) + + var customHeartTintColor = SdkConfiguration.recommendations.widgetFavoritesIconColor.hexToRGB() + if SdkConfiguration.isDarkMode { + customHeartTintColor = SdkConfiguration.recommendations.widgetFavoritesIconColorDarkMode.hexToRGB() + } + cell.recommendationsFavoritesButton.tintColor = UIColor(red: customHeartTintColor.red, green: customHeartTintColor.green, blue: customHeartTintColor.blue, alpha: 1) + } else { + if let index = viewedSlidesFavoritesCachedArray.firstIndex(of: selectedProductForFavoritesFromWidget.id) { + viewedSlidesFavoritesCachedArray.remove(at: index) + } + UserDefaults.standard.setValue(viewedSlidesFavoritesCachedArray, for: UserDefaults.Key(productFavoritesId)) + + sdkRemoveFromFavorites(productId: selectedProductForFavoritesFromWidget.id) + + var heartClearIcon = UIImage(named: "iconLikeHeartDark", in: frameworkBundle, compatibleWith: nil) + if SdkConfiguration.isDarkMode { + heartClearIcon = UIImage(named: "iconLikeHeartLight", in: frameworkBundle, compatibleWith: nil) + } + let heartClearImageRender = heartClearIcon?.withRenderingMode(.alwaysTemplate) + let heartClearImageView = UIImageView(image: heartClearImageRender) + + cell.recommendationsFavoritesButton.setImage(heartClearImageView.image, for: .normal) + + var customHeartTintColor = SdkConfiguration.recommendations.widgetFavoritesIconColor.hexToRGB() + if SdkConfiguration.isDarkMode { + customHeartTintColor = SdkConfiguration.recommendations.widgetFavoritesIconColorDarkMode.hexToRGB() + } + cell.recommendationsFavoritesButton.tintColor = UIColor(red: customHeartTintColor.red, green: customHeartTintColor.green, blue: customHeartTintColor.blue, alpha: 1) + } + + print("\nUser did tap Add/Remove 'Favorites' from Recommendations widget\nUse 'recommendationsDelegate' for interactions\nProduct id: \(selectedProductForFavoritesFromWidget.id)") + print("Favorite product name: \(selectedProductForFavoritesFromWidget.name)") + print("Favorite product brand: \(selectedProductForFavoritesFromWidget.brand)") + print("Favorite product model: \(selectedProductForFavoritesFromWidget.model)") + print("Favorite product imageUrl: \(selectedProductForFavoritesFromWidget.imageUrl)") + print("Favorite product resizedImageUrl: \(selectedProductForFavoritesFromWidget.resizedImageUrl)") + print("Favorite product url: \(selectedProductForFavoritesFromWidget.url)") + print("Favorite product deeplinkIos: \(selectedProductForFavoritesFromWidget.deeplinkIos)") + print("Favorite product price: \(selectedProductForFavoritesFromWidget.price)") + print("Favorite product priceFormatted: \(String(describing: selectedProductForFavoritesFromWidget.priceFormatted))") + print("Favorite product priceFull: \(selectedProductForFavoritesFromWidget.priceFull)") + print("Favorite product priceFullFormatted: \(String(describing: selectedProductForFavoritesFromWidget.priceFullFormatted))") + print("Favorite product currency: \(selectedProductForFavoritesFromWidget.currency)\n") + + recommendationsDelegate?.addToFavoritesProductData(product: selectedProductForFavoritesFromWidget) + } + } + + public func configureCartButton(cell: RecommendationsWidgetViewCell, itemIdExistInCart: Bool) { + if !itemIdExistInCart { + let addTxtStr = SdkConfiguration.recommendations.widgetAddToCartButtonText + if SdkConfiguration.recommendations.widgetFontName != nil { + var fontAddToCartProvidedBySdk = UIFont(name: SdkConfiguration.recommendations.widgetFontName!, size: 17.0) + cell.recommendationsCartButton.titleLabel?.font = fontAddToCartProvidedBySdk + + if SdkConfiguration.recommendations.widgetAddToCartButtonFontSize != nil { + fontAddToCartProvidedBySdk = UIFont(name: SdkConfiguration.recommendations.widgetFontName!, size: SdkConfiguration.recommendations.widgetAddToCartButtonFontSize!) + cell.recommendationsCartButton.titleLabel?.font = fontAddToCartProvidedBySdk + } + } else { + cell.recommendationsCartButton.titleLabel?.font = .systemFont(ofSize: 17.0, weight: .semibold) + + if SdkConfiguration.recommendations.widgetAddToCartButtonFontSize != nil { + cell.recommendationsCartButton.titleLabel?.font = .systemFont(ofSize: SdkConfiguration.recommendations.widgetAddToCartButtonFontSize!, weight: .semibold) + } + } + cell.recommendationsCartButton.setTitle(addTxtStr, for: .normal) + } else { + let removeTxtStr = SdkConfiguration.recommendations.widgetRemoveFromCartButtonText + if SdkConfiguration.recommendations.widgetFontName != nil { + var fontRemoveFromCartProvidedBySdk = UIFont(name: SdkConfiguration.recommendations.widgetFontName!, size: 17.0) + cell.recommendationsCartButton.titleLabel?.font = fontRemoveFromCartProvidedBySdk + + if SdkConfiguration.recommendations.widgetRemoveFromCartButtonFontSize != nil { + fontRemoveFromCartProvidedBySdk = UIFont(name: SdkConfiguration.recommendations.widgetFontName!, size: SdkConfiguration.recommendations.widgetRemoveFromCartButtonFontSize!) + cell.recommendationsCartButton.titleLabel?.font = fontRemoveFromCartProvidedBySdk + } + } else { + cell.recommendationsCartButton.titleLabel?.font = .systemFont(ofSize: 17.0, weight: .semibold) + + if SdkConfiguration.recommendations.widgetRemoveFromCartButtonFontSize != nil { + cell.recommendationsCartButton.titleLabel?.font = .systemFont(ofSize: SdkConfiguration.recommendations.widgetRemoveFromCartButtonFontSize!, weight: .semibold) + } + } + cell.recommendationsCartButton.setTitle(removeTxtStr, for: .normal) + } + } + + public func configureFavoritesButton(cell: RecommendationsWidgetViewCell, itemIdExistInFavorites: Bool) { + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + if !itemIdExistInFavorites { + var heartClearIcon = UIImage(named: "iconLikeHeartDark", in: frameworkBundle, compatibleWith: nil) + if SdkConfiguration.isDarkMode { + heartClearIcon = UIImage(named: "iconLikeHeartLight", in: frameworkBundle, compatibleWith: nil) + } + let heartClearImageRender = heartClearIcon?.withRenderingMode(.alwaysTemplate) + let heartClearImageView = UIImageView(image: heartClearImageRender) + + cell.recommendationsFavoritesButton.setImage(heartClearImageView.image, for: .normal) + + var customHeartTintColor = SdkConfiguration.recommendations.widgetFavoritesIconColor.hexToRGB() + if SdkConfiguration.isDarkMode { + customHeartTintColor = SdkConfiguration.recommendations.widgetFavoritesIconColorDarkMode.hexToRGB() + } + cell.recommendationsFavoritesButton.tintColor = UIColor(red: customHeartTintColor.red, green: customHeartTintColor.green, blue: customHeartTintColor.blue, alpha: 1) + } else { + var heartFillIcon = UIImage(named: "iconLikeHeartFillDark", in: frameworkBundle, compatibleWith: nil) + if SdkConfiguration.isDarkMode { + heartFillIcon = UIImage(named: "iconLikeHeartFillLight", in: frameworkBundle, compatibleWith: nil) + } + let heartFillImageRender = heartFillIcon?.withRenderingMode(.alwaysTemplate) + let heartFillImageView = UIImageView(image: heartFillImageRender) + + cell.recommendationsFavoritesButton.setImage(heartFillImageView.image, for: .normal) + + var customHeartTintColor = SdkConfiguration.recommendations.widgetFavoritesIconColor.hexToRGB() + if SdkConfiguration.isDarkMode { + customHeartTintColor = SdkConfiguration.recommendations.widgetFavoritesIconColorDarkMode.hexToRGB() + } + cell.recommendationsFavoritesButton.tintColor = UIColor(red: customHeartTintColor.red, green: customHeartTintColor.green, blue: customHeartTintColor.blue, alpha: 1) + } + } + + public func sdkAddToCart(productId: String) { + sdk?.track(event: .productAddedToCart(id: productId)) { trackResponse in + switch trackResponse { + case .success(_): + print("Product id \(productId) added to 'Cart' success") + case let .failure(error): + switch error { + case let .custom(customError): + print("Error:", customError) + default: + print("Error:", error.description) + } + } + } + } + + public func sdkRemoveFromCart(productId: String) { + sdk?.track(event: .productRemovedFromCart(id: productId)) { trackResponse in + switch trackResponse { + case .success(_): + print("Product id \(productId) removed from 'Cart' success") + case let .failure(error): + switch error { + case let .custom(customError): + print("Error:", customError) + default: + print("Error:", error.description) + } + } + } + } + + public func sdkAddToFavorites(productId: String) { + sdk?.track(event: .productAddedToFavorites(id: productId)) { trackResponse in + switch trackResponse { + case .success(_): + print("Product id \(productId) added to 'Favorites' success") + case let .failure(error): + switch error { + case let .custom(customError): + print("Error:", customError) + default: + print("Error:", error.description) + } + } + } + } + + public func sdkRemoveFromFavorites(productId: String) { + sdk?.track(event: .productRemovedFromFavorites(id: productId)) { trackResponse in + switch trackResponse { + case .success(_): + print("Product id \(productId) removed from 'Favorites' success") + case let .failure(error): + switch error { + case let .custom(customError): + print("Error:", customError) + default: + print("Error:", error.description) + } + } + } + } + + public override func traitCollectionDidChange (_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + let userInterfaceStyle = traitCollection.userInterfaceStyle + if UIApplication.shared.applicationState == .inactive { + switch userInterfaceStyle { + case .unspecified: + self.reloadRecommendationsCollectionSubviews() + case .light: + self.reloadRecommendationsCollectionSubviews() + case .dark: + self.reloadRecommendationsCollectionSubviews() + @unknown default: + break + } + } + } + + public func reloadRecommendationsCollectionSubviews() { + self.setupWidgetBgColor() + UICollectionView.performWithoutAnimation { + self.layoutIfNeeded() + self.reloadData() + } + } + + public func openWidgetUrl(link: String) { + if let linkUrl = URL(string: link) { + self.parentViewController?.presentInternalSdkWebKit(webUrl: linkUrl) + } + } + + func formatValue(_ value: Double) -> String { + return String(format: "%.2f", value) + } + + private func strikeThrough(str: String) -> NSAttributedString { + let attributeString = NSMutableAttributedString(string: str) + attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: NSUnderlineStyle.single.rawValue, range: NSMakeRange(0, attributeString.length)) + return attributeString + } + + private class func formatValue(_ value: Double) -> Int { + return Int(value) * 2 + } + + public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let selectedRecommendationProductFroCell = cells[indexPath.row] + recommendationsDelegate?.didTapOnProduct(product: selectedRecommendationProductFroCell) + + openWidgetUrl(link: selectedRecommendationProductFroCell.url) + + print("\nUser did tap cell from Recommendations Widget\nUse 'recommendationsDelegate' for interactions\nProduct id: \(selectedRecommendationProductFroCell.id)\n") + } + + public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return CGSize(width: RecommendationsConstants.recommendationsCollectionItemWidth, height: frame.height * 0.9) + } + + required public init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift new file mode 100755 index 0000000..3f315ad --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift @@ -0,0 +1,289 @@ +import UIKit + +public protocol RecommendationsWidgetViewCellDelegate: AnyObject { + func didTapWidgetAddToCartButtonInside(cell: RecommendationsWidgetViewCell, position: CGPoint) + func didTapWidgetAddToFavoritesButtonInside(cell: RecommendationsWidgetViewCell, position: CGPoint) +} + +public class RecommendationsWidgetViewCell: UICollectionViewCell { + + static let reuseRecommCellId = "RecommendationsWidgetViewCell" + + fileprivate let keyCellTagStarsDefaults = "key" + + public weak var widgetCellDelegate: RecommendationsWidgetViewCellDelegate? + + public let recommendationsCellWidgetIndicator = StoriesSlideReloadIndicator() + + let recommendationsImageView: UIImageView = { + let rImageView = UIImageView() + rImageView.translatesAutoresizingMaskIntoConstraints = false + rImageView.contentMode = .scaleAspectFit + return rImageView + }() + + let recommendationsDiscountLabel: UILabel = { + let rLabel = UILabel() + rLabel.frame = CGRect(x: 0, y: 0, width: 55, height: 20) + rLabel.textColor = .white + rLabel.backgroundColor = UIColor(red: 175/255, green: 82/255, blue: 222/255, alpha: 1) + rLabel.layer.cornerRadius = 3 + rLabel.layer.masksToBounds = true + rLabel.translatesAutoresizingMaskIntoConstraints = false + return rLabel + }() + + let recommendationsCreditLabel: UILabel = { + let rLabel = UILabel() + rLabel.frame = CGRect(x: 0, y: 0, width: 55, height: 20) + rLabel.textColor = .white + rLabel.backgroundColor = UIColor(red: 255/255, green: 149/255, blue: 0/255, alpha: 1) + rLabel.layer.cornerRadius = 3 + rLabel.layer.masksToBounds = true + rLabel.translatesAutoresizingMaskIntoConstraints = false + return rLabel + }() + + lazy var recommendationsRatingStars: RecommendationsStarsView = { + let rateStarsView = RecommendationsStarsView() + rateStarsView.starsSetupSettings.filledImage = UIImage(named: "starFilled")?.withRenderingMode(.alwaysOriginal) + rateStarsView.starsSetupSettings.emptyImage = UIImage(named: "starEmpty")?.withRenderingMode(.alwaysOriginal) + rateStarsView.rating = 0 + rateStarsView.starsSetupSettings.fillMode = .half + rateStarsView.starsSetupSettings.reloadOnUserTouch = false + rateStarsView.translatesAutoresizingMaskIntoConstraints = false + return rateStarsView + }() + + let recommendationsRatingStarsNoReviewsLabel: UILabel = { + let rLabel = UILabel() + rLabel.font = UIFont.systemFont(ofSize: 16, weight: .medium) + rLabel.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + rLabel.translatesAutoresizingMaskIntoConstraints = false + return rLabel + }() + + let recommendationsRatingLabel: UILabel = { + let rLabel = UILabel() + rLabel.font = UIFont.systemFont(ofSize: 14, weight: .medium) + rLabel.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + rLabel.translatesAutoresizingMaskIntoConstraints = false + return rLabel + }() + + let recommendationsProductNameLabel: UILabel = { + let rLabel = UILabel() + rLabel.font = UIFont.systemFont(ofSize: 17, weight: .medium) + rLabel.textColor = .black + + if SdkConfiguration.isDarkMode { + rLabel.textColor = .white + } else { + rLabel.textColor = .black + } + + rLabel.translatesAutoresizingMaskIntoConstraints = false + rLabel.numberOfLines = 3 + rLabel.lineBreakMode = .byWordWrapping + rLabel.textAlignment = .left + return rLabel + }() + + let recommendationsClearLabel: UILabel = { + let rLabel = UILabel() + rLabel.font = UIFont.systemFont(ofSize: 11, weight: .regular) + rLabel.textColor = .black + rLabel.translatesAutoresizingMaskIntoConstraints = false + return rLabel + }() + + let recommendationsOldPrice: UILabel = { + let rLabel = UILabel() + rLabel.font = UIFont.systemFont(ofSize: 15, weight: .regular) + + if SdkConfiguration.isDarkMode { + rLabel.textColor = #colorLiteral(red: 0.9289160371, green: 0.9289160371, blue: 0.9289160371, alpha: 1) + } else { + rLabel.textColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) + } + + rLabel.numberOfLines = 0 + rLabel.translatesAutoresizingMaskIntoConstraints = false + return rLabel + }() + + let recommendationsPriceLabel: UILabel = { + let rLabel = UILabel() + rLabel.font = UIFont.systemFont(ofSize: 19, weight: .bold) + + if SdkConfiguration.isDarkMode { + rLabel.textColor = .white + } else { + rLabel.textColor = .black + } + + rLabel.numberOfLines = 0 + rLabel.translatesAutoresizingMaskIntoConstraints = false + return rLabel + }() + + let recommendationsCartButton: UIButton = { + let rAddToCartButton = UIButton() + rAddToCartButton.translatesAutoresizingMaskIntoConstraints = false + rAddToCartButton.layer.cornerRadius = 6 + rAddToCartButton.layer.masksToBounds = true + return rAddToCartButton + }() + + let recommendationsFavoritesButton: UIButton = { + let rAddToFavoritesButton = UIButton() + rAddToFavoritesButton.translatesAutoresizingMaskIntoConstraints = false + + if SdkConfiguration.isDarkMode { + rAddToFavoritesButton.tintColor = .black + rAddToFavoritesButton.setTitleColor(.black, for: .normal) + } else { + rAddToFavoritesButton.tintColor = .white + rAddToFavoritesButton.setTitleColor(.white, for: .normal) + } + return rAddToFavoritesButton + }() + + @objc + public func didAddToCartTapButton(_ sender: AnyObject) { + let tapCellPosition: CGPoint = sender.convert(CGPointZero, to: self) + widgetCellDelegate?.didTapWidgetAddToCartButtonInside(cell: self, position: tapCellPosition) + } + + @objc + public func didAddToFavoritesTapButton(_ sender: AnyObject) { + let tapFavCellPosition: CGPoint = sender.convert(CGPointZero, to: self) + widgetCellDelegate?.didTapWidgetAddToFavoritesButtonInside(cell: self, position: tapFavCellPosition) + } + + public override init(frame: CGRect) { + super.init(frame: frame) + + recommendationsCartButton.addTarget(self, action: #selector(didAddToCartTapButton(_:)), for: .touchUpInside) + + recommendationsFavoritesButton.addTarget(self, action: #selector(didAddToFavoritesTapButton(_:)), for: .touchUpInside) + + addSubview(recommendationsImageView) + addSubview(recommendationsDiscountLabel) + addSubview(recommendationsCreditLabel) + addSubview(recommendationsRatingStars) + addSubview(recommendationsRatingStarsNoReviewsLabel) + addSubview(recommendationsRatingLabel) + addSubview(recommendationsProductNameLabel) + addSubview(recommendationsClearLabel) + addSubview(recommendationsOldPrice) + addSubview(recommendationsPriceLabel) + addSubview(recommendationsCartButton) + addSubview(recommendationsFavoritesButton) + + backgroundColor = .white + + saveWidgetStarRating() + loadWidgetStarRating() + + recommendationsImageView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + recommendationsImageView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true + recommendationsImageView.topAnchor.constraint(equalTo: topAnchor, constant: 9).isActive = true + recommendationsImageView.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 2.34/5).isActive = true + //recommendationsImageView.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 1/3).isActive = true + + recommendationsDiscountLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 13).isActive = true + recommendationsDiscountLabel.topAnchor.constraint(equalTo: topAnchor, constant: 12).isActive = true + recommendationsDiscountLabel.heightAnchor.constraint(equalToConstant: 23).isActive = true + + recommendationsCreditLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12).isActive = true + recommendationsCreditLabel.topAnchor.constraint(equalTo: recommendationsDiscountLabel.bottomAnchor, constant: 7).isActive = true + recommendationsCreditLabel.heightAnchor.constraint(equalToConstant: 23).isActive = true + + recommendationsCreditLabel.isHidden = true //coming soon + recommendationsDiscountLabel.isHidden = true //coming soon + + recommendationsProductNameLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 14).isActive = true + recommendationsProductNameLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -14).isActive = true + recommendationsProductNameLabel.topAnchor.constraint(equalTo: recommendationsImageView.bottomAnchor, constant: 10).isActive = true + + recommendationsRatingStars.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 14).isActive = true + recommendationsRatingStars.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true + recommendationsRatingStars.bottomAnchor.constraint(equalTo: recommendationsOldPrice.topAnchor, constant: -6).isActive = true + + recommendationsRatingStarsNoReviewsLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 14).isActive = true + recommendationsRatingStarsNoReviewsLabel.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true + recommendationsRatingStarsNoReviewsLabel.bottomAnchor.constraint(equalTo: recommendationsOldPrice.topAnchor, constant: -4).isActive = true + + recommendationsRatingLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 140).isActive = true + recommendationsRatingLabel.bottomAnchor.constraint(equalTo: recommendationsOldPrice.topAnchor, constant: -8).isActive = true + + recommendationsClearLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 14).isActive = true + recommendationsClearLabel.topAnchor.constraint(equalTo: recommendationsOldPrice.bottomAnchor, constant: 8).isActive = true + + recommendationsOldPrice.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 14).isActive = true + recommendationsOldPrice.topAnchor.constraint(equalTo: recommendationsPriceLabel.topAnchor, constant: -20).isActive = true + + recommendationsPriceLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 14).isActive = true + recommendationsPriceLabel.topAnchor.constraint(equalTo: recommendationsCartButton.topAnchor, constant: -32).isActive = true + + recommendationsCartButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 14).isActive = true + recommendationsCartButton.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -13).isActive = true + recommendationsCartButton.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 2/3).isActive = true + recommendationsCartButton.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 1/10).isActive = true + + if SdkGlobalHelper.DeviceType.IS_IPHONE_14_PRO || SdkGlobalHelper.DeviceType.IS_IPHONE_XS || SdkGlobalHelper.DeviceType.IS_IPHONE_SE { + recommendationsFavoritesButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -14).isActive = true + } else { + recommendationsFavoritesButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -18).isActive = true + } + + recommendationsFavoritesButton.widthAnchor.constraint(equalToConstant: 27).isActive = true + recommendationsFavoritesButton.heightAnchor.constraint(equalToConstant: 27).isActive = true + recommendationsFavoritesButton.centerYAnchor.constraint(equalTo: recommendationsCartButton.centerYAnchor, constant: 0.0).isActive = true + } + + public override func layoutSubviews() { + super.layoutSubviews() + + var widgetCellBackgroundColor = SdkConfiguration.recommendations.widgetCellBackgroundColor.hexToRGB() + if SdkConfiguration.isDarkMode { + widgetCellBackgroundColor = SdkConfiguration.recommendations.widgetCellBackgroundColorDarkMode.hexToRGB() + } + layer.backgroundColor = UIColor(red: widgetCellBackgroundColor.red, green: widgetCellBackgroundColor.green, blue: widgetCellBackgroundColor.blue, alpha: 1).cgColor + + layer.masksToBounds = true + layer.borderWidth = SdkConfiguration.recommendations.widgetBorderWidth + + var widgetCellBorderColor = SdkConfiguration.recommendations.widgetBorderColor.hexToRGB() + if SdkConfiguration.isDarkMode { + widgetCellBorderColor = SdkConfiguration.recommendations.widgetBorderColorDarkMode.hexToRGB() + } + layer.borderColor = UIColor(red: widgetCellBorderColor.red, green: widgetCellBorderColor.green, blue: widgetCellBorderColor.blue, alpha: 1).withAlphaComponent(SdkConfiguration.recommendations.widgetBorderTransparent).cgColor + + layer.cornerRadius = SdkConfiguration.recommendations.widgetCornerRadius + } + + func saveWidgetStarRating() { + recommendationsRatingStars.didFinishTouchingRecommendationsStars = { stRating in + UserDefaults.standard.set(stRating, forKey: self.keyCellTagStarsDefaults) + } + } + + func loadWidgetStarRating() { + guard let rLoadedStarValue = UserDefaults.standard.object(forKey: keyCellTagStarsDefaults) as? Double else {return} + recommendationsRatingStars.rating = rLoadedStarValue + } + + override public func prepareForReuse() { + recommendationsRatingStars.prepareForReuse() + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func update(_ rating: Double) { + recommendationsRatingStars.rating = rating + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift new file mode 100644 index 0000000..30f6834 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift @@ -0,0 +1,54 @@ +import UIKit + +open class SearchWidget: NSObject { + var pref: UserDefaults! + + public static let shared: SearchWidget = SearchWidget() + + public override init() { + pref = UserDefaults.standard + } + + open func setCategories(value: [String]) { + pref.set(value, forKey: "categoriesSearch") + } + + open func getCategories() -> [String]? { + guard let categories = pref.object(forKey: "categoriesSearch") as? [String] else { + return nil + } + return categories + } + + open func setSearchHistories(value: [String]) { + pref.set(value, forKey: "historiesSearch") + } + + open func deleteSearchHistories(index: Int) { + guard var histories = pref.object(forKey: "historiesSearch") as? [String] else { + return + } + histories.remove(at: index) + + pref.set(histories, forKey: "historiesSearch") + } + + open func appendSearchHistories(value: String) { + var histories = [String]() + if let _histories = pref.object(forKey: "historiesSearch") as? [String] { + histories = _histories + } + //histories.append(value) + + pref.set(histories, forKey: "historiesSearch") + } + + open func getSearchHistories() -> [String]? { + guard let histories = pref.object(forKey: "historiesSearch") as? [String] else { + return nil + //return ["Shoes", "Dress", "jacket"] + } + + return histories + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift new file mode 100644 index 0000000..b7142f6 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift @@ -0,0 +1,101 @@ +import UIKit + +public enum SearchWidgetCategoriesButtonType { + case bordered + case blacked + case colored +} + +open class SearchWidgetCategoriesButton: UIButton { + open var type: SearchWidgetCategoriesButtonType? { + didSet { + guard let _type = type else { + return + } + self.setType(type: _type) + } + } + override init(frame: CGRect) { + super.init(frame: frame) + + self.initView() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + override open var isHighlighted: Bool { + didSet { + if let type = self.type { + switch type { + case .bordered: + switch isHighlighted { + case true: + layer.borderColor = UIColor.lightGray.cgColor + case false: + layer.borderColor = UIColor.darkGray.cgColor + } + + case .blacked: + switch isHighlighted { + case true: + layer.borderColor = UIColor.lightGray.cgColor + case false: + layer.borderColor = UIColor.white.cgColor + } + + case .colored: break + } + + } else { + switch isHighlighted { + case true: + layer.borderColor = UIColor.lightGray.cgColor + case false: + layer.borderColor = UIColor.darkGray.cgColor + } + } + } + } + open func initView() { + self.layer.borderColor = UIColor.darkGray.cgColor + self.layer.borderWidth = 1 + self.titleLabel?.font = UIFont.systemFont(ofSize: 12) + self.setTitleColor(UIColor.darkGray, for: .normal) + self.setTitleColor(UIColor.lightGray, for: .highlighted) + self.layer.cornerRadius = self.frame.height * 0.15 + } + + open func setType(type: SearchWidgetCategoriesButtonType) { + switch type { + case .bordered: + self.layer.borderColor = UIColor.darkGray.cgColor + self.layer.borderWidth = 1 + self.setTitleColor(UIColor.darkGray, for: .normal) + self.setTitleColor(UIColor.darkGray.withAlphaComponent(0.3), for: .highlighted) + + case .blacked: + self.layer.borderColor = nil + self.layer.borderWidth = 0 + self.backgroundColor = randomizeSearchColorScheme() + self.setTitleColor(UIColor.white, for: .normal) + self.setTitleColor(UIColor.white.withAlphaComponent(0.3), for: .highlighted) + + case .colored: + self.layer.borderColor = nil + self.layer.borderWidth = 0 + self.backgroundColor = UIColor.init(red: 246.0/255.0, green: 246.0/255.0, blue: 246.0/255.0, alpha: 1) + self.setTitleColor(UIColor.darkGray, for: .normal) + self.setTitleColor(UIColor.darkGray.withAlphaComponent(0.3), for: .highlighted) + } + } + + open func randomizeSearchColorScheme() -> UIColor { +// let colorArray = ["ff6699", "ff3366", "ff3333"] + let colorArray = ["000000"] + + let randomNumber = arc4random_uniform(UInt32(colorArray.count)) + return UIColor(hexString: colorArray[Int(randomNumber)]) + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift new file mode 100644 index 0000000..05bcbb9 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift @@ -0,0 +1,44 @@ +import UIKit + +public protocol SearchWidgetDelegate: SearchWidgetMainViewDelegate, SearchWidgetListViewDelegate { } + +public protocol SearchWidgetMainViewDelegate { + func searchWidgetCategoriesButtonClicked(productText: String) + + func sdkSearchWidgetHistoryButtonClicked(productText: String) + + func sdkSearchWidgetMainViewHistoryChanged() +} + + +public protocol SearchWidgetListViewDelegate { + func sdkSearchWidgetListViewClicked(productKey: String) + + func sdkSearchWidgetListViewClicked(object: Any) + + func sdkSearchWidgetListView(_ sdkSearchWidgetListView: UITableView, didSelectRowAt indexPath: IndexPath) + + func sdkSearchWidgetListView(_ sdkSearchWidgetListView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell + + func sdkSearchWidgetListViewDidScroll() +} + + +public extension SearchWidgetMainViewDelegate { + func sdkSearchWidgetMainViewHistoryChanged() { + // + } +} + + +public extension SearchWidgetListViewDelegate { + func sdkSearchWidgetListViewClicked(object: Any) { + // + } + + func sdkSearchWidgetListViewDidScroll() { + // + } +} + + diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift new file mode 100644 index 0000000..3faa7c1 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift @@ -0,0 +1,18 @@ +import UIKit + +private let area = CGSize(width: 44, height: 44) + +extension UIButton { + open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if self.isHidden || !self.isUserInteractionEnabled || self.alpha < 0.01 { + return nil + } + + let buttonSize = self.bounds.size + let widthToAdd = max(area.width - buttonSize.width, 0) + let heightToAdd = max(area.height - buttonSize.height, 0) + let largerFrame = self.bounds.insetBy(dx: -widthToAdd / 2, dy: -heightToAdd / 2) + + return (largerFrame.contains(point)) ? self : nil + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift new file mode 100644 index 0000000..3fad343 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift @@ -0,0 +1,82 @@ +import UIKit + +open class SearchWidgetHistoryView: UIView { + open var sdkSearchWidgetHistoryButton: SearchWidgetHistoryButton! + open var deleteButton: UIButton! + open var bottomLine: UIView! + + override init(frame: CGRect) { + super.init(frame: frame) + + self.initView() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + open func initView() { + self.sdkSearchWidgetHistoryButton = SearchWidgetHistoryButton(frame: CGRect(x: 0, y: 0, width: self.frame.width - 15, height: self.frame.height)) + self.addSubview(sdkSearchWidgetHistoryButton) + + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + + self.deleteButton = UIButton(frame: CGRect(x: self.frame.width - 15, y: (self.frame.height - 15)/2, width: 15, height: 15)) + let close = UIImage(named: "iconSearchClose", in: frameworkBundle, compatibleWith: nil) + + self.deleteButton.setImage(close, for: .normal) + self.deleteButton.isHidden = true + self.addSubview(deleteButton) + +// self.bottomLine = UIView(frame: CGRect(x: 0, y: self.frame.height-1, width: self.frame.width, height: 1)) +// self.bottomLine.backgroundColor = UIColor(red: 242.0/255.0, green: 242.0/255.0, blue: 242.0/255.0, alpha: 1.0) +// self.addSubview(bottomLine) + } +} + +open class SearchWidgetHistoryButton: UIButton { + open var textLabel: UILabel! + + override init(frame: CGRect) { + super.init(frame: frame) + + self.initView() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + override open var isHighlighted: Bool { + didSet { + switch isHighlighted { + case true: + self.textLabel.textColor = UIColor.darkGray.withAlphaComponent(0.3) + case false: + self.textLabel.textColor = UIColor.darkGray + } + } + } + + open func initView() { +// var frameworkBundle = Bundle(for: classForCoder) +//#if SWIFT_PACKAGE +// frameworkBundle = Bundle.module +//#endif +// let searchHistoryImageView = UIImageView(frame: CGRect(x: 0, y: (self.frame.height - 15)/2, width: 15, height: 15)) +// let search_history = UIImage(named: "iconSearchHistory", in: frameworkBundle, compatibleWith: nil) +// searchHistoryImageView.image = search_history +// self.addSubview(searchHistoryImageView) + + self.textLabel = UILabel(frame: CGRect(x: 2, y: 0, width: self.frame.width - 40, height: self.frame.height)) //25 + self.textLabel.font = UIFont.systemFont(ofSize: 14) + self.textLabel.textColor = UIColor.black.withAlphaComponent(0.9) + self.addSubview(textLabel) + + } + +} + diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift new file mode 100644 index 0000000..6ed57ed --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift @@ -0,0 +1,66 @@ +import UIKit + +open class SearchWidgetListView: UITableView, UITableViewDelegate, UITableViewDataSource, UIScrollViewDelegate { + open var database = [Any]() + open var searchResultDatabase = [Any]() + + open var sdkSearchWidgetListViewDelegate: SearchWidgetListViewDelegate? + open var sdkSearchWidget = SearchWidget() + open var sdkSearchWidgetTextFieldText: String? { + didSet { + guard let text = sdkSearchWidgetTextFieldText else { + return + } + + let objectification = Objectification(objects: database, type: .all) + let result = objectification.objects(contain: text) + + self.searchResultDatabase = result + if text.isEmpty { + self.initData(database: database) + } + self.reloadData() + } + } + + public override init(frame: CGRect, style: UITableView.Style) { + super.init(frame: frame, style: style) + self.initView() + } + + open func initData(database: [Any]) { + self.database = database + self.searchResultDatabase = database + self.reloadData() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = self.sdkSearchWidgetListViewDelegate?.sdkSearchWidgetListView(tableView, cellForRowAt: indexPath) else { + return UITableViewCell() + } + return cell + } + + open func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return searchResultDatabase.count + } + + open func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + self.sdkSearchWidgetListViewDelegate?.sdkSearchWidgetListView(tableView, didSelectRowAt: indexPath) + } + + open func scrollViewDidScroll(_ scrollView: UIScrollView) { + self.sdkSearchWidgetListViewDelegate?.sdkSearchWidgetListViewDidScroll() + } + + open func initView() { + self.delegate = self + self.dataSource = self + self.register(SearchWidgetListViewCell.self, forCellReuseIdentifier: SearchWidgetListViewCell.ID) + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift new file mode 100644 index 0000000..991afb4 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift @@ -0,0 +1,36 @@ +import UIKit + +open class SearchWidgetListViewCell: UITableViewCell { + public static let ID = "SearchWidgetListViewCell" + + var leftMargin = 15 + + open var searchImageView: UIImageView! + open var searchLabel: UILabel! + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + self.initView() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + open func initView() { + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + self.searchImageView = UIImageView(frame: CGRect(x: 15, y: (self.frame.height - 15)/2, width: 15, height: 15)) + let search = UIImage(named: "iconSearchClose", in: frameworkBundle, compatibleWith: nil) + self.searchImageView.image = search + self.addSubview(searchImageView) + + self.searchLabel = UILabel(frame: CGRect(x: 40, y: 0, width: self.frame.width - 20, height: self.frame.height)) + self.searchLabel.textColor = UIColor.darkGray + self.searchLabel.font = UIFont.systemFont(ofSize: 13) + self.addSubview(searchLabel) + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift new file mode 100644 index 0000000..57790ef --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift @@ -0,0 +1,186 @@ +import UIKit + +open class SearchWidgetMainView: UIView { + let width = UIScreen.main.bounds.width + let height = UIScreen.main.bounds.height + + open var recommendSearchCategoryLabel: UILabel! + open var sdkSearchWidgetCategoriesButtons = [SearchWidgetCategoriesButton]() + + open var searchHistoryLabel: UILabel! + open var searchRecentlyLabel: UILabel! + + open var sdkSearchWidgetHistoryViews = [SearchWidgetHistoryView]() + open var sdkSearchWidgetHistoryButtons = [SearchWidgetHistoryButton]() + open var clearHistoryButton: UIButton! + + var margin: CGFloat = 15 + open var delegate: SearchWidgetMainViewDelegate? + + open var sdkSearchWidget = SearchWidget() + + public override init(frame: CGRect) { + super.init(frame: frame) + + guard let constructorCategories = SearchWidget.shared.getCategories() else { + return + } + + self.initView(constructorCategories: constructorCategories) + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + open func setSearchWidgetCategoriesButtonType(type: SearchWidgetCategoriesButtonType) { + for searchWidgetCategoriesButton in self.sdkSearchWidgetCategoriesButtons { + searchWidgetCategoriesButton.type = type + } + } + + @objc + open func searchWidgetCategoriesButtonClicked(_ sender: UIButton) { + guard let productText = sdkSearchWidgetCategoriesButtons[sender.tag].titleLabel?.text else { + return + } + sdkSearchWidget.appendSearchHistories(value: productText) + self.delegate?.searchWidgetCategoriesButtonClicked(productText: productText) + } + + @objc + open func sdkSearchWidgetHistoryButtonClicked(_ sender: UIButton) { + guard let productText = sdkSearchWidgetHistoryButtons[sender.tag].textLabel.text else { + return + } + self.delegate?.sdkSearchWidgetHistoryButtonClicked(productText: productText) + } + + @objc + open func clearHistoryButtonClicked() { + //sdkSearchWidget.setSearchHistories(value: [String]()) + //self.redrawSearchRecentlyTableView() + } + + @objc + open func closeButtonClicked(_ sender: UIButton) { + sdkSearchWidget.deleteSearchHistories(index: sender.tag) + self.redrawSearchRecentlyTableView() + } + + open func initView(constructorCategories: [String]) { +// self.recommendSearchCategoryLabel = UILabel(frame: CGRect(x: margin, y: -20, width: width - 40, height: 50)) +// self.recommendSearchCategoryLabel.text = "" +// self.recommendSearchCategoryLabel.font = UIFont.boldSystemFont(ofSize: 11) +// self.recommendSearchCategoryLabel.textColor = UIColor.darkGray +// self.addSubview(self.recommendSearchCategoryLabel) + + let wFont = UIFont.systemFont(ofSize: 12) + let userAttributes = [NSAttributedString.Key.font: wFont, NSAttributedString.Key.foregroundColor: UIColor.gray] + + var formerWidth: CGFloat = margin + var formerHeight: CGFloat = 12 + + for i in 0.. 0 { + formerWidth = sdkSearchWidgetCategoriesButtons[i-1].frame.size.width + sdkSearchWidgetCategoriesButtons[i-1].frame.origin.x + 6 + if formerWidth + size.width + margin > UIScreen.main.bounds.width { + formerHeight += sdkSearchWidgetCategoriesButtons[i-1].frame.size.height + 5 + formerWidth = margin + } + } + let button = SearchWidgetCategoriesButton(frame: CGRect(x: formerWidth, y: formerHeight, width: size.width + 20, height: size.height + 17)) + button.addTarget(self, action: #selector(searchWidgetCategoriesButtonClicked(_:)), for: .touchUpInside) + button.setTitle(constructorCategories[i], for: .normal) + button.tag = i + + sdkSearchWidgetCategoriesButtons.append(button) + self.addSubview(button) + + } + guard let originY = sdkSearchWidgetCategoriesButtons.last?.frame.origin.y else { + return + } + + self.searchHistoryLabel = UILabel(frame: CGRect(x: margin, y: originY + 40, width: width - 40, height: 40)) + self.searchHistoryLabel.text = "YOUR REQUESTS" + self.searchHistoryLabel.font = UIFont.boldSystemFont(ofSize: 11) + self.searchHistoryLabel.textColor = UIColor.darkGray.withAlphaComponent(0.8) + self.addSubview(self.searchHistoryLabel) + + self.searchRecentlyLabel = UILabel(frame: CGRect(x: margin, y: originY + 270, width: width - 40, height: 40)) + self.searchRecentlyLabel.text = "RECENTLY VIEWED PRODUCTS" + self.searchRecentlyLabel.font = UIFont.boldSystemFont(ofSize: 11) + self.searchRecentlyLabel.textColor = UIColor.darkGray.withAlphaComponent(0.8) + //self.addSubview(self.searchRecentlyLabel) + + redrawSearchRecentlyTableView() + } + + open func redrawSearchRecentlyTableView() { + for sdkSearchWidgetHistoryView in sdkSearchWidgetHistoryViews { + sdkSearchWidgetHistoryView.removeFromSuperview() + } + sdkSearchWidgetHistoryViews.removeAll() + sdkSearchWidgetHistoryButtons.removeAll() + + if self.clearHistoryButton != nil { + self.clearHistoryButton.removeFromSuperview() + } + + let histories = sdkSearchWidget.getSearchHistories() ?? [String]() + let recently = sdkSearchWidget.getSearchHistories() ?? [String]() + + let searchHistoryLabelOriginY: CGFloat = searchHistoryLabel.frame.origin.y + searchHistoryLabel.frame.height + + for i in 0.. [Any] { + var returnObject = [Any]() + let predicate = NSPredicate(format: "SELF CONTAINS[c] %@", string) + + for i in 0.. [String] { + return mirror.children.compactMap { $0.label } + } + + private func values(mirror: Mirror) -> [String] { + var values = [String]() + for value in mirror.children { + values = values + checkArray(object:value.value) + } + + return values + } + + private func all(mirror: Mirror) -> [String] { + return mirror.children.compactMap { $0.label } + values(mirror: mirror) + } + + private func checkArray(object: Any) -> [String] { + var values = [String]() + if let valueArray = object as? Array { + for arrayValue in valueArray { + values = values + checkArray(object: arrayValue) + } + } else { + let objectString = String(describing: object) + if objectString != "nil" { + values.append(convertOptional(string: objectString)) + } + } + + return values + } + + private func convertOptional(string: String) -> String { + if string.hasPrefix("Optional(") && string.hasSuffix(")") { + let nonOptionalString = string.substring(10..) -> String { + let fromIndex = self.index(self.startIndex, offsetBy: r.lowerBound) + let toIndex = self.index(self.startIndex, offsetBy: r.upperBound) + let indexRange = Range(uncheckedBounds: (lower: fromIndex, upper: toIndex)) + return String(self[indexRange]) + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift new file mode 100644 index 0000000..98781f3 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift @@ -0,0 +1,79 @@ +import UIKit + +open class SearchWidgetTextField: UITextField { + override init(frame: CGRect) { + super.init(frame: frame) + + self.initView() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + open func initView() { + self.leftViewMode = .always + + let searchUIViewWrapper = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 15)) + +// var frameworkBundle = Bundle(for: classForCoder) +//#if SWIFT_PACKAGE +// frameworkBundle = Bundle.module +//#endif +// +// let searchImageView = UIImageView(frame: CGRect(x: 10, y: 0, width: 15, height: 15)) +// let search = UIImage(named: "iconSearch", in: frameworkBundle, compatibleWith: nil) +// searchImageView.image = search +// searchUIViewWrapper.addSubview(searchImageView) + + self.leftView = searchUIViewWrapper + self.returnKeyType = .search + self.placeholder = "Search" + self.font = UIFont.systemFont(ofSize: 14) + } + + deinit { + print("SDK deinit UITextField \(self.placeholder ?? "") \(self.text ?? "")") + } +} + +open class SearchWidgetTextFieldView: UIView { + open var sdkSearchWidgetTextField: SearchWidgetTextField! + open var cancelButton: UIButton! + + override init(frame: CGRect) { + super.init(frame: frame) + + self.initView() + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + open func initView() { + self.sdkSearchWidgetTextField = SearchWidgetTextField(frame: CGRect(x: -6, y: 0, width: self.frame.width + 10, height: self.frame.height)) + + self.sdkSearchWidgetTextField.layer.cornerRadius = 10 + self.sdkSearchWidgetTextField.layer.borderWidth = 2.3 + self.sdkSearchWidgetTextField.layer.borderColor = UIColor(red:183/255, green:183/255, blue:183/255, alpha: 1.0).cgColor + self.sdkSearchWidgetTextField.layer.masksToBounds = true + self.addSubview(self.sdkSearchWidgetTextField) + + self.cancelButton = UIButton(frame: CGRect(x: self.frame.width - 30, y: 12, width: 26, height: 26)) + //self.cancelButton.titleLabel?.font = UIFont.systemFont(ofSize: 14) + //self.cancelButton.setTitleColor(UIColor.darkGray, for: .normal) + //self.cancelButton.setTitleColor(UIColor.darkGray.withAlphaComponent(0.2), for: .highlighted) + + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + + let close = UIImage(named: "iconSearchClose", in: frameworkBundle, compatibleWith: nil) + self.cancelButton.setImage(close, for: .normal) + + self.cancelButton.isHidden = true + self.addSubview(self.cancelButton) + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift new file mode 100644 index 0000000..b065593 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift @@ -0,0 +1,81 @@ +import UIKit + +open class SearchWidgetView: UIView, SearchWidgetMainViewDelegate, SearchWidgetListViewDelegate { + open var delegate: SearchWidgetDelegate? + + open var sdkSearchWidgetScrollView: UIScrollView! + open var sdkSearchWidgetMainView: SearchWidgetMainView! + open var sdkSearchWidgetListView: SearchWidgetListView! + + override init(frame: CGRect) { + super.init(frame: frame) + + self.sdkSearchWidgetScrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)) + + self.sdkSearchWidgetMainView = SearchWidgetMainView(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)) + self.sdkSearchWidgetMainView.delegate = self + self.sdkSearchWidgetScrollView.addSubview(self.sdkSearchWidgetMainView) + + self.sdkSearchWidgetListView = SearchWidgetListView(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)) + self.sdkSearchWidgetListView.sdkSearchWidgetListViewDelegate = self + self.sdkSearchWidgetListView.isHidden = true + + if let clearHistoryButton = self.sdkSearchWidgetMainView.clearHistoryButton { + self.sdkSearchWidgetScrollView.contentSize = CGSize(width: self.frame.width, height: clearHistoryButton.frame.origin.y + clearHistoryButton.frame.height + 20) + } else { + self.sdkSearchWidgetScrollView.contentSize = CGSize(width: self.frame.width, height: self.frame.height) + } + self.sdkSearchWidgetScrollView.addSubview(self.sdkSearchWidgetListView) + + self.addSubview(sdkSearchWidgetScrollView) + } + + open func sdkSearchWidgetMainViewHistoryChanged() { + let size = CGSize(width: self.frame.width, height: self.sdkSearchWidgetMainView.clearHistoryButton.frame.origin.y + self.sdkSearchWidgetMainView.clearHistoryButton.frame.height + 20) + self.sdkSearchWidgetScrollView.contentSize = size + self.sdkSearchWidgetMainView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: size) + } + + required public init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + } + + open func scrollViewDidScroll() { + self.delegate?.sdkSearchWidgetListViewDidScroll() + } + + open func searchWidgetCategoriesButtonClicked(productText: String) { + self.delegate?.searchWidgetCategoriesButtonClicked(productText: productText) + } + + open func sdkSearchWidgetHistoryButtonClicked(productText: String) { + self.delegate?.sdkSearchWidgetHistoryButtonClicked(productText: productText) + } + + open func sdkSearchWidgetListViewClicked(productKey: String) { + self.delegate?.sdkSearchWidgetListViewClicked(productKey: productKey) + } + + open func sdkSearchWidgetListViewClicked(object: Any) { + self.delegate?.sdkSearchWidgetListViewClicked(object: object) + } + + open func loadSearchData() { + //self.delegate?.loadSearchData() + } + + open func sdkSearchWidgetListView(_ sdkSearchWidgetListView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = self.delegate?.sdkSearchWidgetListView(sdkSearchWidgetListView, cellForRowAt: indexPath) else { + return UITableViewCell() + } + return cell + } + + open func sdkSearchWidgetListView(_ sdkSearchWidgetListView: UITableView, didSelectRowAt indexPath: IndexPath) { + self.delegate?.sdkSearchWidgetListView(sdkSearchWidgetListView, didSelectRowAt: indexPath) + } + + open func sdkSearchWidgetListViewDidScroll() { + self.delegate?.sdkSearchWidgetListViewDidScroll() + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift new file mode 100644 index 0000000..6f492ac --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift @@ -0,0 +1,104 @@ +import UIKit + +open class SearchWidgetViewController: UIViewController, UITextFieldDelegate { + open var delegate: SearchWidgetDelegate? { + didSet { + self.sdkSearchWidgetView.delegate = delegate + } + } + + let width = UIScreen.main.bounds.width + let height = UIScreen.main.bounds.height + + open var sdkSearchWidgetTextFieldView: SearchWidgetTextFieldView! + open var sdkSearchWidgetView: SearchWidgetView! + + open var sWidget = SearchWidget() + + override open func viewDidLoad() { + super.viewDidLoad() + } + + override open func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + var safeAreaTopInset: CGFloat = 0 + safeAreaTopInset = view.safeAreaInsets.top + + self.sdkSearchWidgetTextFieldView.frame = CGRect(x: 20, y: safeAreaTopInset + 20, width: width - 40, height: 50) + self.sdkSearchWidgetView.frame = CGRect(x: 0, y: 70 + safeAreaTopInset, width: width, height: height - 70 - safeAreaTopInset) + } + + open func sdkSearchWidgetInit() { + self.sdkSearchWidgetTextFieldView = SearchWidgetTextFieldView(frame: CGRect(x: 20, y: 20, width: width - 40, height: 50)) + self.sdkSearchWidgetTextFieldView.sdkSearchWidgetTextField.delegate = self + self.sdkSearchWidgetTextFieldView.sdkSearchWidgetTextField.addTarget(self, action: #selector(sdkSearchWidgetTextFieldTextChanged(_:)), for: .editingChanged) + self.sdkSearchWidgetTextFieldView.cancelButton.addTarget(self, action: #selector(sdkSearchWidgetTextFieldCancelButtonClicked), for: .touchUpInside) + + self.sdkSearchWidgetTextFieldView.sdkSearchWidgetTextField.clearButtonMode = UITextField.ViewMode.never + self.sdkSearchWidgetTextFieldView.sdkSearchWidgetTextField.autocorrectionType = .no + + self.view.addSubview(self.sdkSearchWidgetTextFieldView) + + self.sdkSearchWidgetView = SearchWidgetView(frame: CGRect(x: 0, y: 70, width: width, height: height - 70)) + self.view.addSubview(self.sdkSearchWidgetView) + + //self.delegate?.loadSearchData() + //self.sdkSearchWidgetView.loadSearchData() + } + + open func setSearchWidgetCategoriesButtonType(type: SearchWidgetCategoriesButtonType) { + self.sdkSearchWidgetView.sdkSearchWidgetMainView.setSearchWidgetCategoriesButtonType(type: .blacked) + } + + open func initData(database: [Any]) { + self.sdkSearchWidgetView.sdkSearchWidgetListView.initData(database: database) + } + + @objc + open func sdkSearchWidgetTextFieldCancelButtonClicked() { + self.sdkSearchWidgetTextFieldView.sdkSearchWidgetTextField.text = "" + self.sdkSearchWidgetTextFieldView.sdkSearchWidgetTextField.endEditing(true) + self.sdkSearchWidgetView.sdkSearchWidgetMainView.redrawSearchRecentlyTableView() + + UIView.animate(withDuration: 0.3, animations: { + self.sdkSearchWidgetView.sdkSearchWidgetMainView.alpha = 1 + self.sdkSearchWidgetTextFieldView.cancelButton.alpha = 0 + self.sdkSearchWidgetView.sdkSearchWidgetListView.alpha = 0 + }) { (true) in + self.sdkSearchWidgetView.sdkSearchWidgetMainView.isHidden = false + self.sdkSearchWidgetView.sdkSearchWidgetListView.isHidden = true + self.sdkSearchWidgetTextFieldView.cancelButton.isHidden = true + } + } + @objc + open func sdkSearchWidgetTextFieldTextChanged(_ textField: UITextField) { + self.sdkSearchWidgetView.sdkSearchWidgetListView.sdkSearchWidgetTextFieldText = textField.text + } + + open func textFieldShouldReturn(_ textField: UITextField) -> Bool { + guard let text = textField.text else { + return true + } + + if !text.isEmpty { + self.sWidget.appendSearchHistories(value: text) + self.sdkSearchWidgetView.sdkSearchWidgetMainView.redrawSearchRecentlyTableView() + } + self.sdkSearchWidgetTextFieldView.sdkSearchWidgetTextField.endEditing(true) + + return true + } + + open func textFieldDidBeginEditing(_ textField: UITextField) { + UIView.animate(withDuration: 0.3, animations: { + self.sdkSearchWidgetView.sdkSearchWidgetMainView.alpha = 1 //0 + self.sdkSearchWidgetTextFieldView.cancelButton.alpha = 1 + self.sdkSearchWidgetView.sdkSearchWidgetListView.alpha = 0 //1 + }){ (true) in + self.sdkSearchWidgetView.sdkSearchWidgetMainView.isHidden = false //true + self.sdkSearchWidgetView.sdkSearchWidgetListView.isHidden = false + self.sdkSearchWidgetTextFieldView.cancelButton.isHidden = true //false + } + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/StoryViewController.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/StoryViewController.swift new file mode 100644 index 0000000..a16107f --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/StoryViewController.swift @@ -0,0 +1,1131 @@ +import UIKit +import AVFoundation + +public protocol StoryViewControllerProtocol: AnyObject { + func reloadStoriesCollectionSubviews() +} + +public protocol CarouselCollectionViewCellDelegate: AnyObject { + func closeProductsCarousel() + func sendStructSelectedCarouselProduct(product: StoriesProduct) +} + +public class NavigationStackController: UINavigationController { + + open weak var stackDelegate: UINavigationControllerDelegate? + + public override init(rootViewController: UIViewController) { + super.init(rootViewController: rootViewController) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + public override func viewDidLoad() { + super.viewDidLoad() + } + + func canBeMadeHeadViewController(viewController: UIViewController) -> Bool { + return viewController.isKind(of: StoryViewController.self) + } + + func resetNavigationStackWithLatestViewControllerAsHead() { + if viewControllers.count > 1 { + viewControllers.removeFirst((viewControllers.count - 1)) + } + } +} + +class StoryViewController: UINavigationController, UINavigationControllerDelegate, UIGestureRecognizerDelegate, CarouselCollectionViewCellDelegate { + private var collectionView: UICollectionView = { + let frame = CGRect(x: 0, y: 0, width: 300, height: 100) + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + layout.itemSize = CGSize(width: 100, height: 130) + layout.minimumInteritemSpacing = 0 + layout.minimumLineSpacing = 0 + let collectionView = UICollectionView(frame: frame, collectionViewLayout: layout) + collectionView.isPagingEnabled = true + collectionView.isScrollEnabled = false + collectionView.backgroundColor = .black + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + collectionView.isPrefetchingEnabled = false + return collectionView + }() + + public var closeButton: UIButton = { + let closeButton = UIButton() + return closeButton + }() + + private var pageIndicator: UIStackView = { + let view = UIStackView() + view.axis = .horizontal + view.distribution = .fillEqually + view.spacing = 8 + return view + }() + + public var stories: [Story] = [] + + public var startWithIndexPath: IndexPath? = .init(item: 1, section: 0) + public var currentPosition: IndexPath = IndexPath() + + private var timer = Timer() + + private var storyTime = 8 + + private var timeLeft: TimeInterval = 8 + private var endTime: Date? + + private var currentProgressView: UIProgressView? + private var currentDuration: Float = 0 + + private var lastContentStoryOffset = CGPoint.zero + private var needSaveStoryLocal = true + + public var sdk: PersonalizationSDK? + public var sdkLinkDelegate: StoriesViewLinkProtocol? + + private let carouselProductsSlideTintBlurView = UIView() + private var carouselProductsSlideCollectionView = CarouselCollectionView() + + private let storiesSlideReloadIndicator = StoriesSlideReloadIndicator() + + + override func viewDidLoad() { + super.viewDidLoad() + commonInit() + setupGestureRecognizerOnCollection() + + NotificationCenter.default.addObserver(self, selector: #selector(willEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil) + + NotificationCenter.default.addObserver(self, selector: #selector(pauseTimer), name: .init(rawValue: "ExternalActionStoryPause"), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(continueTimer), name: .init(rawValue: "ExternalActionStoryPlay"), object: nil) + UserDefaults.standard.set(false, forKey: "CarouselTimerStopMemorySetting") + UserDefaults.standard.set(false, forKey: "LastTapButtonMemorySdkSetting") + } + + @objc + func willEnterForeground() { + let ds: Bool = UserDefaults.standard.bool(forKey: "CarouselTimerStopMemorySetting") + if !ds { + let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" + NotificationCenter.default.post(name: .init(rawValue: "PlayVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + continueTimer() + } + } + + @objc + func didEnterBackground() { + let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" + NotificationCenter.default.post(name: .init(rawValue: "PauseVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + pauseTimer() + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + timer.invalidate() + } + + func applicationWillResignActive(notification: NSNotification) { + viewWillDisappear(true) + } + + func applicationWillEnterBackground(notification: NSNotification) { + viewWillAppear(true) + } + + public override func traitCollectionDidChange (_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + let userInterfaceStyle = traitCollection.userInterfaceStyle + if UIApplication.shared.applicationState == .inactive { + switch userInterfaceStyle { + case .unspecified: + let storySlideId = stories[currentPosition.section].id + let cachedSlideId = "cached.slide." + storySlideId + let userInfo = ["url": cachedSlideId] as [String: Any] + NotificationCenter.default.post(name:Notification.Name(cachedSlideId), object: userInfo) + self.sdkLinkDelegate?.reloadStoriesCollectionSubviews() + self.sdkLinkDelegate?.updateBgColor() + self.collectionView.reloadData() + case .light: + let storySlideId = stories[currentPosition.section].id + let cachedSlideId = "cached.slide." + storySlideId + let userInfo = ["url": cachedSlideId] as [String: Any] + NotificationCenter.default.post(name:Notification.Name(cachedSlideId), object: userInfo) + self.sdkLinkDelegate?.reloadStoriesCollectionSubviews() + self.sdkLinkDelegate?.updateBgColor() + self.collectionView.reloadData() + case .dark: + let storySlideId = stories[currentPosition.section].id + let cachedSlideId = "cached.slide." + storySlideId + let userInfo = ["url": cachedSlideId] as [String: Any] + NotificationCenter.default.post(name:Notification.Name(cachedSlideId), object: userInfo) + self.sdkLinkDelegate?.reloadStoriesCollectionSubviews() + self.sdkLinkDelegate?.updateBgColor() + self.collectionView.reloadData() + @unknown default: + break + } + } + } + + private func commonInit() { + view.addSubview(collectionView) + view.addSubview(closeButton) + view.addSubview(pageIndicator) + + storiesSlideReloadIndicator.contentMode = .scaleToFill + storiesSlideReloadIndicator.translatesAutoresizingMaskIntoConstraints = false + + let customIndicatorColor = SdkConfiguration.stories.storiesSlideReloadIndicatorBackgroundColor.hexToRGB() + storiesSlideReloadIndicator.strokeColor = UIColor(red: customIndicatorColor.red, green: customIndicatorColor.green, blue: customIndicatorColor.blue, alpha: 1) + + storiesSlideReloadIndicator.lineWidth = SdkConfiguration.stories.storiesSlideReloadIndicatorBorderLineWidth + storiesSlideReloadIndicator.numSegments = SdkConfiguration.stories.storiesSlideReloadIndicatorSegmentCount + storiesSlideReloadIndicator.animationDuration = SdkConfiguration.stories.storiesSlideReloadIndicatorAnimationDuration + storiesSlideReloadIndicator.rotationDuration = SdkConfiguration.stories.storiesSlideReloadIndicatorRotationDuration + storiesSlideReloadIndicator.alpha = 0.0 + view.addSubview(storiesSlideReloadIndicator) + + collectionView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint(item: collectionView, attribute: NSLayoutConstraint.Attribute.left, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.left, multiplier: 1, constant: 0).isActive = true + NSLayoutConstraint(item: collectionView, attribute: NSLayoutConstraint.Attribute.right, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.right, multiplier: 1, constant: 0).isActive = true + NSLayoutConstraint(item: collectionView, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: 0).isActive = true + NSLayoutConstraint(item: collectionView, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1, constant: 0).isActive = true + + pageIndicator.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint(item: pageIndicator, + attribute: NSLayoutConstraint.Attribute.left, + relatedBy: NSLayoutConstraint.Relation.equal, + toItem: view, attribute: NSLayoutConstraint.Attribute.left, + multiplier: 1, + constant: 11).isActive = true + NSLayoutConstraint(item: pageIndicator, + attribute: NSLayoutConstraint.Attribute.right, + relatedBy: NSLayoutConstraint.Relation.equal, + toItem: view, attribute: NSLayoutConstraint.Attribute.right, + multiplier: 1, + constant: -11).isActive = true + NSLayoutConstraint(item: pageIndicator, + attribute: NSLayoutConstraint.Attribute.height, + relatedBy: NSLayoutConstraint.Relation.equal, + toItem: nil, + attribute: NSLayoutConstraint.Attribute.notAnAttribute, + multiplier: 1, + constant: 4).isActive = true + if SdkGlobalHelper.sharedInstance.willDeviceHaveDynamicIsland() { + NSLayoutConstraint(item: pageIndicator, + attribute: NSLayoutConstraint.Attribute.top, + relatedBy: NSLayoutConstraint.Relation.equal, + toItem: view, + attribute: NSLayoutConstraint.Attribute.top, + multiplier: 1, + constant: 62).isActive = true } + else { + NSLayoutConstraint(item: pageIndicator, + attribute: NSLayoutConstraint.Attribute.top, + relatedBy: NSLayoutConstraint.Relation.equal, + toItem: view, + attribute: NSLayoutConstraint.Attribute.top, + multiplier: 1, + constant: 40).isActive = true + } + + closeButton.translatesAutoresizingMaskIntoConstraints = false + if SdkGlobalHelper.sharedInstance.willDeviceHaveDynamicIsland() { + NSLayoutConstraint(item: closeButton, attribute: NSLayoutConstraint.Attribute.right, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.right, multiplier: 1, constant: -10).isActive = true + NSLayoutConstraint(item: closeButton, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: pageIndicator, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1, constant: 26).isActive = true + NSLayoutConstraint(item: closeButton, attribute: NSLayoutConstraint.Attribute.width, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 30).isActive = true + NSLayoutConstraint(item: closeButton, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 30).isActive = true + } else { + NSLayoutConstraint(item: closeButton, attribute: NSLayoutConstraint.Attribute.right, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.right, multiplier: 1, constant: -10).isActive = true + NSLayoutConstraint(item: closeButton, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: pageIndicator, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1, constant: 5).isActive = true + NSLayoutConstraint(item: closeButton, attribute: NSLayoutConstraint.Attribute.width, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 30).isActive = true + NSLayoutConstraint(item: closeButton, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 30).isActive = true + } + + if SdkConfiguration.stories.storiesSlideReloadIndicatorDisabled { + //Disable implementation + } else { + storiesSlideReloadIndicator.translatesAutoresizingMaskIntoConstraints = false + storiesSlideReloadIndicator.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor).isActive = true + storiesSlideReloadIndicator.centerYAnchor.constraint(equalTo: collectionView.centerYAnchor).isActive = true + } + + configureView() + closeButton.addTarget(self, action: #selector(didTapCloseButton), for: .touchUpInside) + } + + @objc + private func didSingleTapOnScreen(_ gestureRecognizer: UITapGestureRecognizer) { + let tapLocation = gestureRecognizer.location(in: self.view) + let halfWidth = self.view.bounds.width / 2.0 + if tapLocation.x < halfWidth { + handleLeftTap() + } else { + handleRightTap() + } + } + + private func handleRightTap() { + needSaveStoryLocal = false + let storyId = stories[currentPosition.section].id + let storyName = "viewed.slide." + storyId + let slideId = stories[currentPosition.section].slides[currentPosition.row].id + + var viewedSlidesStoriesCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(storyName)) as? [String] ?? [] + let viewedStorySlideIdExists = viewedSlidesStoriesCachedArray.contains(where: { + $0.range(of: slideId) != nil + }) + + if !viewedStorySlideIdExists { + viewedSlidesStoriesCachedArray.append(slideId) + UserDefaults.standard.setValue(viewedSlidesStoriesCachedArray, for: UserDefaults.Key(storyName)) + needSaveStoryLocal = true + } + + if currentPosition.row < stories[currentPosition.section].slides.count - 1 { + currentPosition.row += 1 + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + + DispatchQueue.main.async { + self.updateSlides() + } + } else if currentPosition.section >= stories.count - 1 { + self.dismiss(animated: true) + } else if currentPosition.section < stories.count - 1 { + + currentPosition.row = 0 + + let storyId = stories[currentPosition.section + 1].id + let storyName = "viewed.slide." + storyId + let slideId = stories[currentPosition.section + 1].slides[currentPosition.row].id + + var allStoriesMainArray: [String] = [] + for (index, _) in stories[currentPosition.section + 1].slides.enumerated() { + allStoriesMainArray.append(stories[currentPosition.section + 1].slides[(index)].id) + } + + let viewedSlidesStoriesCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(storyName)) as? [String] ?? [] + let viewedStorySlideIdExists = viewedSlidesStoriesCachedArray.contains(where: { + $0.range(of: slideId) != nil + }) + + if viewedStorySlideIdExists { + let lastViewedSlideIndexValue = viewedSlidesStoriesCachedArray.last + var currentDefaultIndex = 0 + for name in allStoriesMainArray { + if name == lastViewedSlideIndexValue { + break + } + currentDefaultIndex += 1 + } + + if (currentDefaultIndex + 1 < stories[currentPosition.section + 1].slides.count) { + currentPosition.section += 1 + currentPosition.row = currentDefaultIndex + 1 + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } else if (currentDefaultIndex + 1 == stories[currentPosition.section + 1].slides.count) { + currentPosition.section += 1 + currentPosition.row = currentDefaultIndex + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } else { + currentPosition.section += 1 + currentPosition.row = 0 + + scrollToFirstRow() + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + } else { + currentPosition.section += 1 + currentPosition.row = 0 + + scrollToFirstRow() + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + + DispatchQueue.main.async { + self.updateSlides() + } + } + } + + private func handleLeftTap() { + if currentPosition.row > 0 { + currentPosition.row -= 1 + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + DispatchQueue.main.async { + self.updateSlides() + } + } else if currentPosition.section == 0 { + self.dismiss(animated: true) + } else if currentPosition.section >= 1 { + + currentPosition.row = 0 + + let storyId = stories[currentPosition.section - 1].id + let storyName = "viewed.slide." + storyId + let slideId = stories[currentPosition.section - 1].slides[currentPosition.row].id + + var allStoriesMainArray: [String] = [] + for (index, _) in stories[currentPosition.section - 1].slides.enumerated() { + allStoriesMainArray.append(stories[currentPosition.section - 1].slides[(index)].id) + } + + let viewedSlidesStoriesCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(storyName)) as? [String] ?? [] + let viewedStorySlideIdExists = viewedSlidesStoriesCachedArray.contains(where: { + $0.range(of: slideId) != nil + }) + + if viewedStorySlideIdExists { + let lastViewedSlideIndexValue = viewedSlidesStoriesCachedArray.last + var currentDefaultIndex = 0 + for name in allStoriesMainArray { + if name == lastViewedSlideIndexValue { + break + } + currentDefaultIndex += 1 + } + + if (currentDefaultIndex + 1 < stories[currentPosition.section - 1].slides.count) { + if currentDefaultIndex == 0 { + currentPosition.section -= 1 + currentPosition.row = currentDefaultIndex + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } else { + if (currentDefaultIndex + 1 <= stories[currentPosition.section - 1].slides.count) { + currentPosition.section -= 1 + currentPosition.row = currentDefaultIndex + 1 + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } else { + currentPosition.section -= 1 + currentPosition.row = currentDefaultIndex + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + } + } else { + currentPosition.section -= 1 + currentPosition.row = 0 + + scrollToFirstRow() + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + } else { + currentPosition.section -= 1 + currentPosition.row = 0 + + scrollToFirstRow() + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + + DispatchQueue.main.async { + self.updateSlides() + } + } + } + + @objc + func didSwipeLeft() { + if currentPosition.section >= stories.count - 1{ + dismiss(animated: true) + } else { + needSaveStoryLocal = false + currentPosition.row = 0 + + let storyId = stories[currentPosition.section + 1].id + let storyName = "viewed.slide." + storyId + let slideId = stories[currentPosition.section + 1].slides[currentPosition.row].id + + var allStoriesMainArray: [String] = [] + for (index, _) in stories[currentPosition.section + 1].slides.enumerated() { + allStoriesMainArray.append(stories[currentPosition.section + 1].slides[(index)].id) + } + + let viewedSlidesStoriesCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(storyName)) as? [String] ?? [] + let viewedStorySlideIdExists = viewedSlidesStoriesCachedArray.contains(where: { + $0.range(of: slideId) != nil + }) + + if viewedStorySlideIdExists { + let lastViewedSlideIndexValue = viewedSlidesStoriesCachedArray.last + var currentDefaultIndex = 0 + for name in allStoriesMainArray { + if name == lastViewedSlideIndexValue { + break + } + currentDefaultIndex += 1 + } + + if (currentDefaultIndex + 1 < stories[currentPosition.section + 1].slides.count) { + currentPosition.section += 1 + currentPosition.row = currentDefaultIndex + 1 + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } else if (currentDefaultIndex + 1 == stories[currentPosition.section + 1].slides.count) { + currentPosition.section += 1 + currentPosition.row = 0 //currentDefaultIndex + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } else { + currentPosition.section += 1 + currentPosition.row = 0 + + scrollToFirstRow() + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + } else { + needSaveStoryLocal = false + currentPosition.section += 1 + currentPosition.row = 0 + scrollToFirstRow() + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + + DispatchQueue.main.async { + self.updateSlides() + } + } + } + + private func scrollToFirstRow() { + let sectionFrame = collectionView.layoutAttributesForItem(at: IndexPath(item: 0, section: currentPosition.section))?.frame ?? .zero + collectionView.setContentOffset(CGPoint(x: sectionFrame.origin.x - collectionView.contentInset.left, y: 0), animated: false) + } + + @objc + func didSwipeRight() { + if currentPosition.section > 0 { + currentPosition.row = 0 + + let storyId = stories[currentPosition.section - 1].id + let storyName = "viewed.slide." + storyId + let slideId = stories[currentPosition.section - 1].slides[currentPosition.row].id + + var allStoriesMainArray: [String] = [] + for (index, _) in stories[currentPosition.section - 1].slides.enumerated() { + allStoriesMainArray.append(stories[currentPosition.section - 1].slides[(index)].id) + } + + let viewedSlidesStoriesCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(storyName)) as? [String] ?? [] + let viewedStorySlideIdExists = viewedSlidesStoriesCachedArray.contains(where: { + $0.range(of: slideId) != nil + }) + + if viewedStorySlideIdExists { + let lastViewedSlideIndexValue = viewedSlidesStoriesCachedArray.last + var currentDefaultIndex = 0 + for name in allStoriesMainArray { + if name == lastViewedSlideIndexValue { + break + } + currentDefaultIndex += 1 + } + + if (currentDefaultIndex + 1 < stories[currentPosition.section - 1].slides.count) { + if (currentDefaultIndex + 1 <= stories[currentPosition.section - 1].slides.count) { + currentPosition.section -= 1 + currentPosition.row = currentDefaultIndex + 1 + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } else { + currentPosition.section -= 1 + currentPosition.row = currentDefaultIndex + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + } else { + currentPosition.section -= 1 + currentPosition.row = 0 + + scrollToFirstRow() + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + } else { + currentPosition.section -= 1 + currentPosition.row = 0 + + scrollToFirstRow() + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + + DispatchQueue.main.async { + self.updateSlides() + } + } else { + dismiss(animated: true) + } + } + + private func configureView() { + collectionView.delegate = self + collectionView.dataSource = self + + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + let image = UIImage(named: "iconStoryClose", in: frameworkBundle, compatibleWith: nil) + let imageRender = image?.withRenderingMode(.alwaysTemplate) + let imageView = UIImageView(image: imageRender) + closeButton.setImage(imageView.image, for: .normal) + + let customTintColor = SdkConfiguration.stories.closeIconColor.hexToRGB() + closeButton.tintColor = UIColor(red: customTintColor.red, green: customTintColor.green, blue: customTintColor.blue, alpha: 1) + collectionView.register(StoryCollectionViewCell.self, forCellWithReuseIdentifier: StoryCollectionViewCell.cellId) + + updateSlides() + } + + private func updateSlides() { + // Check if stories array is not empty and currentPosition indices are valid + guard !stories.isEmpty else { + print("Error: Stories array is empty") + return + } + + guard stories.indices.contains(currentPosition.section) else { + print("Error: Section index \(currentPosition.section) is out of range") + return + } + + let story = stories[currentPosition.section] + + guard story.slides.indices.contains(currentPosition.row) else { + print("Error: Row index \(currentPosition.row) is out of range for section \(currentPosition.section)") + return + } + + let storySlideMedia = story.slides[currentPosition.row] + storyTime = storySlideMedia.duration + + if storySlideMedia.type == .video { + let videoDurationInCache = SdkGlobalHelper.sharedInstance.retrieveVideoCachedParamsDictionary(parentSlideId: storySlideMedia.id) + if let videoDurationSeconds = videoDurationInCache[storySlideMedia.id] { + storyTime = Int(videoDurationSeconds) ?? storySlideMedia.duration + } else { + // Handle case where video duration cannot be retrieved + } + } + + timeLeft = TimeInterval(storyTime) + + // Clear existing arranged subviews + for view in pageIndicator.arrangedSubviews { + pageIndicator.removeArrangedSubview(view) + } + + // Update page indicators + let slides = story.slides + for (index, _) in slides.enumerated() { + let progressView = UIProgressView() + progressView.tintColor = .white + if index == currentPosition.row { + progressView.progress = 0 + startProgress(progressView: progressView) + } else if index < currentPosition.row { + progressView.progress = 1 + } else { + progressView.progress = 0 + } + pageIndicator.addArrangedSubview(progressView) + } + } + + private func startProgress(progressView: UIProgressView) { + endTime = Date().addingTimeInterval(timeLeft) + let duration: Float = Float(timeLeft) + currentProgressView = progressView + currentDuration = duration + + let superviewSlideId = stories[currentPosition.section].slides[currentPosition.row].id + let cachedSlideMediaId = "cached.slide." + superviewSlideId + + let imagesForStoriesDownloadedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(cachedSlideMediaId)) as? [String] ?? [] + let imageStoryIdDownloaded = imagesForStoriesDownloadedArray.contains(where: { + $0.range(of: cachedSlideMediaId) != nil + }) + + if imageStoryIdDownloaded { + if SdkConfiguration.stories.storiesSlideReloadIndicatorDisabled { + //Implementation + } else { + UIView.animate(withDuration: 0.3, animations: { + self.storiesSlideReloadIndicator.alpha = 0.0 + }) + } + + timer.invalidate() + timer = Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true) + } else { + timer.invalidate() + + if SdkConfiguration.stories.storiesSlideReloadIndicatorDisabled { + UIView.animate(withDuration: 0.5, animations: { + self.storiesSlideReloadIndicator.alpha = 0.0 + }) + } else { + UIView.animate(withDuration: 0.5, animations: { + self.storiesSlideReloadIndicator.alpha = 1.0 + }) + } + + NotificationCenter.default.removeObserver(self, name: NSNotification.Name(cachedSlideMediaId), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(self.updateVisibleCells(notification:)), + name: Notification.Name(cachedSlideMediaId), object: nil) + } + } + + @objc + func updateVisibleCells(notification: NSNotification) { + DispatchQueue.main.async { + if let visibleCell = self.collectionView.indexPathsForVisibleItems.first { + UIView.animate(withDuration: 0.5, animations: { + self.storiesSlideReloadIndicator.alpha = 0.0 + }) + self.currentPosition = visibleCell + self.collectionView.reloadItems(at: self.collectionView.indexPathsForVisibleItems) + DispatchQueue.main.async { + self.updateSlides() + } + } + } + } + + @objc + func updateTime() { + if timeLeft > 0 { + timeLeft = endTime?.timeIntervalSinceNow ?? 0 + currentProgressView?.progress = 1 - Float(timeLeft) / currentDuration + } else { + currentProgressView?.progress = 0 + timer.invalidate() + needSaveStoryLocal = true + if currentPosition.row < stories[currentPosition.section].slides.count - 1 { + currentPosition.row += 1 + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + DispatchQueue.main.async { + self.updateSlides() + } + } else if currentPosition.section >= stories.count - 1 { + self.dismiss(animated: true) + } else if currentPosition.section < stories.count - 1 { + + currentPosition.row = 0 + + let storyId = stories[currentPosition.section + 1].id + let storyName = "viewed.slide." + storyId + let slideId = stories[currentPosition.section + 1].slides[currentPosition.row].id + + var allStoriesMainArray: [String] = [] + for (index, _) in stories[currentPosition.section + 1].slides.enumerated() { + allStoriesMainArray.append(stories[currentPosition.section + 1].slides[(index)].id) + } + + let viewedSlidesStoriesCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(storyName)) as? [String] ?? [] + let viewedStorySlideIdExists = viewedSlidesStoriesCachedArray.contains(where: { + $0.range(of: slideId) != nil + }) + + if viewedStorySlideIdExists { + let lastViewedSlideIndexValue = viewedSlidesStoriesCachedArray.last + var currentDefaultIndex = 0 + for name in allStoriesMainArray { + if name == lastViewedSlideIndexValue { + break + } + currentDefaultIndex += 1 + } + + if (currentDefaultIndex + 1 < stories[currentPosition.section + 1].slides.count) { + currentPosition.section += 1 + currentPosition.row = currentDefaultIndex + 1 + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } else if (currentDefaultIndex + 1 == stories[currentPosition.section + 1].slides.count) { + currentPosition.section += 1 + currentPosition.row = currentDefaultIndex + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } else { + currentPosition.section += 1 + currentPosition.row = 0 + + scrollToFirstRow() + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + } else { + currentPosition.section += 1 + currentPosition.row = 0 + collectionView.scrollToItem(at: currentPosition, at: .left, animated: true) + } + + DispatchQueue.main.async { + self.updateSlides() + } + } + } + } + + private func saveStorySlideWatching(index: IndexPath) { + let storyId = stories[index.section].id + let storyName = "viewed.slide." + storyId + let slideId = stories[index.section].slides[index.row].id + + var viewedSlidesStoriesCachedArray: [String] = UserDefaults.standard.getValue(for: UserDefaults.Key(storyName)) as? [String] ?? [] + let viewedStorySlideIdExists = viewedSlidesStoriesCachedArray.contains(where: { + $0.range(of: slideId) != nil + }) + + if !viewedStorySlideIdExists { + viewedSlidesStoriesCachedArray.append(slideId) + UserDefaults.standard.setValue(viewedSlidesStoriesCachedArray, for: UserDefaults.Key(storyName)) + } + } + + public func openUrl(link: String) { + if let linkUrl = URL(string: link) { + pauseTimer() + + let carouselOpenedBoolKey: Bool = UserDefaults.standard.bool(forKey: "CarouselTimerStopMemorySetting") + if !carouselOpenedBoolKey { + NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "WebKitClosedContinueTimerSetting"), object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(continueTimer), name: Notification.Name("WebKitClosedContinueTimerSetting"), object: nil) + } + + presentInternalSdkWebKit(webUrl: linkUrl, completion: nil) + + let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" + NotificationCenter.default.post(name: .init(rawValue: "PauseVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + } + } + + @objc + private func pauseTimer() { + timer.invalidate() + } + + @objc + private func continueTimer() { + endTime = Date().addingTimeInterval(timeLeft) + timer = Timer.scheduledTimer(timeInterval: 0.05, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true) + } + + private func trackViewSlide(index: IndexPath) { + let storyId = stories[index.section].id + let slideId = stories[index.section].slides[index.row].id + sdk?.track(event: .slideView(storyId: storyId, slideId: slideId), recommendedBy: nil, completion: { result in + }) + } + + private func trackClickSlide(index: IndexPath) { + let storyId = stories[index.section].id + let slideId = stories[index.section].slides[index.row].id + sdk?.track(event: .slideClick(storyId: storyId, slideId: slideId), recommendedBy: nil, completion: { result in + }) + } + + private func setupGestureRecognizerOnCollection() { + let longPressedGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(gestureRecognizer:))) + + collectionView.gestureRecognizers = [] + longPressedGesture.isEnabled = true + longPressedGesture.minimumPressDuration = 0.20 + + longPressedGesture.allowableMovement = 50 + longPressedGesture.delaysTouchesBegan = true + longPressedGesture.cancelsTouchesInView = true + let singleTap = UITapGestureRecognizer(target: self, action: #selector(didSingleTapOnScreen(_:))) + singleTap.require(toFail: longPressedGesture) + collectionView.addGestureRecognizer(longPressedGesture) + collectionView.addGestureRecognizer(singleTap) + + let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(didSwipeLeft)) + leftSwipe.direction = .left + leftSwipe.require(toFail: longPressedGesture) + let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(didSwipeRight)) + rightSwipe.direction = .right + rightSwipe.require(toFail: longPressedGesture) + let downSwipe = UISwipeGestureRecognizer(target: self, action: #selector(didSwipeDown)) + downSwipe.direction = .down + downSwipe.require(toFail: longPressedGesture) + + collectionView.addGestureRecognizer(leftSwipe) + collectionView.addGestureRecognizer(rightSwipe) + collectionView.addGestureRecognizer(downSwipe) + } + + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return false + } + + @objc + private func handleLongPress(gestureRecognizer: UILongPressGestureRecognizer) { + let positionNumber = gestureRecognizer.location(in: collectionView) + if gestureRecognizer.state == .ended { + if let indexPath = collectionView.indexPathForItem(at: positionNumber) { + let slide = stories[indexPath.section].slides[indexPath.row] + NotificationCenter.default.post(name: .init(rawValue: "PlayVideoLongTap"), object: nil, userInfo: ["slideID": slide.id]) + continueTimer() + } + return + } + if (gestureRecognizer.state != .began) { + if let indexPath = collectionView.indexPathForItem(at: positionNumber) { + let slide = stories[indexPath.section].slides[indexPath.row] + NotificationCenter.default.post(name: .init(rawValue: "PauseVideoLongTap"), object: nil, userInfo: ["slideID": slide.id]) + pauseTimer() + } + return + } else { + if let indexPath = collectionView.indexPathForItem(at: positionNumber) { + let slide = stories[indexPath.section].slides[indexPath.row] + NotificationCenter.default.post(name: .init(rawValue: "PauseVideoLongTap"), object: nil, userInfo: ["slideID": slide.id]) + pauseTimer() + } + } + } + + class CustomFlowLayout: UICollectionViewFlowLayout { + var currentScrollDirection = "" + func currentScroll(direction: String) { + currentScrollDirection = direction + } + } + + public func openProductsCarouselView(withProducts: [StoriesProduct], hideLabel: String) { + pauseTimer() + view.backgroundColor = .clear + + carouselProductsSlideTintBlurView.backgroundColor = UIColor(white: 0, alpha: 0.8) + carouselProductsSlideTintBlurView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height) + carouselProductsSlideCollectionView.hideLabel = hideLabel + view.addSubview(carouselProductsSlideTintBlurView) + + view.addSubview(self.carouselProductsSlideCollectionView) + + self.carouselProductsSlideCollectionView.center = CGPoint(x: self.view.center.x, y: self.view.center.y + self.view.frame.size.height) + self.view.addSubview(self.carouselProductsSlideCollectionView) + self.view.bringSubviewToFront(self.carouselProductsSlideCollectionView) + + UIView.animate(withDuration: 0.6, delay: 0.0, + usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, + options: .allowAnimatedContent, animations: { + self.carouselProductsSlideCollectionView.center = self.view.center + }) { (isFinished) in + self.view.layoutIfNeeded() + } + + carouselProductsSlideCollectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true + carouselProductsSlideCollectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true + carouselProductsSlideCollectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true + + if SdkGlobalHelper.DeviceType.IS_IPHONE_14_PRO { + carouselProductsSlideCollectionView.heightAnchor.constraint(equalToConstant: 420).isActive = true + } else if SdkGlobalHelper.DeviceType.IS_IPHONE_SE || SdkGlobalHelper.DeviceType.IS_IPHONE_8_PLUS { + carouselProductsSlideCollectionView.heightAnchor.constraint(equalToConstant: 430).isActive = true + } else { + carouselProductsSlideCollectionView.heightAnchor.constraint(equalToConstant: 450).isActive = true + } + + carouselProductsSlideCollectionView.carouselProductsDelegate = self + carouselProductsSlideCollectionView.cells.removeAll() + carouselProductsSlideCollectionView.set(cells: withProducts) + + carouselProductsSlideCollectionView.reloadData() + + let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" + NotificationCenter.default.post(name: .init(rawValue: "PauseVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + + UserDefaults.standard.set(true, forKey: "CarouselTimerStopMemorySetting") + } + + public func closeProductsCarousel() { + UIView.animate(withDuration: 0.4, delay: 0.0,usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, + options: .allowAnimatedContent, animations: { + + self.carouselProductsSlideCollectionView.center = CGPoint(x: self.view.center.x, + y: self.view.center.y + self.view.frame.size.height) + + }) { (isFinished) in + self.carouselProductsSlideTintBlurView.removeFromSuperview() + self.carouselProductsSlideCollectionView.removeFromSuperview() + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" + NotificationCenter.default.post(name: .init(rawValue: "PlayVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) { + self.continueTimer() + } + } + UserDefaults.standard.set(false, forKey: "CarouselTimerStopMemorySetting") + } + + public func didTapOpenLinkExternalServiceMethod(url: String, slide: Slide) { + let stateButton: Bool = UserDefaults.standard.bool(forKey: "LastTapButtonMemorySdkSetting") + if stateButton { + continueTimer() + + let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" + NotificationCenter.default.post(name: .init(rawValue: "PlayVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + print("SDK Start Timer Play Content") + UserDefaults.standard.set(false, forKey: "LastTapButtonMemorySdkSetting") + } else { + print("SDK Pause Timer\n") + UserDefaults.standard.set(true, forKey: "LastTapButtonMemorySdkSetting") + } + } + + public func sendStructSelectedStorySlide(storySlide: StoriesElement) { + pauseTimer() + + let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" + NotificationCenter.default.post(name: .init(rawValue: "PauseVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + self.sdkLinkDelegate?.sendStructSelectedStorySlide(storySlide: storySlide) + } + + func sendStructSelectedCarouselProduct(product: StoriesProduct) { + sdkLinkDelegate?.structOfSelectedCarouselProduct(product: product) + if (product.deeplinkIos != "") { + openUrl(link: product.deeplinkIos) + } else { + openUrl(link: product.url) + } + } + + public func sendStructSelectedPromocodeSlide(promoCodeSlide: StoriesPromoCodeElement) { + pauseTimer() + + let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" + NotificationCenter.default.post(name: .init(rawValue: "PauseVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + self.sdkLinkDelegate?.sendStructSelectedPromocodeSlide(promoCodeSlide: promoCodeSlide) + } + + @objc + func didSwipeDown() { + dismiss(animated: true) + } + + @objc + func didTapCloseButton() { + self.sdkLinkDelegate?.reloadStoriesCollectionSubviews() + dismiss(animated: true) + } +} + + +extension StoryViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + func numberOfSections(in collectionView: UICollectionView) -> Int { + stories.count + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + stories[section].slides.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + + storiesSlideReloadIndicator.startAnimating() + + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: StoryCollectionViewCell.cellId, for: indexPath) as? StoryCollectionViewCell else { + return UICollectionViewCell() + } + let slide = stories[indexPath.section].slides[indexPath.row] + cell.configure(slide: slide) + cell.cellDelegate = self + return cell + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let screenSize = UIScreen.main.bounds.size + return screenSize + } + + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + if let visibleCell = collectionView.indexPathsForVisibleItems.first { + currentPosition = visibleCell + DispatchQueue.main.async { + self.updateSlides() + } + } + } + + func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { + if let _cell = cell as? StoryCollectionViewCell { + _cell.stopPlayer() + + let currentOffset = collectionView.contentOffset + let scrollDirection = (currentOffset.x > lastContentStoryOffset.x) ? "Left" : "Right" + if let flowLayout = collectionView.collectionViewLayout as? CustomFlowLayout { + flowLayout.currentScroll(direction: scrollDirection) + } + lastContentStoryOffset = currentOffset + if (scrollDirection == "Left" && needSaveStoryLocal) { + saveStorySlideWatching(index: indexPath) + } + } + } + + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { +// timer.invalidate() + } + + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return true + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + guard let cell = collectionView.cellForItem(at: indexPath) as? StoryCollectionViewCell else {return} + cell.stopPlayer() + } + + func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { + trackViewSlide(index: indexPath) + if let startWithIndexPath = startWithIndexPath { + if collectionView.isValid(indexPath: startWithIndexPath) { + self.collectionView.scrollToItem(at: startWithIndexPath, at: .left, animated: false) + } + self.startWithIndexPath = nil + } + } +} + + +extension StoryViewController: StoryCollectionViewCellDelegate { + public func didTapUrlButton(url: String, slide: Slide) { + self.openUrl(link: url) + for (section, story) in stories.enumerated() { + for (row, storySlide) in story.slides.enumerated() { + if storySlide.id == slide.id { + self.trackClickSlide(index: IndexPath(row: row, section: section)) + } + } + } + } +} + + +extension UICollectionView { + func isValid(indexPath: IndexPath) -> Bool { + guard indexPath.section < numberOfSections, + indexPath.row < numberOfItems(inSection: indexPath.section) + else { + return false + } + return true + } +} + + +extension NavigationStackController: UINavigationControllerDelegate { + public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { + if canBeMadeHeadViewController(viewController: viewController) { + viewController.navigationItem.setHidesBackButton(false, animated: false) + } + } + + public func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) { + if canBeMadeHeadViewController(viewController: viewController) { + resetNavigationStackWithLatestViewControllerAsHead() + } + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift new file mode 100644 index 0000000..804081c --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift @@ -0,0 +1,32 @@ +import UIKit +import Foundation + +protocol TBAppearanceConfigurable { + var textColor: UIColor { get } + var cornerRadius: CGFloat { get } + var clipsToBounds: Bool { get } + var backgroundColor: UIColor { get } + var yOffset: CGFloat { get } +} + +public struct TBAppearanceConfiguration: TBAppearanceConfigurable { + let yOffset: CGFloat + let textColor: UIColor + let backgroundColor: UIColor + let cornerRadius: CGFloat + let clipsToBounds: Bool + + init(from textBlockObject: StoriesElement, clipsToBounds: Bool = true) { + self.yOffset = textBlockObject.yOffset ?? 0 + self.textColor = textBlockObject.textColor != nil + ? UIColor(hexString: textBlockObject.textColor!) + : .black + + self.backgroundColor = textBlockObject.textBackgroundColor != nil + ? UIColor(hexString: textBlockObject.textBackgroundColor!).withOpacity(from: textBlockObject.textBackgroundColorOpacity ?? "") + : UIColor.clear + + self.cornerRadius = CGFloat(textBlockObject.cornerRadius) + self.clipsToBounds = clipsToBounds + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift new file mode 100644 index 0000000..143159f --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift @@ -0,0 +1,51 @@ +import Foundation +import UIKit + +public struct TBFontConfiguration { + let font: UIFont + + init(from textBlockObject: StoriesElement) { + let fontType = textBlockObject.fontType ?? .unknown + let fontSize = textBlockObject.fontSize ?? UIFont.systemFontSize + let isFontBold = textBlockObject.textBold ?? false + let isFontItalic = textBlockObject.textItalic ?? false + + self.font = TBFontConfiguration.getFont(for: fontType, + isBold: isFontBold, + isItalic: isFontItalic, + fontSize: fontSize) + } + + private static func getFont(for fontType: FontType, + isBold: Bool = false, + isItalic: Bool = false, + fontSize: CGFloat) -> UIFont { + let fontMap: [FontType: String] = [ + .monospaced: StoryTextBlockConstants.FontConstants.monospaced, + .serif: StoryTextBlockConstants.FontConstants.serif, + .sansSerif: StoryTextBlockConstants.FontConstants.sansSerif, + .unknown: UIFont.systemFont(ofSize: fontSize).fontName + ] + + var font: UIFont + if let fontName = fontMap[fontType], !fontName.isEmpty { + font = UIFont(name: fontName, size: fontSize) ?? UIFont.systemFont(ofSize: fontSize) + } else { + font = UIFont.systemFont(ofSize: fontSize) + } + + var symbolicTraits: UIFontDescriptor.SymbolicTraits = [] + if isBold { + symbolicTraits.insert(.traitBold) + } + if isItalic { + symbolicTraits.insert(.traitItalic) + } + + if let descriptor = font.fontDescriptor.withSymbolicTraits(symbolicTraits) { + font = UIFont(descriptor: descriptor, size: fontSize) + } + + return font + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift new file mode 100644 index 0000000..037ee42 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift @@ -0,0 +1,36 @@ +import Foundation +import UIKit + +protocol TBTextConfigurable { + var text: NSAttributedString { get } + var textAlignment: NSTextAlignment { get } +} + +public struct TBTextConfiguration: TBTextConfigurable { + let text: NSAttributedString + let textAlignment: NSTextAlignment + + init(from textBlockObject: StoriesElement) { + if let textLineSpacing = textBlockObject.textLineSpacing, + let textBlockInput = textBlockObject.textInput { + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = textLineSpacing + self.text = NSAttributedString(string: textBlockInput, attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]) + } else { + self.text = NSAttributedString(string: textBlockObject.textInput ?? "") + } + + self.textAlignment = { + switch textBlockObject.textAlignment { + case .left: + return .left + case .right: + return .right + case .center: + return .center + default: + return .left + } + }() + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift new file mode 100644 index 0000000..5695e8d --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift @@ -0,0 +1,14 @@ +import Foundation +import UIKit + +public struct TextBlockConfiguration { + let fontConfiguration: TBFontConfiguration + let appearanceConfiguration: TBAppearanceConfigurable + let textConfiguration: TBTextConfigurable + + init(from textBlockObject: StoriesElement) { + self.fontConfiguration = TBFontConfiguration(from: textBlockObject) + self.appearanceConfiguration = TBAppearanceConfiguration(from: textBlockObject) + self.textConfiguration = TBTextConfiguration(from: textBlockObject) + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift new file mode 100644 index 0000000..70a2efa --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift @@ -0,0 +1,20 @@ +import Foundation +import UIKit + +public struct StoryTextBlockConstants { + + public struct FontConstants { + public static let monospaced = "Menlo" + public static let serif = "Georgia" + public static let sansSerif = "Arial" + } + + public static let leftAnchorOffsetConstant: CGFloat = 5 + public static let rightAnchorOffsetConstant: CGFloat = -5 + public static let topAnchorOffsetConstant: CGFloat = 2 + public static let bottomAnchorOffsetConstant: CGFloat = -2 + public static let constantToAvoidProgressViewNoNotch: CGFloat = 44 + public static let constantToAvoidProgressViewWithNotch: CGFloat = 10 + public static let aspectRationRelatedConstant: CGFloat = 20 +} + diff --git a/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockView.swift b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockView.swift new file mode 100644 index 0000000..d523f6e --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/TextBlockView/TextBlockView.swift @@ -0,0 +1,54 @@ +import UIKit +import Foundation + +class TextBlockView: UIView { + let yOffset: CGFloat + + private let label: UILabel = { + let label = UILabel() + label.numberOfLines = 0 + label.translatesAutoresizingMaskIntoConstraints = false + return label + }() + + init(with textBlockConfiguration: TextBlockConfiguration) { + self.yOffset = textBlockConfiguration.appearanceConfiguration.yOffset + super.init(frame: .zero) + configureLabel(with: textBlockConfiguration) + setupView(hasBackground: textBlockConfiguration.appearanceConfiguration.backgroundColor != .clear) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupView(hasBackground: Bool) { + addSubview(label) + + NSLayoutConstraint.activate([ + label.topAnchor.constraint(equalTo: topAnchor, constant: 8), + label.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8), + label.leadingAnchor.constraint(equalTo: leadingAnchor, constant: hasBackground ? 16 : 0), + label.trailingAnchor.constraint(equalTo: trailingAnchor, constant: hasBackground ? -16 : 0) + ]) + } + + private func configureLabel(with config: TextBlockConfiguration) { + label.font = config.fontConfiguration.font + label.textColor = config.appearanceConfiguration.textColor + self.layer.cornerRadius = config.appearanceConfiguration.cornerRadius + self.clipsToBounds = config.appearanceConfiguration.clipsToBounds + self.backgroundColor = config.appearanceConfiguration.backgroundColor + label.attributedText = config.textConfiguration.text + label.textAlignment = config.textConfiguration.textAlignment + } + + override var intrinsicContentSize: CGSize { + let labelSize = label.intrinsicContentSize + return CGSize(width: labelSize.width + 32, height: labelSize.height + 16) + } + + override func layoutSubviews() { + super.layoutSubviews() + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/WebKit/RView_Extensions.swift b/Pods/REES46/REES46/Classes/Stories/WebKit/RView_Extensions.swift new file mode 100644 index 0000000..fe2e04d --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/WebKit/RView_Extensions.swift @@ -0,0 +1,37 @@ +import UIKit + +extension UIView { + + var safeTopAnchor: NSLayoutYAxisAnchor { + return self.safeAreaLayoutGuide.topAnchor + } + + var safeLeadingAnchor: NSLayoutXAxisAnchor { + return self.safeAreaLayoutGuide.leadingAnchor + } + + var safeTrailingtAnchor: NSLayoutXAxisAnchor { + return self.safeAreaLayoutGuide.trailingAnchor + } + + var safeBottomAnchor: NSLayoutYAxisAnchor { + return self.safeAreaLayoutGuide.bottomAnchor + } + + func bindFrameToSuperviewBounds() { + guard let superview = self.superview else { + print("Error! `superview` was nil – call `addSubview(view: UIView)`") + return + } + + self.translatesAutoresizingMaskIntoConstraints = false + self.topAnchor.constraint( + equalTo: superview.topAnchor, constant: 0).isActive = true + self.bottomAnchor.constraint( + equalTo: superview.bottomAnchor, constant: 0).isActive = true + self.leadingAnchor.constraint( + equalTo: superview.leadingAnchor, constant: 0).isActive = true + self.trailingAnchor.constraint( + equalTo: superview.trailingAnchor, constant: 0).isActive = true + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/WebKit/RWebViewController.swift b/Pods/REES46/REES46/Classes/Stories/WebKit/RWebViewController.swift new file mode 100644 index 0000000..3a91b9f --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/WebKit/RWebViewController.swift @@ -0,0 +1,286 @@ +import UIKit +import WebKit + +public class RWebViewController:UIViewController, WKUIDelegate { + + enum WebViewKeyPath:String { + case estimatedProgress + case title + } + + private lazy var container = UIView(frame: CGRect.zero) + private lazy var progressView = UIProgressView(progressViewStyle: .bar) + public private(set) lazy var rWebView:WKWebView = WKWebView(frame: CGRect.zero) + + private lazy var toolbar:UIView = { + let v = UIView(frame: CGRect.zero) + v.isUserInteractionEnabled = true + v.heightAnchor.constraint(equalToConstant: 44.0).isActive = true + v.translatesAutoresizingMaskIntoConstraints = false + + let blurEffect = UIBlurEffect(style: .light) + let blurEffectView = UIVisualEffectView(effect: blurEffect) + v.addSubview(blurEffectView) + blurEffectView.bindFrameToSuperviewBounds() + return v + }() + + private lazy var titleLabel:UILabel = { + let lbl = UILabel(frame: CGRect(x: 0.0, y: 0.0, width: 250.0, height: 16.0)) + lbl.adjustsFontSizeToFitWidth = true + lbl.minimumScaleFactor = 0.9 + lbl.textAlignment = .center + lbl.font = UIFont.boldSystemFont(ofSize: 16) + return lbl + }() + + private lazy var urlLabel:UILabel = { + let lbl = UILabel(frame: CGRect(x: 0.0, y: 0.0, width: 250.0, height: 10.0)) + lbl.adjustsFontSizeToFitWidth = true + lbl.minimumScaleFactor = 0.9 + lbl.textAlignment = .center + lbl.font = UIFont.systemFont(ofSize: 10) + return lbl + }() + + private let topMargin:CGFloat = 10.0 + private var lastLocation:CGPoint = .zero + public var request:URLRequest! + + public override var title: String? { + didSet { + titleLabel.text = title + } + } + + var detail:String? { + didSet { + urlLabel.text = detail + } + } + + public var titleHidden:Bool = false + + override public func loadView() { + super.loadView() + setupMainLayout() + setupToolbar() + } + + override public func viewDidLoad() { + super.viewDidLoad() + addPanGestureRecognizer() + titleLabel.text = titleHidden ? "" : NSLocalizedString("Loading...", comment: "Loading...") + rWebView.navigationDelegate = self + rWebView.uiDelegate = self + rWebView.load(request) + } + + public override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + addWebViewObservers() + } + + public override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + removeWebViewObservers() + } + + private func setupToolbar() { + let closeButton = createImageButton(imageName: "iconWebKitClose") + closeButton.addTarget(self, action: #selector(dismissWebView(_:)), for: .touchUpInside) + closeButton.tintColor = .gray + closeButton.widthAnchor.constraint(equalTo: closeButton.heightAnchor).isActive = true + + let titleStackView = UIStackView(arrangedSubviews: [titleLabel, urlLabel]) + titleStackView.axis = .vertical + + let toolbarStackView = UIStackView(arrangedSubviews: [closeButton, titleStackView]) + toolbarStackView.spacing = 2.0 + toolbarStackView.axis = .horizontal + toolbar.addSubview(toolbarStackView) + + toolbarStackView.translatesAutoresizingMaskIntoConstraints = false + toolbarStackView.topAnchor.constraint(equalTo: toolbar.topAnchor, constant: 5).isActive = true + toolbarStackView.leadingAnchor.constraint(equalTo: toolbar.leadingAnchor, constant: 5).isActive = true + toolbarStackView.bottomAnchor.constraint(equalTo: toolbar.bottomAnchor, constant: -5).isActive = true + toolbarStackView.trailingAnchor.constraint(equalTo: toolbar.trailingAnchor, constant: -49).isActive = true + } + + private func createImageButton(imageName: String) -> UIButton { + var frameworkBundle = Bundle(for: classForCoder) +#if SWIFT_PACKAGE + frameworkBundle = Bundle.module +#endif + let image = UIImage(named: "iconWebKitClose", in: frameworkBundle, compatibleWith: nil) + + let closeButton = UIButton(type: .custom) + closeButton.setImage(image, for: .normal) + return closeButton + } + + private func setupMainLayout() { + view = UIView() + view.autoresizingMask = [.flexibleHeight, .flexibleWidth] + view.backgroundColor = .clear + view.addSubview(container) + container.translatesAutoresizingMaskIntoConstraints = false + container.topAnchor.constraint( + equalTo: view.safeTopAnchor, constant: topMargin).isActive = true + container.bottomAnchor.constraint( + equalTo: view.bottomAnchor).isActive = true + container.leadingAnchor.constraint( + equalTo: view.safeLeadingAnchor, constant: 0).isActive = true + container.trailingAnchor.constraint( + equalTo: view.safeTrailingtAnchor, constant: 0).isActive = true + container.layer.cornerRadius = 16.0 + container.clipsToBounds = true + + let progressViewContainer = UIView() + progressViewContainer.backgroundColor = UIColor.white + progressViewContainer.addSubview(progressView) + progressView.bindFrameToSuperviewBounds() + progressViewContainer.heightAnchor.constraint(equalToConstant: 1) + .isActive = true + + let mainStackView = UIStackView(arrangedSubviews: [ + toolbar, + progressViewContainer, + rWebView]) + + mainStackView.axis = .vertical + container.addSubview(mainStackView) + mainStackView.bindFrameToSuperviewBounds() + } + + private func addWebViewObservers() { + rWebView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil) + rWebView.addObserver(self, forKeyPath: #keyPath(WKWebView.title), options: .new, context: nil) + rWebView.addObserver(self, forKeyPath: #keyPath(WKWebView.canGoBack), options: .new, context: nil) + rWebView.addObserver(self, forKeyPath: #keyPath(WKWebView.canGoForward), options: .new, context: nil) + } + + private func removeWebViewObservers() { + rWebView.removeObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress)) + rWebView.removeObserver(self, forKeyPath: #keyPath(WKWebView.title)) + rWebView.removeObserver(self, forKeyPath: #keyPath(WKWebView.canGoBack)) + rWebView.removeObserver(self, forKeyPath: #keyPath(WKWebView.canGoForward)) + } + + @objc + private func dismissWebView(_ sender: UIButton) { + dismiss(completion: nil) + } + + public func dismiss(completion: (() -> Void)? = nil) { + dismiss(animated: true, completion: { + NotificationCenter.default.post(name: NSNotification.Name(rawValue: "WebKitClosedContinueTimerSetting"), object: nil) + + let carouselOpenedBoolKey: Bool = UserDefaults.standard.bool(forKey: "CarouselTimerStopMemorySetting") + if !carouselOpenedBoolKey { + let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" + NotificationCenter.default.post(name: .init(rawValue: "PlayVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + } + }) + } + + override public func observeValue(forKeyPath keyPath: String?, of object: Any?, + change: [NSKeyValueChangeKey : Any]?, + context: UnsafeMutableRawPointer?) { + + switch keyPath { + case WebViewKeyPath.estimatedProgress.rawValue: + progressView.progress = Float(rWebView.estimatedProgress) + if progressView.progress == 1.0 { + progressView.alpha = 0.0 + + } else if progressView.alpha != 1.0 { + progressView.alpha = 1.0 + + } + case WebViewKeyPath.title.rawValue: + title = titleHidden ? "" : rWebView.title + if !titleHidden, let scheme = rWebView.url?.scheme, + let host = rWebView.url?.host { + detail = "\(scheme)://\(host)" + + } else { + detail = "" + } + default: + break + } + } +} + + +extension RWebViewController:UIGestureRecognizerDelegate { + + fileprivate func addPanGestureRecognizer() { + let panRecognizer = UIPanGestureRecognizer( + target: self, + action: #selector(self.handlePanning(_:))) + panRecognizer.delegate = self + panRecognizer.maximumNumberOfTouches = 1 + panRecognizer.minimumNumberOfTouches = 1 + panRecognizer.cancelsTouchesInView = true + toolbar.gestureRecognizers?.forEach { + $0.require(toFail: panRecognizer) + } + toolbar.gestureRecognizers = [panRecognizer] + } + + @objc + private func handlePanning(_ gestureRecognizer: UIPanGestureRecognizer?) { + + if gestureRecognizer?.state == .began { + lastLocation = container.center + } + + if gestureRecognizer?.state != .cancelled { + guard let translation: CGPoint = gestureRecognizer? + .translation(in: view) else { + return + } + container.center = CGPoint( + x: container.center.x, + y: lastLocation.y + translation.y) + } + + if gestureRecognizer?.state == .ended { + if container.frame.origin.y > view.frame.size.height/2.0 { + dismiss() + return + } + + UIView.animate( + withDuration: 0.7, + delay: 0.0, + usingSpringWithDamping: 0.5, + initialSpringVelocity: 0.5, + options: .allowUserInteraction, + animations: { + self.container.center = self.lastLocation + + }) { finished in + + } + } + } +} + + +extension RWebViewController:WKNavigationDelegate { + + public func webView(_ webView: WKWebView, + decidePolicyFor navigationAction: WKNavigationAction, + decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + switch navigationAction.navigationType { + case .linkActivated: + webView.load(navigationAction.request) + default: + break + } + decisionHandler(.allow) + } +} diff --git a/Pods/REES46/REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift b/Pods/REES46/REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift new file mode 100644 index 0000000..8e0bf03 --- /dev/null +++ b/Pods/REES46/REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift @@ -0,0 +1,19 @@ +import UIKit + +public extension UIViewController { + + @objc + func presentWebKit(urlRequest: URLRequest, titleHidden:Bool = false, completion: (() -> Void)? = nil) { + let rweb = RWebViewController() + rweb.request = urlRequest + rweb.modalPresentationStyle = .overCurrentContext + rweb.titleHidden = titleHidden + present(rweb, animated: true, completion: completion) + } + + @objc + func presentInternalSdkWebKit(webUrl: URL, titleHidden:Bool = false, completion: (() -> Void)? = nil) { + let urlRequest = URLRequest(url: webUrl) + presentWebKit(urlRequest: urlRequest, titleHidden: titleHidden, completion: completion) + } +} diff --git a/Pods/REES46/REES46/Classes/services/notification/events/RegisterNotification.swift b/Pods/REES46/REES46/Classes/services/notification/events/RegisterNotification.swift new file mode 100644 index 0000000..fb4a2fe --- /dev/null +++ b/Pods/REES46/REES46/Classes/services/notification/events/RegisterNotification.swift @@ -0,0 +1,48 @@ +import Foundation +import UIKit + +class NotificationRegistrar { + private let sdk: PersonalizationSDK + private let mainPushTokenLastUploadDateKey = "mainPushTokenLastUploadDateKey" + + init(sdk: PersonalizationSDK) { + self.sdk = sdk + } + + func registerWithDeviceToken(deviceToken: Data) { + guard let sdk = sdk as? SimplePersonalizationSDK, + sdk.autoSendPushToken == true + else { return } + + if let pushTokenLastUpdateDate = UserDefaults.standard.object(forKey: self.mainPushTokenLastUploadDateKey) as? Date { + let currentDate = Date() + let timeSincePushTokenLastUpdate = currentDate.timeIntervalSince(pushTokenLastUpdateDate) + let oneWeekInSeconds: TimeInterval = 7 * 24 * 60 * 60 + + guard timeSincePushTokenLastUpdate >= oneWeekInSeconds else { + return + } + } + + let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() + sdk.setPushTokenNotification(token: token) { [weak self] tokenResponse in + guard let self = self else { return } + switch tokenResponse { + case .success(): + UserDefaults.standard.setValue(Date(), forKey: self.mainPushTokenLastUploadDateKey) + return + case .failure(let error): + self.handleRegistrationError(error) + } + } + } + + private func handleRegistrationError(_ error: SDKError) { + switch error { + case let .custom(customError): + print("SDK Push Token Error:", customError) + default: + print("SDK Push Token server, \(error.description)\n") + } + } +} diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown index 102af75..e55d3e5 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown @@ -1,3 +1,26 @@ # Acknowledgements This application makes use of the following third party libraries: + +## REES46 + +Copyright REES46 (c) 2023. All rights reserved. + +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 REES46 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 REES46 SOFTWARE. + Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist index 7acbad1..34b435c 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist @@ -12,6 +12,35 @@ Type PSGroupSpecifier + + FooterText + Copyright REES46 (c) 2023. All rights reserved. + +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 REES46 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 REES46 SOFTWARE. + + License + MIT + Title + REES46 + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 0000000..9bbe13e --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh +${BUILT_PRODUCTS_DIR}/REES46/REES46.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 0000000..628e46b --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist new file mode 100644 index 0000000..9bbe13e --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh +${BUILT_PRODUCTS_DIR}/REES46/REES46.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist new file mode 100644 index 0000000..628e46b --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh new file mode 100755 index 0000000..b17e8ae --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh @@ -0,0 +1,186 @@ +#!/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="${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 -f "${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. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" + 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}/REES46/REES46.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/REES46/REES46.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig index 26f2c77..1826d4c 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig @@ -1,5 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "REES46" +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}/. diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig index 26f2c77..1826d4c 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig @@ -1,5 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "REES46" +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}/. diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist index 3173534..19cf209 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist @@ -22,7 +22,5 @@ ${CURRENT_PROJECT_VERSION} NSPrincipalClass - - diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown index 102af75..e55d3e5 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown @@ -1,3 +1,26 @@ # Acknowledgements This application makes use of the following third party libraries: + +## REES46 + +Copyright REES46 (c) 2023. All rights reserved. + +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 REES46 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 REES46 SOFTWARE. + Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist index 7acbad1..34b435c 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist @@ -12,6 +12,35 @@ Type PSGroupSpecifier + + FooterText + Copyright REES46 (c) 2023. All rights reserved. + +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 REES46 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 REES46 SOFTWARE. + + License + MIT + Title + REES46 + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 0000000..d4accde --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh +${BUILT_PRODUCTS_DIR}/REES46/REES46.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 0000000..628e46b --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist new file mode 100644 index 0000000..d4accde --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh +${BUILT_PRODUCTS_DIR}/REES46/REES46.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist new file mode 100644 index 0000000..628e46b --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh new file mode 100755 index 0000000..b17e8ae --- /dev/null +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh @@ -0,0 +1,186 @@ +#!/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="${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 -f "${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. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" + 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}/REES46/REES46.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/REES46/REES46.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig index 26f2c77..f6da505 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig @@ -1,5 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "REES46" +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}/. diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig index 26f2c77..f6da505 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig @@ -1,5 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "REES46" +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}/. diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig index 26f2c77..40b2d2d 100644 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig @@ -1,5 +1,8 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "REES46" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig index 26f2c77..40b2d2d 100644 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig @@ -1,5 +1,8 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "REES46" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/Pods/Target Support Files/REES46/REES46-Info.plist b/Pods/Target Support Files/REES46/REES46-Info.plist new file mode 100644 index 0000000..bd1dfc7 --- /dev/null +++ b/Pods/Target Support Files/REES46/REES46-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.6.19 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/REES46/REES46-dummy.m b/Pods/Target Support Files/REES46/REES46-dummy.m new file mode 100644 index 0000000..1fd05c0 --- /dev/null +++ b/Pods/Target Support Files/REES46/REES46-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_REES46 : NSObject +@end +@implementation PodsDummy_REES46 +@end diff --git a/Pods/Target Support Files/REES46/REES46-prefix.pch b/Pods/Target Support Files/REES46/REES46-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/REES46/REES46-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/Pods/Target Support Files/REES46/REES46-umbrella.h b/Pods/Target Support Files/REES46/REES46-umbrella.h new file mode 100644 index 0000000..35e49c2 --- /dev/null +++ b/Pods/Target Support Files/REES46/REES46-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 REES46VersionNumber; +FOUNDATION_EXPORT const unsigned char REES46VersionString[]; + diff --git a/Pods/Target Support Files/REES46/REES46.debug.xcconfig b/Pods/Target Support Files/REES46/REES46.debug.xcconfig new file mode 100644 index 0000000..9607f60 --- /dev/null +++ b/Pods/Target Support Files/REES46/REES46.debug.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/REES46 +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/REES46 +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/Pods/Target Support Files/REES46/REES46.modulemap b/Pods/Target Support Files/REES46/REES46.modulemap new file mode 100644 index 0000000..651159b --- /dev/null +++ b/Pods/Target Support Files/REES46/REES46.modulemap @@ -0,0 +1,6 @@ +framework module REES46 { + umbrella header "REES46-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/REES46/REES46.release.xcconfig b/Pods/Target Support Files/REES46/REES46.release.xcconfig new file mode 100644 index 0000000..9607f60 --- /dev/null +++ b/Pods/Target Support Files/REES46/REES46.release.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/REES46 +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/REES46 +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/README.md b/README.md index ad34f06..a057107 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ -# demo-ios -Demo app +# REES46 SDK for iOS + +[![Version](https://img.shields.io/cocoapods/v/REES46.svg?style=flat)](https://cocoapods.org/pods/REES46) +![iOS](https://img.shields.io/badge/iOS-release) +![Release](https://img.shields.io/badge/release-blueviolet) +[![License](https://img.shields.io/cocoapods/l/REES46.svg?style=flat)](https://cocoapods.org/pods/REES46) + +![REES46](https://rees46.com/static-images/cocoapods/r46_ios_sdk_cocoapods_cover.png) + +## Description + +REES46 SDK for iOS platform - the wide toolset for eCommerce apps. +This SDK can be used to integrate in your own app for iOS in few steps. + +## Documentation + +For detailed information on methods, please refer to the documentation available at the following link: + +[Official API references](https://reference.api.rees46.com/#introduction) + +## Author + + +REES46, desk@rees46.com + +## License + + +REES46 SDK is available under the MIT license. See the LICENSE file for more info. \ No newline at end of file diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 106f62f..5347758 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -7,8 +7,11 @@ objects = { /* Begin PBXBuildFile section */ + 420E58646C3A6C7C68530938 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B15E127C04BF8642FE9C7510 /* Pods_demo_store_iosTests.framework */; }; + 620747C47DD4EB96CF38E168 /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D1BF39BB6C38C689ED90034 /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; + 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* DemoStoreApp.swift */; }; 75B935592C3564360063E814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; @@ -22,9 +25,7 @@ 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */; }; 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */; }; 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD192C36F94800D6D346 /* BottomBarView.swift */; }; - D78A79C526F8BC172C2E09DA /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; - E595009B8CDAA1ED437EACF0 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */; }; - FF4CD03BDB28EF3ACB920BA6 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */; }; + CF05BC53924909B305EA0471 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B4FCC8D2B3E514EC15299039 /* Pods_demo_store_ios.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -45,12 +46,14 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 18B7CB949CB70787994FC425 /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; - 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 7441D18EA106D3DD3F55F71E /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; + 0783E04B33BA748CE9ECF21B /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; + 33B691ACDCE658D62841B1F3 /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; + 495C25158D98AB9BD1903BCB /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; + 4D1BF39BB6C38C689ED90034 /* Pods_demo_store_ios_demo_store_iosUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6645FE95A9F93EE54930DB0D /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; + 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935562C3564360063E814 /* DemoStoreApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.swift; sourceTree = ""; }; 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -67,11 +70,10 @@ 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenView.swift; sourceTree = ""; }; 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 75ECCD192C36F94800D6D346 /* BottomBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomBarView.swift; sourceTree = ""; }; - 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; - CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; - E53FD615F0125C2729676AE8 /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; - F859F4F7880823262AFE04A6 /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; + 77A50B8C2D4B8BDA7C04925F /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; + B15E127C04BF8642FE9C7510 /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B4FCC8D2B3E514EC15299039 /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C06EA716789734F1330B7FA7 /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -79,7 +81,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E595009B8CDAA1ED437EACF0 /* Pods_demo_store_ios.framework in Frameworks */, + CF05BC53924909B305EA0471 /* Pods_demo_store_ios.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -87,7 +89,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FF4CD03BDB28EF3ACB920BA6 /* Pods_demo_store_iosTests.framework in Frameworks */, + 420E58646C3A6C7C68530938 /* Pods_demo_store_iosTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,19 +97,19 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D78A79C526F8BC172C2E09DA /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */, + 620747C47DD4EB96CF38E168 /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 555D3BD6CEC2A2DE26F6F90B /* Frameworks */ = { + 1C5781634BA15F9928794507 /* Frameworks */ = { isa = PBXGroup; children = ( - 8C600BF4BA27B7E78C2412ED /* Pods_demo_store_ios.framework */, - 3DAD44E6C74C30A194159846 /* Pods_demo_store_ios_demo_store_iosUITests.framework */, - 15B91E8E795D4DD2A7328979 /* Pods_demo_store_iosTests.framework */, + B4FCC8D2B3E514EC15299039 /* Pods_demo_store_ios.framework */, + 4D1BF39BB6C38C689ED90034 /* Pods_demo_store_ios_demo_store_iosUITests.framework */, + B15E127C04BF8642FE9C7510 /* Pods_demo_store_iosTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -127,7 +129,6 @@ 7559449D2C357E4300C274C9 /* splash */ = { isa = PBXGroup; children = ( - 75B935582C3564360063E814 /* ContentView.swift */, 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */, 755944A02C35822700C274C9 /* LaunchScreen.swift */, ); @@ -158,7 +159,7 @@ 75B935702C3564370063E814 /* demo-store-iosUITests */, 75B935542C3564360063E814 /* Products */, 8FED5CC7CDC6607CEFB8FDC9 /* Pods */, - 555D3BD6CEC2A2DE26F6F90B /* Frameworks */, + 1C5781634BA15F9928794507 /* Frameworks */, ); sourceTree = ""; }; @@ -175,10 +176,13 @@ 75B935552C3564360063E814 /* demo-store-ios */ = { isa = PBXGroup; children = ( + 75ECCD1B2C37F09100D6D346 /* di */, 75ECCD182C36F92A00D6D346 /* navigation */, 755944A32C35883F00C274C9 /* utils */, 7559449C2C357E1800C274C9 /* features */, 75B935562C3564360063E814 /* DemoStoreApp.swift */, + 75A3F41D2C38065000AAC175 /* AppDelegate.swift */, + 75B935582C3564360063E814 /* ContentView.swift */, 75B9355A2C3564370063E814 /* Assets.xcassets */, 75B9355C2C3564370063E814 /* Preview Content */, ); @@ -250,15 +254,22 @@ path = navigation; sourceTree = ""; }; + 75ECCD1B2C37F09100D6D346 /* di */ = { + isa = PBXGroup; + children = ( + ); + path = di; + sourceTree = ""; + }; 8FED5CC7CDC6607CEFB8FDC9 /* Pods */ = { isa = PBXGroup; children = ( - 18B7CB949CB70787994FC425 /* Pods-demo-store-ios.debug.xcconfig */, - F859F4F7880823262AFE04A6 /* Pods-demo-store-ios.release.xcconfig */, - 7441D18EA106D3DD3F55F71E /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, - CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, - E53FD615F0125C2729676AE8 /* Pods-demo-store-iosTests.debug.xcconfig */, - 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */, + 0783E04B33BA748CE9ECF21B /* Pods-demo-store-ios.debug.xcconfig */, + C06EA716789734F1330B7FA7 /* Pods-demo-store-ios.release.xcconfig */, + 77A50B8C2D4B8BDA7C04925F /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, + 6645FE95A9F93EE54930DB0D /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, + 33B691ACDCE658D62841B1F3 /* Pods-demo-store-iosTests.debug.xcconfig */, + 495C25158D98AB9BD1903BCB /* Pods-demo-store-iosTests.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -270,10 +281,11 @@ isa = PBXNativeTarget; buildConfigurationList = 75B935772C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-ios" */; buildPhases = ( - 143A2DE2E2486406D53AE310 /* [CP] Check Pods Manifest.lock */, + 3C3859163108340681DAA795 /* [CP] Check Pods Manifest.lock */, 75B9354F2C3564360063E814 /* Sources */, 75B935502C3564360063E814 /* Frameworks */, 75B935512C3564360063E814 /* Resources */, + F5EA7F3A1036C106B41581E6 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -288,7 +300,7 @@ isa = PBXNativeTarget; buildConfigurationList = 75B9357A2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosTests" */; buildPhases = ( - D54062FE68FA5656A533574F /* [CP] Check Pods Manifest.lock */, + CF985038FD9D7F198A5E0418 /* [CP] Check Pods Manifest.lock */, 75B9355F2C3564370063E814 /* Sources */, 75B935602C3564370063E814 /* Frameworks */, 75B935612C3564370063E814 /* Resources */, @@ -307,10 +319,11 @@ isa = PBXNativeTarget; buildConfigurationList = 75B9357D2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosUITests" */; buildPhases = ( - F2F4E1FC1AC641B44DE1FCB8 /* [CP] Check Pods Manifest.lock */, + 909D26DBA95AB0F7248766E6 /* [CP] Check Pods Manifest.lock */, 75B935692C3564370063E814 /* Sources */, 75B9356A2C3564370063E814 /* Frameworks */, 75B9356B2C3564370063E814 /* Resources */, + CE9FCC5845331BBEC5E5FE4D /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -393,7 +406,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 143A2DE2E2486406D53AE310 /* [CP] Check Pods Manifest.lock */ = { + 3C3859163108340681DAA795 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -415,7 +428,7 @@ 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; }; - D54062FE68FA5656A533574F /* [CP] Check Pods Manifest.lock */ = { + 909D26DBA95AB0F7248766E6 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -430,14 +443,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-demo-store-iosTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-demo-store-ios-demo-store-iosUITests-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; }; - F2F4E1FC1AC641B44DE1FCB8 /* [CP] Check Pods Manifest.lock */ = { + CE9FCC5845331BBEC5E5FE4D /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + CF985038FD9D7F198A5E0418 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -452,13 +482,30 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-demo-store-ios-demo-store-iosUITests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-demo-store-iosTests-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; }; + F5EA7F3A1036C106B41581E6 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -474,6 +521,7 @@ 75B935592C3564360063E814 /* ContentView.swift in Sources */, 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, + 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -548,7 +596,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu17; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -611,7 +659,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu17; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -632,7 +680,7 @@ }; 75B935782C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 18B7CB949CB70787994FC425 /* Pods-demo-store-ios.debug.xcconfig */; + baseConfigurationReference = 0783E04B33BA748CE9ECF21B /* Pods-demo-store-ios.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -661,7 +709,7 @@ }; 75B935792C3564370063E814 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F859F4F7880823262AFE04A6 /* Pods-demo-store-ios.release.xcconfig */; + baseConfigurationReference = C06EA716789734F1330B7FA7 /* Pods-demo-store-ios.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -690,7 +738,7 @@ }; 75B9357B2C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E53FD615F0125C2729676AE8 /* Pods-demo-store-iosTests.debug.xcconfig */; + baseConfigurationReference = 33B691ACDCE658D62841B1F3 /* Pods-demo-store-iosTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; @@ -710,7 +758,7 @@ }; 75B9357C2C3564370063E814 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 97099283EE540065ADEA8106 /* Pods-demo-store-iosTests.release.xcconfig */; + baseConfigurationReference = 495C25158D98AB9BD1903BCB /* Pods-demo-store-iosTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; @@ -730,7 +778,7 @@ }; 75B9357E2C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7441D18EA106D3DD3F55F71E /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; + baseConfigurationReference = 77A50B8C2D4B8BDA7C04925F /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -748,7 +796,7 @@ }; 75B9357F2C3564370063E814 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CD9E73BFACD7F4C2DCD8D43C /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */; + baseConfigurationReference = 6645FE95A9F93EE54930DB0D /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist index bf1df1a..8abce06 100644 --- a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ demo-store-ios.xcscheme_^#shared#^_ orderHint - 3 + 4 diff --git a/demo-store-ios/AppDelegate.swift b/demo-store-ios/AppDelegate.swift new file mode 100644 index 0000000..eea547a --- /dev/null +++ b/demo-store-ios/AppDelegate.swift @@ -0,0 +1,43 @@ +import UIKit +import REES46 + +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + private let SHOP_ID = "357382bf66ac0ce2f1722677c59511" + private let API_DOMAIN = "https://api.rees46.ru/" + private let USER_EMAIL: String? = nil + private let USER_PHONE: String? = nil + private let USER_LOYALTY_ID: String? = nil + private let SDK_STREAM = "ios" + + private let NOTIFICATION_TYPE = "DEMO NOTIFICATION TYPE" + private let NOTIFICATION_ID = "DEMO NOTIFICATION ID" + + var sdk: PersonalizationSDK? + + func initializeSDK() { + sdk = createPersonalizationSDK( + shopId: SHOP_ID, + userEmail: USER_EMAIL, + userPhone: USER_PHONE, + userLoyaltyId: USER_LOYALTY_ID, + apiDomain: API_DOMAIN, + stream: SDK_STREAM, + enableLogs: true, + autoSendPushToken: true + ) { error in + if let error = error { + print("SDK Initialization failed: \(error.description)") + } else { + print("SDK Initialization succeeded") + } + } + } + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + initializeSDK() + return true + } +} diff --git a/demo-store-ios/features/splash/ContentView.swift b/demo-store-ios/ContentView.swift similarity index 100% rename from demo-store-ios/features/splash/ContentView.swift rename to demo-store-ios/ContentView.swift diff --git a/demo-store-ios/DemoStoreApp.swift b/demo-store-ios/DemoStoreApp.swift index 5b89f2d..142e2fb 100644 --- a/demo-store-ios/DemoStoreApp.swift +++ b/demo-store-ios/DemoStoreApp.swift @@ -2,6 +2,9 @@ import SwiftUI @main struct DemoStoreApp: App { + + @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate + @State private var showSplash = true var body: some Scene { From 8a6da4d99dc1e5c42d3fe78631d00f77b1eee9c9 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 5 Jul 2024 14:06:22 +0200 Subject: [PATCH 13/85] feat: Add icon app --- Podfile | 1 + Podfile.lock | 2 +- Pods/Manifest.lock | 2 +- demo-store-ios.xcodeproj/project.pbxproj | 116 +++++++++--------- .../AppIcon.appiconset/AppIcon.png | Bin 0 -> 47055 bytes .../AppIcon.appiconset/Contents.json | 1 + 6 files changed, 63 insertions(+), 59 deletions(-) create mode 100644 demo-store-ios/Assets.xcassets/AppIcon.appiconset/AppIcon.png diff --git a/Podfile b/Podfile index 0b0e391..873e67f 100644 --- a/Podfile +++ b/Podfile @@ -4,6 +4,7 @@ target 'demo-store-ios' do use_frameworks! pod 'REES46', :git => 'https://github.com/rees46/ios-sdk.git', :branch => 'master', :tag => '3.6.19' + pod 'Swinject', '~> 2.8' target 'demo-store-iosTests' do inherit! :search_paths diff --git a/Podfile.lock b/Podfile.lock index d15d479..d3ba685 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -19,6 +19,6 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb -PODFILE CHECKSUM: 4ac57bdcddb3e4b10f017054225582e9a1d32920 +PODFILE CHECKSUM: cc0e8f2ccf8aa25af5cf4ba63af552191bd817d2 COCOAPODS: 1.15.2 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index d15d479..d3ba685 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -19,6 +19,6 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb -PODFILE CHECKSUM: 4ac57bdcddb3e4b10f017054225582e9a1d32920 +PODFILE CHECKSUM: cc0e8f2ccf8aa25af5cf4ba63af552191bd817d2 COCOAPODS: 1.15.2 diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 5347758..2a0121b 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - 420E58646C3A6C7C68530938 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B15E127C04BF8642FE9C7510 /* Pods_demo_store_iosTests.framework */; }; - 620747C47DD4EB96CF38E168 /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D1BF39BB6C38C689ED90034 /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; + 452CB1BD95293EB9465F6C4C /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF343FE4C1EB44258E4142CD /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; + 748A7C58839E67C62D21DB52 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; @@ -25,7 +25,7 @@ 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */; }; 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */; }; 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD192C36F94800D6D346 /* BottomBarView.swift */; }; - CF05BC53924909B305EA0471 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B4FCC8D2B3E514EC15299039 /* Pods_demo_store_ios.framework */; }; + 79D46076E61CE01A7716D506 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -46,11 +46,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 0783E04B33BA748CE9ECF21B /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; - 33B691ACDCE658D62841B1F3 /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; - 495C25158D98AB9BD1903BCB /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; - 4D1BF39BB6C38C689ED90034 /* Pods_demo_store_ios_demo_store_iosUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 6645FE95A9F93EE54930DB0D /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; + 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1274DEF2C4D166945251575B /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; + 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -70,10 +68,12 @@ 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenView.swift; sourceTree = ""; }; 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 75ECCD192C36F94800D6D346 /* BottomBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomBarView.swift; sourceTree = ""; }; - 77A50B8C2D4B8BDA7C04925F /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; - B15E127C04BF8642FE9C7510 /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B4FCC8D2B3E514EC15299039 /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C06EA716789734F1330B7FA7 /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; + 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A34899C8C386A23282313E5B /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; + AC654F53174F1754F6E72BDB /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; + C20BDB80283375AFE665FF96 /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; + C9E9C6394B2311130D8A51BB /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; + CF343FE4C1EB44258E4142CD /* Pods_demo_store_ios_demo_store_iosUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -81,7 +81,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CF05BC53924909B305EA0471 /* Pods_demo_store_ios.framework in Frameworks */, + 79D46076E61CE01A7716D506 /* Pods_demo_store_ios.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -89,7 +89,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 420E58646C3A6C7C68530938 /* Pods_demo_store_iosTests.framework in Frameworks */, + 748A7C58839E67C62D21DB52 /* Pods_demo_store_iosTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -97,23 +97,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 620747C47DD4EB96CF38E168 /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */, + 452CB1BD95293EB9465F6C4C /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 1C5781634BA15F9928794507 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B4FCC8D2B3E514EC15299039 /* Pods_demo_store_ios.framework */, - 4D1BF39BB6C38C689ED90034 /* Pods_demo_store_ios_demo_store_iosUITests.framework */, - B15E127C04BF8642FE9C7510 /* Pods_demo_store_iosTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 7559449C2C357E1800C274C9 /* features */ = { isa = PBXGroup; children = ( @@ -159,7 +149,7 @@ 75B935702C3564370063E814 /* demo-store-iosUITests */, 75B935542C3564360063E814 /* Products */, 8FED5CC7CDC6607CEFB8FDC9 /* Pods */, - 1C5781634BA15F9928794507 /* Frameworks */, + ECE8154AB54931A903490932 /* Frameworks */, ); sourceTree = ""; }; @@ -264,16 +254,26 @@ 8FED5CC7CDC6607CEFB8FDC9 /* Pods */ = { isa = PBXGroup; children = ( - 0783E04B33BA748CE9ECF21B /* Pods-demo-store-ios.debug.xcconfig */, - C06EA716789734F1330B7FA7 /* Pods-demo-store-ios.release.xcconfig */, - 77A50B8C2D4B8BDA7C04925F /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, - 6645FE95A9F93EE54930DB0D /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, - 33B691ACDCE658D62841B1F3 /* Pods-demo-store-iosTests.debug.xcconfig */, - 495C25158D98AB9BD1903BCB /* Pods-demo-store-iosTests.release.xcconfig */, + C20BDB80283375AFE665FF96 /* Pods-demo-store-ios.debug.xcconfig */, + AC654F53174F1754F6E72BDB /* Pods-demo-store-ios.release.xcconfig */, + A34899C8C386A23282313E5B /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, + 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, + 1274DEF2C4D166945251575B /* Pods-demo-store-iosTests.debug.xcconfig */, + C9E9C6394B2311130D8A51BB /* Pods-demo-store-iosTests.release.xcconfig */, ); path = Pods; sourceTree = ""; }; + ECE8154AB54931A903490932 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */, + CF343FE4C1EB44258E4142CD /* Pods_demo_store_ios_demo_store_iosUITests.framework */, + 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -281,11 +281,11 @@ isa = PBXNativeTarget; buildConfigurationList = 75B935772C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-ios" */; buildPhases = ( - 3C3859163108340681DAA795 /* [CP] Check Pods Manifest.lock */, + 84C46F9393C00966419B7A98 /* [CP] Check Pods Manifest.lock */, 75B9354F2C3564360063E814 /* Sources */, 75B935502C3564360063E814 /* Frameworks */, 75B935512C3564360063E814 /* Resources */, - F5EA7F3A1036C106B41581E6 /* [CP] Embed Pods Frameworks */, + 2ADA2F5588F90BD1D09FAC65 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -300,7 +300,7 @@ isa = PBXNativeTarget; buildConfigurationList = 75B9357A2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosTests" */; buildPhases = ( - CF985038FD9D7F198A5E0418 /* [CP] Check Pods Manifest.lock */, + 251E42C90244B36005A0714D /* [CP] Check Pods Manifest.lock */, 75B9355F2C3564370063E814 /* Sources */, 75B935602C3564370063E814 /* Frameworks */, 75B935612C3564370063E814 /* Resources */, @@ -319,11 +319,11 @@ isa = PBXNativeTarget; buildConfigurationList = 75B9357D2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosUITests" */; buildPhases = ( - 909D26DBA95AB0F7248766E6 /* [CP] Check Pods Manifest.lock */, + 015848CBDF21FD718DE7DB55 /* [CP] Check Pods Manifest.lock */, 75B935692C3564370063E814 /* Sources */, 75B9356A2C3564370063E814 /* Frameworks */, 75B9356B2C3564370063E814 /* Resources */, - CE9FCC5845331BBEC5E5FE4D /* [CP] Embed Pods Frameworks */, + C5E77A6A7EE6A0583845799D /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -406,7 +406,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3C3859163108340681DAA795 /* [CP] Check Pods Manifest.lock */ = { + 015848CBDF21FD718DE7DB55 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -421,14 +421,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-demo-store-ios-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-demo-store-ios-demo-store-iosUITests-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; }; - 909D26DBA95AB0F7248766E6 /* [CP] Check Pods Manifest.lock */ = { + 251E42C90244B36005A0714D /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -443,31 +443,31 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-demo-store-ios-demo-store-iosUITests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-demo-store-iosTests-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; }; - CE9FCC5845331BBEC5E5FE4D /* [CP] Embed Pods Frameworks */ = { + 2ADA2F5588F90BD1D09FAC65 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - CF985038FD9D7F198A5E0418 /* [CP] Check Pods Manifest.lock */ = { + 84C46F9393C00966419B7A98 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -482,28 +482,28 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-demo-store-iosTests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-demo-store-ios-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; }; - F5EA7F3A1036C106B41581E6 /* [CP] Embed Pods Frameworks */ = { + C5E77A6A7EE6A0583845799D /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -680,7 +680,7 @@ }; 75B935782C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0783E04B33BA748CE9ECF21B /* Pods-demo-store-ios.debug.xcconfig */; + baseConfigurationReference = C20BDB80283375AFE665FF96 /* Pods-demo-store-ios.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -689,6 +689,7 @@ DEVELOPMENT_ASSET_PATHS = "\"demo-store-ios/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "Demo store"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -709,7 +710,7 @@ }; 75B935792C3564370063E814 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C06EA716789734F1330B7FA7 /* Pods-demo-store-ios.release.xcconfig */; + baseConfigurationReference = AC654F53174F1754F6E72BDB /* Pods-demo-store-ios.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -718,6 +719,7 @@ DEVELOPMENT_ASSET_PATHS = "\"demo-store-ios/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "Demo store"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -738,7 +740,7 @@ }; 75B9357B2C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 33B691ACDCE658D62841B1F3 /* Pods-demo-store-iosTests.debug.xcconfig */; + baseConfigurationReference = 1274DEF2C4D166945251575B /* Pods-demo-store-iosTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; @@ -758,7 +760,7 @@ }; 75B9357C2C3564370063E814 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 495C25158D98AB9BD1903BCB /* Pods-demo-store-iosTests.release.xcconfig */; + baseConfigurationReference = C9E9C6394B2311130D8A51BB /* Pods-demo-store-iosTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; @@ -778,7 +780,7 @@ }; 75B9357E2C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 77A50B8C2D4B8BDA7C04925F /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; + baseConfigurationReference = A34899C8C386A23282313E5B /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; @@ -796,7 +798,7 @@ }; 75B9357F2C3564370063E814 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6645FE95A9F93EE54930DB0D /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */; + baseConfigurationReference = 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; diff --git a/demo-store-ios/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/demo-store-ios/Assets.xcassets/AppIcon.appiconset/AppIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..ebbd850e5a2781d079a307a400cd3a5188be90c5 GIT binary patch literal 47055 zcmeEsWm8;TukqD6h06>+I{-g>3FpxiC00hW8pyTdp2>AtNA}93;c#DYt z(*^m2=qRo20sy#F|6U*&)ejetf5N-UC`iB`!o#A#66Eu@#sC1CytlfRtE#aFxudg# zxs|OMxvQ6>8M&3IDFA4NRitTu|3Hr>@un@o+ykO8;*BxyctgETKu>t5opy7Q=JrK} zG>#nsRa2Antjo0d?IM8^&STLcUffUU>gNu^>&bKpy&M{ybP7hCx~c*rv6MmB5SMgw z{|*AzD*p|k%b$pQ*8=fDr-06lx6`_%xwW#K9D+VynOkPzvklZc0|~V_!m1V5I~&K3 z^A%w4$-Q=265{(|3d6fcc?4Dq4iABsyPJz`<%5#JV^O*Z=&|z`xAsTj!MhzliXOJq zUwoA$BdjdJ6QW?Ru6@d>1e^yjb^Hq+fM>T_ruNiVdM9LgykqbAbx~T#@IzvJ-dkErB+A_BynGPxvQxT}1(Q7vt<# z=C%8YgDEi!KUeI5fH<;&=Qo9=iK%_DEy2Qt&?f|bS|2&Tiz5SCQu=%es+#>_0c~IL#y)j`A4T1D!Xcj1cQA0#l)|$-fx}718y2I7gs08?`0_;76Jl_lhcisKX`xU5hnKUMCg&bWPkRU`hqg1BuHo4wGSoyF%( zjo3z;msU(Tsr?rL?6P&9QSki7n4-_7ja6dby=Ql6NQ_sAzmpMnovWUeI*@laTNuTE zV+q$k@ix=b!Q{d6h%zB^Bc5F$2YPzJo_gtShl-l1WoY)G<>}>_y2mTF>HCnIAMQQz z`K!=Y{6GNVj$KR}To-z6z8`5~@l(76PLpb98Fq+LgpWF|U5s}9c(apV(@eHskcQ<= zo60)3V-*SJveJx8ShhkYzF@KT%)CzTovFWYt-ObED#=zK#mwpNW2rlg=~*f(KG?)z zvDEw2MKP2m*0BPZUAGTObWVmtjged$o%CzL^B?ZZ#9!wylzyxt3mRY9^^6owYg42o zbK1~$**zAXNHFQJzL1aYY;`>(bjo4-f4wH7eyN1=5PqgYVc1xCA&3sppH1LJS|W#f zPTRLiei9u$*j(g}W$k<1FMCsCqdcjS9vA-fNQ874f)U_(-*os!w{5tIvonR^V>~3d zj`v&gom>ju)c0RRfmPqWA{8^FsP8e+NEdYT!i3L~NRm@X*;u^yjLJg)+hlrWNH_2| zjMd=t)Jk!`S8X!SQ>RczTMnG;@j>_5&Vajam2fOFRf^3}ehy~rG`&2dDEYO^zykMZ zyClbL^06;xwx?>#&b52=t0k949hh@wx`E~Qa0*qwdOVhzB6Je+&cuhndV)ecb(KHQ zg}NeBTDi3%Wo}X`|`{NB}wj3I~gI6WWK04*D8TT?akVFJ=GAeM4%hnh$1gM7axSL_ zUVN4X)~TUh65REs>h*0cdIyX~tT?0&lp&qy>hhuedm`oy^1ksy%lz^+)Tq0f)G%%x zBx^)6_Md?Pzw5*)mJ`=U>9(biJ5rzEhOpumq&f|6F zNZy!%0*}(m-_H>XwH>#C1@}kxLLsQy?ZvYfEh3c5SNACs{7+DE7zf#^L#flgRx1x| zEyml3yu>BecgczKap&V!1(QvazT%vW7Mqq{dVSp2k*l3UXKj)P{PgZ0j_SO`$@RM9 z`#C*?Cnxax(6I$T6*AZpwip_MDYuCODVj>P?*2a$KMybyTUY$$-d}X`YR=!dKJR=n zV9ZpGIztpdz^Y;GMyW=V3kn!;vTSs)bSdvH$1uvCt*5~5Y$WN;{E&s)T>)r>X;JmR zgR;e_UKRbKiinOk94=~JcZd|(BV+aDjKeYmWxTiG&WKs6eg^l$!c0MUW+dDG!EZ6x z2xg~MJC&yYJY!Wq_rln9ht74AE z5%aj8#-YrZ7{W&HBNRr3P{!iy^!I*}>sO*gz@k%mzbC8r<-<1^@O`sa=VeSsFeSSr z?{T4fFnZ|#a`HEOXlDIk@glL?$;8lD+ED)Ox{P;&w1ck&98#YfP&lN`lAZ#c)8#l8 z+ddu|A44T$*HiL(JjY>6^?sZV<4J)Mz+{;0JskG=Y{a%mC1*+lLs5s$Yj{=dXb3Xp z?)k;$jio1xPgQ3U&HF_Z3ios4CbDKNwlf_1UHvC?Ba0jn_gvC)ay%&b$ZmNaQKYnL zxY?kFP=eoOV^ka|C!CQ1q1k!oGZn_a65 zB7d#`vJ2ZY31@WjPm}m`LPClj6liZeAwv)MvdEggffg4etH8XRFG&k(Bi%|)VVn5-APWC=i4>gfI7F(lr2nf);HWx+d;7o zUwh%EjZJsGERnx(Bq{+1Nm~f`KOF55ph99SgYWyq_q<1iS+I-%%22CFziOOYd1h3D5=5flUBn3r0b~gtp_&d-~R3u;~*TKierBw)or^i_%+3 zL)j@L{Bl*$sZN4hm6%ovmkz~@?v2VLX(b9Q>tUwI!k6*Yw(=RCvJ>g$^0MqX(ry=d zRpgVICRG`-K=-l&XJlMW5EePS;%5ZD?GJ_eGr#&N;-CRDe5~bi+B{r>23MHA5^|4* zvmmUbWpn3-keiNES;F!VR?`DMC)QeJs>``K+%q;_%PJpk1nO(|@1Lm>wQ*dFKf5I{ z%WlpLCyA-Q+mEfERW)V*g+yq{gKE%7sM;X*o=%()82yTrN>Gt}N=R4e)>~dBD@$hA z4O84LF}xSOS|k0m-!1*6D(+_u;`|&RN5PX!Cnn}ALZxX8+P$;bc0J~Z(5*V*GfI!k zDL`bP$v2I$9C}xfNl`ZcZkVp4DO<~mw=*s0LCBhWaE4|!1q;|QBAokJA2%GNE=Cm( zn?H%-0&LGvA0@m4zVi&AI=TZ*lrjfjJVTT<&_ANFiq-z6N>p`2xq|okj37&JXaeBo zdyH6o$3AcjiQ(*K$BaNz25qMg?E~uU;KRvA9v&19jx(7Cj-V%*R?%3u;0~d1 z{mlY($rRKqy<=nQwn>moIT6JU1`p}o@)J7NI09_%IdakAhkEa5;9%8Ppg2WS<2r-p zVK4P(46xO3Ocok``}%a}W8L)2u88A3uPdi*xnH|M%jimz?~+Uso@CjSjaQg+{4h6` z?>Wxp3l&)>AGK$B$OaE)!pJ&VR-ehlFdX@efg}}uWD?@R#o}+bd|MAHJ^o|7h8(uJ z$0une*$(fe&lWJ^?kSK+cGXFK%?Wh#U1Y=A44uzs$Ex*o7W=Q#4W$s*b4P3GNaID9n1x`W-wPZ&4*B8YX zhd}u5Jc2*bB^7*f7eg(u((>QSolFTDNfFMY^Y)R_*K<=eQGs82XSqlEQ(gHVo#*Jd znEKa8!ZPe>e)+ToW3{3AeiYQ)rxMIp5k4RE;~e+#+da!5>DlUhIe?pHUe=qNdby^C zH1&ai%qLNG&*hUBGgBh%1@eOF@<=PGQGaeBD@VQXc^m=Le4;t%s2z#6wV+C8G%88^u6t4z1@XNBaEJ!c9{+uN3( z;9$pnt zZ&sV8F3?J(U}*H(Z;vzPz|@pr4rT z_xG^eh^%{#T+5Sna&2Z~fdsRp553q51OQ1{;}r@y^g0Zw_2vPvuDI23j+~*b{QPaL zVob#|%ack5fA;EXP8%lZi5AhClOSIoy-PP%%{Is6AVZfacX^5h;s>;o00%m~&Bt0i89)@%7Hu#S4%ugG(+V(E1-u95r9V05$1{7UbuC| z%1p5;O-j2@v={+SA+1^Q!nqr8P!W6AJc7TgJR zvoC@fQWn-s)1xi1&!2=YKE3(MnnDi^H!1iT%UewenlRAj)mBz#+}3e^NKl=pOD_v9 zeILJgS%PQn>`7IWB2osBigte7_OjC#N&1xb()j73{;okcMis;l#l(jKq{dK93JZDJ zn6TLLw&kR-;HC~yTrfbxxx?z&Lb%8KDDZGN1fMU;@6(tgj^BfI)s{ z;1>!!T)4o|Amws=;+C6>r{9WrK8nZ!^7Hfac$ftG+^ASKAUrI%K)GJbR{yuNUCXA7 z!f~4*JPMAn=-|H7T~U>EKhR_i#IVHWKc~80cQgV-c*J_U)Ff73NJQ6@q8Cw`zd`ng ziYdNZ9y{XSvE#aJ9~D;49J9w^K!bO%1x9xGy`Al!xnHvpj1K{BgIHq(T_Maj;>=bT5 zVwA;oW)fRlLmtTG%|5UcdzYS968?nQTzMhlAibOKg-8#=Lx2lJjzRXgy}iD^eu%%k zrg7#<9o};*P{P3W=2ZBJGdGD!7nz_7u zh8a1suSQ{LCEVZp`1sU(F;MLq-=^T8Z}la0_|;anHk5|yfiVNRv%K0tHjo9z(K=}% zx>GJ6!@+N6^{?2$@5=o?w!fXBd-+8mVLYjmu`Fh7&+$=XrPsJ?;nb1^N?8D%No?tv z=(j5_4V*p-4~i$N%2`|j5v8ATgky{$OHF%iYbPnAb#3{tr|>g`zFLNfmCUWF3`)Ti z(@ZTotPTC=3o8Qdcdhu4i~v%}oSWfweDQY3yV77TK6rjGUM4z4A{X&oKeKZHJC?@Oh3FDN>>0Md_L7M1-@bNW=em@GD9L;C zaPTJZR-Mdmy`!giV&8AcEk!$R>A-q?NNDN7T5G$B_MQ>d#tIMd;OvBqko4q+#B|?~ ztF!6m=*IWt(8Uc^oblj8(JCGqEOD$G9A-F(ej<9ju|a=TsX5sgbrZ_C1A61-?j?cC zXUBMj*0w$1ab|R`etHplDJh?xNJgT%I(CCDW^84D=bDWg-N6_V^+?OOXI)%g=NeU- zme*43d)MO!cU2qX_PY&m$oVD7m}%ehY@&KN2;FJd&uX25Eq^NLkxrIE+y*-(8$RIS zb^Pl&ew|B9|JBT!K*owZnZp+Y#^U^%U|$3wJlxkU>b5F1$gS2+fU>bJh%OKjsONUY;%m;bi!nZbP0_{;1M;bJfg zP|qjklCpXKLgwFogm(z%^QQ1^$L5?=*z1MYtCp|1tfb zbZUrVc<})plAZH5r}OcCX*?zF%nRLU#x6fr_BPUFMV%Kew?btGJg`~vHc`6;f&^G2 zdhNiY+WJ9{nS_rRE>PouwDYB@OUccLaO13Rb_P7*|Ki4_A&{)-nRjsaUOTd`I#%No zK+DRrcu*j#eS%`kx`?$H#q`HjS(9gM99%YTGxhJUN18N28=_B4f7SLiDmS3 z$qihc(ioOKD@#O14eyz->?t79;cPK{;6xqNShg(wvk>s zG+1I0S@=2C|MQb0YzSI7KA$^WBN_@&5#^35FX+oLM^?@Kdat<+R`U1ZZA;^g?(kNp zB3e@@mCqjofZi*O_z6Z6s$4fCz)~XA#CCnXBm&+3hW7zZ^CdkzWkc8dVFnzwHocUo z$J^1AIAx`gOQ=9+p~}^@L2u1QK~0@+g9u^rd%o%J{F<(*pntlx>s(iww)c(m{@Anq zSvmD)hE9tfQ^7WYiJc=mn;3%KyOV6A$={`@OmbotP|zaB6fq4u`yFItaiO-c4mTCM z3uJG{m&bE|wC8IhRif-FXgtw3?$O?Nw|T>_WT|UUIq~E^Kpcj6aEX^oP|&GjrH5Mp zT!pRscD?`5mfSphSlb0BES*@}@}1fO{Bdpb3J?S54OzeQ%x3)z3BRR(Yo!*l-d@kV z<0EX^lNrv(I_{5t`VoVhxP#tdh1J(uw4 zlH#}F7Oy2?{g0~|nhv;$2Z?bD-`IW9YT?4+T=SdWnYww~qKvX(v)15F%Kuwf)2I}1 zx7Kk?ayytY|833l1)S(XUsHGVRP|e3_Q*32CU5aV&T4-9?C^M(3NZpE1F;yY2}R5$ zZu8=$gw&xAD?njwvNi)eVbO>*(jufh+IDmrtEI?Yjy+=(0lVXLgTuX6U!A&ul1VVj zpapG7kmO)_we^zW2a@YcyN`W7Tm1u0i?^}5$&~wEBCRS!5c`E=aC%V&ORPpCdhWD_ zy)<+z(7XqjBt#f%4L|dLOVvGX9DJI+{&Ty!V`%v2EM=mL{GFQYX{Ft+{P^;H6jkDl z8(daQIpGhEY8i+&VYaQwvfBj(g*I({D=HF}p0BO<*S6g?Yz9MSIc8Ov44FpLrw+f8 zV?;GX;linR5h-HMQW-_G!O56yD?z-vDY!~HYgI_W3ZKw^pTsRu=>Gi{}Np2Sp%D$DM?pD zkbokVVcwUIpES2JZ(gjR(5DVMK!Fxfd#8Io+X3GswIUcR%zblxRcC1Es}-4bKKT|T z56FxUGeid0$x0)2#sOoh2M?SV>@w4$lRg0;s=OM4vEOlZ%OixyPBJ7I)v{0 zk6qdQvyw_mAA&!gGTxwv5-H$_%#@Qm>Mdw|VfJE*PQw7^f%J%r9vct;d*k-8DbEzU z{Pw#mL*Xth=|%%p)I7X=8#%;`rm0hCAkeWgJBTYn`@3$5hD!@XHE6OZD0(^BnfO<_ zgiLR$<{o=Hb*ad@Vc_h0AM9{dY3k7!6$V1}5W`rO;2DReY7{vli;M~21r1unMN5qP z?R96@=mHt=WR*f8LwI@xCJj7=e`!odPn#j-t2#>G8gSfU=vp2C@l1;`XmuX}8j zI)7!E+ruGTKPk&x)Ai*CZ}%CLxQz-2VsFT#DlBtI_wn}eWDHpp(m{m+^HAfE^bQ_^ zA3PIo7hXEB^KD`tw)gdXydLXyFPhVw_~p!+C@rU+?euGY_u;88w6%G${16&bQ1m+$8(sDRX|~D`R2gWbYi@y zML+|W#aa%^WS5$_&+=&sU&)g1BM6YYO!i=BCrdFc)ChQn27a`vGvTrQ{$yZ5xFQ{c z5mmFuh#N5@YkGCT4(XZnROZig<6j?hCkD8MZVjWDgr4?}o+^4Jj>u^wd0RSKwaLYH zG7vx)LF2h0-@kNl?(-UG-~;0coQr;TkGK6=T9%$m<=Rn99RV-i?u^uip+j#AiSq@v ze7Y%|iOR7>yc98;jXLETZ6fva4i|cQkhSP*La&Eir25B>#1=~%w=2cM!iF*_Ov~U& zW%e3%l_p|JFCJs!(-0DkVVv|ADkjzw7y+`-J)XCQlB46G!M0b07Ik@F{}+3%=@SPh z6!VtM5gg}2|E{tvR|;G?VA&3e%KS6p6Vy1|JTMM_`Zv?}{$k!JcdMckMBaL_T}(r^ zfLS4MWf<`j*OX`lHmi=*bPAf;du3U_Ue)%tsks1ReP}V{&TL5HrFjyJ)d*D(*USf3 z`9Iz4*xv@H1OOcv+OZ?leVCR!p8-2`*9P54YSZy@#e^5qZCasenJ?C%o{tZuPODNdK6}YLIEt|^7QjJUM?*2 z#^yaoQvpX4Qx_-*6a^XdkXEV>o`x!s!3EY0wmcP| zt&twPILA_t!O=DHJlUJ?yOjF|k-ZtF>CmO7jo@oyXOey?zMV<13T?feZqGlSlSXMcDO6s5$MGg)MvnYxBf<2q<&Sf*Uz31K$k z6T=Cp)gPXBz8(g>;TIZ?6ml5~XvZ{ZjOQe>nDNT+BXKbvR_hWHqnZ)NeKW*H`0ynY z*EJnd(HGf<%n17n?+Z)*7_0L0d^|o*-rb{n0|2Aaz59KGxUaE|(17Lo7B+3g*FI1& zB6Rl>MSbDHe25fQr)262zARnKt^fW}S;Oj{4H(y>QO&IPT_T6KwpOv6k%BgR4fDmd z5x~RmYIHK*_uIgyPsU!Z4Xi}gm91-&9J*0F%J92T@1y>Q#&CK`VhgZmix|Cah@&=S z2|e}>vDdX_>%_9wC3ny;e@^ym&QQ+X6`sYClK9um=+nXIe&ga8xRCr!`*S1AmZFnj zZ(d`_I@^WawYL1MSn8KV_LZFV@%FSeI{MW5XJ~xc8Z8FwsFu8Oj(X)ElkH=YN6Pj` zzLt1M5OZyJJ_(bdg%O?}tA4j(?-KB@b9Op-A&oWociN@WPR(0dklS5qtJ3KaxynL( z5moMR*<%CsiSW-8g$38a##p=lB9q?L6?(XiJPli|xoSbrxX8%%m(kjf`nUA1ivN~u zbiB2$Y#jP`ncJQXOepQ&U8Po?cg;7=?aB+N!9*9yx*Zc7LFg8={km_D&p7ZRbnrvdruQN?oncz0fG2x8M>t9$os}0!&PI>};BmR-- zaDz*Mz3yWBa-wP>@hbW6+It;)AKs5dp+$#qtxyO%ZU;@^A8gON5J`mOhQ`im#9|qI znWgZ|v%AuC<@9r7a*F#VIZ6t!*|Z6o;TkcFKUJ!Ki_*-i+O>t4#jU_@d;RoPa{n#K z6#VwM!JKL`J(szWx0k2ugGt4~#{LZ>Dv|QRJm+yB0<@X*Zl3+|Vm|j^c+YUmo^ia> z|J9z}gO28vG>F2Y4py59$8G=62F5CmUcv=WSV^o7vV&Q@$L3l5PBx{XCi~k%Y7S|a z_L$z$=gRQ!vE}6{t5Re<6z#dYqf{pd0u+DX9Y^jj7RR?!iDz>O1<ktNJN~tz7PM>tY350foSRD;IjY06X=pwb8dF87gBsB(&Qv+#lr#sds9o= zM|LRK*@PlkMAGknl14P!uUy6O0Y#h@x1F=G?gZ+FUzc;-6NY|Tt8{t|Kf6MHgzJ2h z9kA8Ni)#!+P&l%FzkD*&x%h9Fp)q*wwzztzMR|tK=dQPh=CnaKyA75?TUTxs6FsR6 z3DKpaF}KWjzL*gD?-<=Td?wF@p3^@*-2Xi})^tc^PbJ^FE14dB(ECaI+w8XyT31}m zuk-#9ID_6DNIHrt&src;h(IG7<#Jv*4|qD=6GPFg|IA)*;_P9klsC|40}53EtMUdE zN+~NLKzGwQ$F60Q3UC~CsKizHW_mpsb4Idj+e{VOzE4+CNHH7!sShfuEPjtK6^{;i z8cD#L=aBFEfw`*V`v-vSn$mBnD7O8iNps7(Be{cnCHZA(_oObn`x+_1M_TKL0#N z(5ESr%Zbj$uc!cte)1JInl5lxFz2FxsG1vUK1L z!msHa^qn3dn@8E?x5uts%;aN&9PH`i{7n&lH|SIE>n5`Om)jWH{IVJKM{t6EGNg!m zLn*L#q}km5Hqg?7=Hbk~ynGY{sOkJ3g&j1i!Ee9*^wLoE>DamDsLE^UyPX+H3sR#1 z#UVd50+doK&R8YwPuE7n7*gIS)!v&8PTYDQO8_J5^Y7N%LNjQy(QTnJ(PR|PWQTrUh%j5RXyKhV(-BD+)Btfcl4GGq_ zkp{{TNl20$az|C~zCJ%k$FD5vuCWN-q%^{j+@RIC)i1?8x?2iEG=p|Ih`z9Tg9$3p zRU!*e+yr+ywU)QF;}$8B1QxN`EH*g{KwJ*Bma*1oRtFt zUzdithodbavOL}wE3}Ko%V-C5XbC%%4v^V?p~1a|hp+{=Jfjjo16UoLK5;O;@ly*b zR(yI+;k)~IfUXn&>VK#Nkq%4f~Ygd8RoCOb+Vq;2*(pKGlw8w+m8~p zkXo4DIJibrsQ?I~OlVoQqH!SmH!=)IUe^s%(!`kVvqfe+I85)^xJ64D^`C~0FP6|x zU^sr_uY5HciArQCT(tl2ndX7U%!4nkxe)&mg3r#7H@Cwx>u?vUGi3KL1tzMn>8^zF z#RAJ)?=H>li4E!!^Lg6V+#O%kCQd#%^T1z(#yrn!bhH5VeKwFbXa|xxh<6-ykN-eT znvC)<0z5Unw;CM^vjh=%Ho#C|Um(p8Psa`1&zpPe-LI&C*ye~CGBpeWv9U+h^qJz% z@f?D-CutwHyqEt7UC*zK%?}T;N$HhJYJc^eo3EcF9wHd%E0ZpiE?8G5m#s&}2M8gF zeHYE^9)Cdn^{b0IgV4u9gNl#9)+t&>Ee*+IMd7D%^(w4M6Mk1UE_GDs?%z|v4eJO= z3Gqeos?g;1_-B;hCG&tRutdK|x5_X{_M{Z^Zq!we0wWT1Hw13x;q9%x(SRaY>d4HBjy-2=O%HhfmT!WpY1FslQyJ5l zoB@RzsF)rBImt~Vd;Ih*=80$2V?$MVm6=VqiYD#7yjs@j9LF^c}JrF`B)S4u`eS6ctw1QXbdM8^`#$hu| zNQgg=#kG$BUFc1r>rQel6}5M1AOzQLSseH+Bu7w^&SRFQwSv)-6TYb~(mWss-1k*K zOEhP{5&7>{EFjKAwwfjzxrpdV%;WVJ`7z!Bv?wn9S|@-kYz3uFM86Q-)HEpg~9(#MhKkFEz}{`7%| z=u7b!fPCG!fK2*N7J%byWYyZ@Yo+0nz_Oi;c83r=dQ4kIS)Yp;p}F4OmmHuwqHWES zh6~o*?(d(6-!F$42wRLF&pPLS5MH));BtH7*GF-D?(&N#BdgD+2Js@V31RT>qhJloB`P}X zy?M@LnhQ#N#H;0zBU%nB5lA5rlq+#DFH9QLk9+p_!tn8@$im`SH<@5SJ^#rdFbM;J zhoA;@DpEGyA~2+Wb*(u4ZW{>O6v+X{zvX9%;@wJdf())xL{agacyCTAhOpXnbXT&EKnd2y1`-B<=GQ@sfHw^pp5hQ1GY25U(YKJiI$pW9VNy#&XJ|VaYnB z<3FADM!5?%54VQ284K=KJNoo}(d(GBWp(ej8VY^t!P87g^{z2@OLvCARGg0w7c@jd zP}T)WCBct|0Bha&AGwW@w0W?a4% zG&T7eK#4N6+4l?a9|+Z}T^jy!nlD4=M1Ti-rEe-27ZpI+4Nmpm7BA}sCNUBEG-4mY zeHd9|+)sbT19^DnRP@&lV76pWBj?}$BM`M!>W?^BjB+CvMroVo(zEz9v|M`5pT4Da z`tdY!mauwl4%7P7R*F_?<9fJ|2r(DNVIsFn@|=2X>n!^K9a=<=yuEO6o=0q9_v;S+ z`TTVMS;D$V1)8u%GhrHrF0#Q@iiox?CuxAZrSHWwEO7qPbvvrK~j9{gLX98mY;8RC`D=R7CSmT(ZXI*8cw9Ng16wbf1atK?nv z?HXwf*}X+ikPmcLmz<-izHgCLIy_T|@rj)&YlG+I0?bs(#ir+7PyjWDIgBNwWoPW3 z{VXBqNzZbi%+%?9`2>3C;WzCJd6UPXlqp;~@VqgC2p6t1Zia4vG=B}l1h#(OT&Rz&mDibykjYQEXr${0vMGC^>WgpgbJg=iPtDUqH-^nQbR z&VJ21Ar_$}|IIOKDd7(9x=5Tr>TY22eUuzpw35JPd=kb9skE(my5IMqL7&z^$qx8e z-lvDTl|tJ(r7Ky8*T3J@A3uVA6MX^17VKJ*+NyckNuU?JU*N;IzvZ82Gnzu@(m{-d zKv}3u!tzdNbHe;EyRpSbCE~aA=KiOQz1-h%s?Ikz$6x9uE~Ea@lV|U+#(5rxjzX;Q z7>c-cN5ZS2{Kk^qc}%$;V$aEWdvs$`zC`2o8G;d#)ZCd=F*}M#q+#}P*XmrphXY3V z9sSx50-yJbRP-K>mJ}gWNB)aV1r+^tZO`)$cJO~v@;er;YAj!&&a(R=hK5?vWT8#W z=Y`uJlb~~HM`oFAX@$=hrx?y!M>pT~`Cm&?yzk{Ly>HckRbw?=KeGK?uGSZvHuzFIuwf(XJ$m&wntqnTzT&73C!hg|gj z{#QcOpg_A_^L@2ENY?@TkHPXbn`^$M#GmbQckYK2mA5MXUY-Um$~OC!azlqVmC%x0 z_0P*IX@$gq4Ou&HO>Kc;`J_7?WO9R8B#G{?v}eZBa1CE}^osn!kxE`8Pcpn61m^({^D<6wPfMT^FF*X_NL8d z!}x0c1U%4;2J}SoFYv)6?#khDZ%x65L)br573Bh+(VOKNerA00m%4GEY#_^4Kg>>u zZS;3ZLsL?`@v@<2=c@lR^mb#e2@e##Ie094ilUf?{qz1%w?d+eV-a4MfqXFlZKeO%^?{C zGsf9~4HSsxPgCs$3rsUB%#5ov`~`x$92i~5IYAyL!-jSI5Qd3!KvvISTKXA(&i z2>}jRU0@7S)lm6XfPlrJ=EWk7`Jd0)clYv|6*RPFh_M#CCN?xv*u;K);;-oeY-5Kf zbragq2srp{9%JIrfj^UQ%0d5CB)O@`hWkBiakm+W?mtm<{J|xcYp2VfEf09Gw@X)B z-2kyRd!gpN$`>iODjeoT{6K@=F&xlndZH8Gv`-$M`6I`xP6aME^dfcz zdYl=aU{9}Q&WDqk>fbDDw9vl_q&8l8j0hGd?q={c;nX}u47$!$(HgC{EnE^3ShFeX z$fjez+uqZYgs+Byqo(#p#|&5RRtfyiBG)EG_ipcrDJoyvzb8lY4fFTU(YIPxAm#cE z-r$&4adIOWoxUtoH7#U9mE+B?x9iCM0AlWzca1jhWP?>kuvvls^lC)g(n|(@Dw#~m zR^?(h!uAjj+mie>h)g@eX@Ko-KL%_PcM1ybmZiZmG+k~DtTZEvFzBO`Hoi?sPl6ZW zC$S+42~}sZnO%^rD=foK-TMwDY5#&_ie;lw6vk9npJG1{&W_dY<-?<1_dM!DW)QFp z1Vk0XW7lWmcqrD_Rkslz{dCEH}8lnoONumTHN>)q7~!X z309R5tM0+9db9b%LY-V!=PEQgIht@Q`{5(I+En+jC(VD3Fjfi=~4fj`8~v-n9G9LlDr!J2J+ zfU=;+8LEFG-Q+A=3#JB;4*Dlht&jf3?Je)wazS(6UuAUWY92`{(WbK7@cB5ph=|v&vV4Kgqgu zG5Y^52861}f95#IYVul9`fe@arP%2H)uh6n^T19qN`|qX?FZ4zkZZL@HCxhfVvYq? zDWVZUhl?PszfX(-lfhSPseg$C*LZg)?FAHgz6VyJ)Byz9H>Skhcx|xhf2P{ni{^c< zg~6isweudg0T{^I* z-FVM!6H5>j>RJ5Z)vOE#sC3!ZX{(zrhh@Lq{yo$T1DI^|uSMRz#KKVFjF|%e4TB+8 znofQ(O7YiN`;Eg982f(3{$_TWv7b#I&ts$_K{@p*c8%0^?&F(|{msJ+BO=h;m~lt_ z__38E`JQwf$`W$tfw7m?;wl*w=;Us&qAXP0!?Nx2MyKR4r)4COCyB{!+P;}K0cSRXOQxqW>~ z+q{G7l49^`;Qot6DOSv#kNl4(f|8Nh+HBq5=HIf++He1+s+!U=Kt6a(XH9tSB^ z^M>_fX%=7~OyHC#y^~$_1?Sp?k1A1I7?cHqXr_rh*`&XhhYJ zw&3sZOSIiN-;$P5tCsG`v4ln)L%B#l?@RwC7+^kIHxYWS4yHkj%Mc2ZwqYSBk1?)k zB;k$c3P5L7r%QM^aJn&jUSu;?3tr=>+l!UQ8pWtVdA>2I=!ea8V`i zm?7!=I*_r)0la(ZOH}J2WM-0hPZj(wmlsmBqOiBM=++_dM|5-GzGtKT-N4P{Rxs}` z`ijVzqaM4DO(|w;dUtlyVk57i;eL=KWH4{`t zPrKY~ercew(6PR4@2O$}mK!&1-266soFLAowgsda{7MKg%-9#IYHh)+=Ry{UK~FO` z$MK^@0a?voxeRUd2R1q5@39|Bra8|;ZkiPlK39FCG%i*^uHD*(@ZYKy*~MWhchicr z)$5OtQ(mn8zI^4dbguuPH(#cY1*tV#yO0ebTWDmSq zUCv0GPyviOI+}_kGaF1oF?F-oMm9}0|J@Cd&5Ng6R$TB_7JH&Bv$8Mf`NL3?=bqp3 z7l^u3tgFnSdT1a0?y|jp6R4H{lA|AR_bd(t&^jGDc!ZxcoN-bLKjkbO7p7>9x>7+Z zU8*G|?{411vd{3%z=`!jT3zQgb!d`E{C+eoTX2^t+o|2bJaGZ{qlnN zRm$oL%5l+Z!~CpHmA08osvNmp#(M>AYX;=aHafn9@$4N}pwjQ}nU+ti*~s+xlZ8^F z8=!IW<8?@SOh~M-`ttd$GCQCO_7QShc0R9^i20%S#;D>%SpFU|9{=t(x#NP}cden+ z{*y#M?5mK6|8X!eN#Y&#vUO5`py1ugiXdtrPk8Ye`n`?Nn_7-Rhn|Abg9F4ZDvGX! zG#jtRbp(S}0U0|PSe#uqL=m#GN@$kbbut(_e*<0EYLce2jpGW|)~fv`gO|piP?KUS zAzkP`)`D*h(}T>yRS(zND14UB{AR99$%^4^4AP3-BpuA5F!I0ue|8yj;ih z%amqlt6srNQ1%GR|L$4EccvCU%cn~Hs^oFWa_6mdDCDfG9&}7vv?%%0Epfkzn*VKe zX1ta1+hpeyzgh@q_M5f$&MA078(4nV>2%&$rSYIyx8jh~IktIk2pJGs3Q}XIyb=oeEsBYm(~QCA6F-MOWE_h=*VcC&rOJaGV~1~$Nl zXU$ELcoaYO1~v?sifW#@|Mhm*KJS=ILd&K)B;6JtK!#zlZadoSH9+du8 zj4HXp+c)Eaw)$#3^7#e6q8a=cFjfdyjtf5s+l*TP`pZ6-U3lAk$^sSJZ2yP5w|;2y zecy*ih#(~`ts+Vz-604l-7&hmVRR{>q;z*lOAZ(%A<`fn8zLn+$&uUle!V}>U-9hc zd-rzLd0p3W9>;MO?Esf^C$<^|?wZaD*RD;WQn>y+#k;qJTc54jwS;4Hsbj5I>!_q6 zB2S2wqitSJap|>B^M&}$ncpK7-L~Op8WJFjBf4G*gkE6> zR?Z_F*&55>2rtQ3drx^O33FD=IpsegL#Kzi4@Wh@+I_kYYwSsG-J0-jJ#XVDlh24k z!YcKzd5@%ScY_~=f9rvT(UUF!98;QwumJwTUmyo1sIw3N!dLw_!TUeCxjVfor3JtT zoLN0xA>(W28np5mOA_|#Js6XBi`bZXqX|t-uUT^98dNHGh#h$ zn{JhWu6E>{g)IR5RVssswrjZ~qNG(UK|r&iUs}mUu}IzLXGD;yNm2p4srHdGpJ&^?RDKI7&0s*e>S2GuK{Bb z#4z@oP1YM&4?-12%9T>6HFp{cayAKfB1I%*UUX9U>!-ClGlJLyqHo}!`80+<-FVTB z3=;74H<2gm((MK;-IbKa{+CWX^;oPBwY4520jTA(&by5ZD{@dIdeu+ybO?V3+kqdL ze@Y0nsL(tw_UEr(FtyWowpBtoOie5Jb?$pF*biDJ&vjkL#vqR>-luDb=)B(D4?0gO z*gtJ}B`t$lH2Dr1rRzLN+G_*T5^w!ni>n-SwE7in@uycQ%0UwBwxFPB4jj*0 zO*-YSXUQM55TP0l&0|JzBSjdVGUaq~NwzUX_`(WDVMio!e067+SB`+25oW2*IAoq8 zT)FX@MnJ_8WOW1!K-wjh2WEPdw%?++bEBSsjt=R9Uhk}#CRty*3j^&Kjt|-Axmfpw zMJCnoQ)Z4T?;RV~y{ZoC|8eSW;QMntJ^fF9akZQh)VpP5l2zkq&d?rX-ixergFDYG zSN3w3V|`*3y_RvujoLpYJzcmR)&MdREv-lBBoX<~9jL|%GyDG%0LfY_tBEAAA3lsN z@TLMi$5cy+y7|<7Bj&oSCWh4cvNyTdG>~{`Vb3eVwo$NHssXKr|%_h4_El$2;|UUx;xuEg{OX z9RF9vOZy79xhMWOxA@lD%p$r!d7Tw4O9DN4s0vDmkG=oss*f%BZhoIY?_c(IirpR# zDU*bspfuEz9y)Df*m--yZURlQi}FL(;V^28xW@8wK@x0XfJ(1#W0Ntkpq?a4tBKH! zkJp_X>Dv36bBv=JuH$PO>jajYVa?zBrmx=9cuD@irpo`%j4Za*a6(KN?N<(X1=H>M z-Ow=C;}sFn3lDM4%>w@IBh-{R&pX*hME!`8Ux*!hX9un8rLQ8;b1B)Tu1J=rmruBC zO-DXb3SHc7>1rf=2i-oM9$)Jux>l1{R*R3~2-6Z5ed9Pc`q_E4qSX85b|i7X64oVv zIv?^P2`439@0B9|DrA*x9Dq89SKvNvOHx&f4{{W^-t(?r&ZGraj8;^_Wy_DOW37UX zbk_8DLDxrY?ic!tSYN+HZ5lexM#kqMCLZNASCdRn?G3UO`rJx2ZrX#$OHZ zPT6~d()`XRQ6kPn23c>HgHQg<2Y$|S`FqoijIN{n8id?Ao9G$E2dMp zuJ7BNW%%{3yFNcCWBPBmv3vnt!@PA3(rny~3X8#2g~Oal8$KhKx%0J z9xV8bM7A0vDCBG>&@`;q?SP(&dhTv~t66Y9W5%3?vg+enNK_!<2hCVd0`2Ut$5S(k zS%A}M&fMT=i35&Bo_>U;XrV3USz4>g zLsR21MiHgQ)(1IV5;F!DcbUJ8k%eJ~BOvaZVWc|g;*+nhRZg}mr)W|+zAdzkz;tj( zK+`%02QvaH`r&l4g?HTbl2c1X24y5yrTU*Hd6`Oo^AS8(_#raH z&+qF3ni;$`f(h-((FU0;G6nn9OufMhZ<0K-Yu!*MSd?{N@|`AjcKGbaJjGA2!WtzM zPOWF=ZAO2F4SLNqW2UT`U6PTXF!pw~+e8olw;V)?eb{C!u*+ntL%KH|ZUDf0Z@zhw zzgHRl+55(*^X0J`sqO{l{oZ`GdB!jD4cDVoQul>-nnZ!@*L!7V7Ij_UWoEa2z*4=< zMh_D>GKZ}1 z*3a~XD`>r~MD@A%xVuWUlx6Bpu(f1?AjHzf1S$Px9F^b*8jm@PQH9(_3H9y~os zz?mJy;Sq8(sabav7CY0bfn0Z^3Wq=v)zvQU(dQY^9T86w**IV(H_cJCZSE|N+zEt14L-BmXejL`y)9?iUyg!KNK@{EIW0jz1djsZ+E(R z1KEbpCcz$ne#~GNW8lYhsAQ)5t3P|%`q-n(Lid~guzQpa4|n(S58WbeKp`>qE5&*2 zpyVeA^f;PKEZ^ZVw^O#B;v#>(TX9LEhJSBLy}TMz%#7%o{lRmawIu?g^q!x|q0`u4pFStHcPK!Rbve_tg@fKL3Dua4oxu_-F; zzj1QaQWDoF{)S$`{gWE1r}!>U=Fg@)AM_!FPJSyUwJM^_J+BAGb6Xie6ihI0=oCsR z8l>~Sfm@LeNIwC0-rBC~1ty<+bXa_n(38Z~(TvpWI{aNt6DsQv(4dp8?(3&@$`V7t z$HEc;R=QY~dcARPlZ&iZ)0b%4^-KAY2us;^#e zO0MZX`-#R4yp%J-R^X}NkB50_KOOk&R>Q++D-Bw_xL-$}i*vdspYD&((hz#$e7!s% z4b3`i(brI4C;^D1h469gc15Igr^MF%&X=q4R8+Eco!Sq}K7nu`5ZF~17+7D+a4w}y zA%vdV&E=KRNZV>R*#*{Q;CbYeK-VAn=#MBjn*PCEMR$vQ5+(n~NBOxXhEi_j4|4=ncSw!wJz_{?xx%IcRZoNXPzv!ADV+~0<8wkO&@B_(ibAS!D_U9 zzGl6i*6o|C&s5kOo7xM8-pX$MCCB*S>wTckU&XhMk#EW9Byoi%_vns z;@oC3{q&Y6_t!H+KF4q;??||Qvmvk6Q&-pAJ7$rAba6;8cYpZ%769b9eDAYSkU^g!n#;ac>9Hv1l!8i* z4Zkw`%tqbezCDAm3g7NpyluHu_J?!LO8fO^k!RC%Y%9kRIv+j_%?f#;>@*aZKWfF+ zb?0U$aQ0mVxl6V$Z&wGFXC&1FjSq$6ey7;)l@My_jed>{$&0hPc7Fy?bG+;q2=GD5 z5sw0*+=FfjTrYw|o3rpV&rb4152&mC9^1QEGS_8{R%F1{*jh^Yjo6%_WZgc$drVyX z&u7*vRybl%%E_b{wCl5HIHL8Ksoo^$a&@myXuuA1UHXS!kvvNh+7mi^=}Pr|PJlTq zfLY?0|LGyFBo2_8cLh7S^85_BeZm?)@iHf}@sO&_-;Q_Ww42Fz`yB%fMB+(C3BNLb z_N-4Lr13Vf2;Neb`VJ>+#(MHyhCjfMqXokqzjnO;>+-#KYVm9&R?$4Gx#w|xY*;gCtdxko9mGed8!ajk zS|_5rZ1^feedVZS0ttE{%?9>tDYX*r^$qvNvzHl8-zO0(cE3B;Ev!6Uc*oP5oxMJ} z|9hXduwDB1S9MYoMBqiBqjLkk#X+xdNb{n>3ALh2C?B{_Otuc75Y=$jc&`waH?U*zWLhV>iIu*|376}(f_MficlH3pq1VWj`MB-= zM|V(ZTS&xr!G!Z)HLrLfYO$Ud>%kt-Zl^~dinpzp!$RqjDf?Gpm2Mg&%beCKjt86C zcw=EI01&o6H$J(mA%9yq9Ep!D#Tu0XwQ4HaA9@>DHfwq6v2>=k0Q z29tUF$uia(*R0M!5L+^2)6ea4#R78}@n_)=3|d(7Qqz=$f})gBFNjP&!0%{w7`mze zs<8fZ;}8Z7!5D`Z4`w2SI;qL>`G5#H^^*&iw$bUn;kC^{@C9ORw*10hFm;~YSRt1& z3t~U@w;@M=nx&&PDleZ3B||1#Z%eh78<(HrNPPVZivTIVe%4)2?| zg(}uiW3u1EZ?6LF_*ij<0)C(iS3`~Uu(enlZyZBm%LWujK)UsUibg?0Y5q0N!H(FZ z+kIE&Y#NpJq(U?Y&5@R*J9ISGTL`SnZ(GT-O7$&d)uWP&T1(wH1JV?BK1O&XFH)fd z?s*}7R9zugv{Mkgk(QVbN23J8`DF7(GNN10O8qCJpxBXqYhZyX)%q!V?*!GPt# z!mB!3#!`s$wuXX{c)n#X>PVaE(OA`XRM@BaT(8Cg0;Ma1Piaq4ja?x~u>H^vgj~b) zy}z9hx|~Gz$&@AS`>IP>fS%NSC~!Fa#X8t!mM~NkQ>( zgARt1osH_{`SZL;|0B>^+FuKI59^^#Yh=-lV8=wL+Y9CFakI%Emw~2K@~F2i&5b$V zT2hn!Vr@%Jjv>d+c+*UkYOng0<@iBQf;|4B;fUB{sk*ea!27!plZre<{VHig5XZq~ zMP3|_Oi){j=65SX^V~cJ)M9&0+T7_{Fi{Z5m{=WGyrVe}|2)bv?FwR$AoKbIj2nNX ziy$XuEs-;?#>rWBfe!zZ<~Y4Fd$RVY){;OCPoBc`pGJ(Inr~+??X!AfuvfhoH-$+u z!?qqi>*(RqXXbjVW-46hn}$VtcB-s@bI%BS(fj470E=~3IjWO$fdIcYg!fq0?v}=0!Fq*2&Zs-aJ2f7>*8eDwupeNbR@Bqk zOLdj+QtGQ-`bL_jhXM8pIu(CS4H3yLR*8_U+ZCK!iCcn$4bhJzwa2#B)z#Duq{yIO z6o3BObqXoD51BldYQDYRK8TVkx`VSo-AMEj(Co`c>DS9qt=O+O>d_kq){L#ya!z*k z0ih62(y=hk|NU;Y!>h2&0qM6!Q{(DuIpoe4-6h2Q5DE3h!JC2&a>pRNZF8zkQq@1{Qxwp<-X(XwoM|!QhrkBPI#2 z&X!H|GjxSq;OnMJtK5(R@}Ucxm$~I!QO8ARtCQmO9JNo%2X}5Ok$!P4i;F_Om`(U_;#iM>~zm0G7u^EyB21}!vYAS#O%%ee)ny# z*F6@ye*GJXWG#mZj|tNoY^qm2Fwaaf;HUd~?bBlej*NZ%rg0%WQ{Yj6CSg$W^G31# zP<{5B4Vfevh1lPWUAN|>F-4@nAjc4$A#HE)_wkEws+v080TsG)6 zB&W4^w$dI_I3C!|6J5SkMxJoIZ4>RQJ&rY{sxyJ)?!IzmZ#X-S$VDCd9EZJn-Rc#1 zagpm+!$0&n0-Yr;d1lqs^!M&8yNt zXkKtr&9SGqK}OfQse4HtTb>!X3jAs-SY@Q$BQ&UAK1(!$Q6qvs$!~q+D34h=@;TBG zc&@^{&RttU)aY&FWz}BCFZ9*OBvb&_(!>3cjDeY!iQ#nQ= zri8kookw;SSMw55Illxv1rF=@;`nYi_EyU&H}0)5?Nku`ax`0Aci=Sy_7#VQF7)5G zMb?G(n6j(=@q>AX9o<(LZ7y>Z8CrRhJ#ywVC9L3_S3*i zQHpZux9Gj=)@-PXu@+Tiq6Eb~qh-*=*qfxO&|v73iGtG=X7IT`_d_##?o2KKoda~f zsj~-uvN~GpbqI=2+K-n(loUU*K>g`lPtd^h*7zyRpg~wDwv|K`(K+vG z%ju2tq$1li@NEAmv8(_+YW{tfX8&%PZTkfgC;^axc{y=_ztVst^U(qw;}!KtIgM-JV@~_&;fa`g?^YU#G5?N>2YA9jqSPm!m-{B5or- zzMeL6ZI|Eu8an3XT3VU~#p?JM0^M;zn)X6!Vr}PFdx{lBC-nuZ(3n+tmyxfBbkp7C zz^U7%i!i1IbuM-wh}Gg!{VC-CS`wYcnU?<$oelAeHVv{*B_7sI3pPvtlPkrD7#)%U z4zivlvyIuRyI#udv~@opp^sK61(qd6O-UN<$OOi!;OQONq@Ew$oe${p+82(i#nstg zK=h@7v;NlPUk>Ay6<1$$?QV(!z>^>`z$w7<3?B5fFnj%cIyt=sqM!6ihx6@1#xIEb z#S^ii&JSi1Ea_BY6!6bKA*)z*p)BHQMZKRSuwI6gTL+9Q6&;aX?2BOS^$6^x@e$mYZkJ?MH@xI1V`etn)Rg-pA zk)rIn)U3~P_zk&^CjIoZ-L(YX#_-;D7TDt0eFNLUl~vnqyVBuYfgwW24+Ut9vI5RL z=?66}90IMnN^iEkq`M_Bc5Y(6`ZQTtB!%k}i;mc7rvX%FK>L8;J}p4j+sAZezcS1G zetYWl%v5`C!6PX06DTo_Vz&8{c@c zntOeL|1IKVFS!6>ele_)I~Es5FVWaseUJ0lz`(o@@^7L#T|0nw7n>OeP(2mdqr~rg z(Z@_nrf~(^1X(A8Rv1I|Jr5%eyxmAme;3}ZB5B)a#fFM_c|tcVzWGh}9s;brA%@vXrd^Cv_Ohl-BoL#eZ8k9XIiRt>G%RbQ6%PkdiI zXSLR6X!;5%YeL_164Y%qJ*MiYynMSg;VY5-Pa;(l@A+$3TD&#Q@BbuA#9%vKQ~M@f zPY9~Dp>kfJTj70M%Z<}N^@6>MgxEky_y*HTuBi`#0bkt72ZtPtAEcz0x-HtKXz+60 z_F(_rgHG{*#Mrr)FCTL^UZO`#B*RwX7&-7=H$Pq|@|7Fnq8McWnoZ>!4VNDW0Lr-R z%OXJ|HtYRbkLr|;y%G@E|H-Z#}123Tt5I3at`o)1f zqh5YQThC+b&9BzooZC$EqCM4TvQus$H{V)l#|nIT)a!Q_zQ)w}y>+zb1Y}|V>+sUN zcRSG&QZ#Vpt zZh4Vb43}26$fM2mf{7!W$(A!xP&m1G@9jZ&D}sQECbR$ud4PqAD5I0r#G+|shO$w= zb(Pm~JpC95q}bR#c3axHwzs|a@t4Cvb@gAtv3VDYEFi8lm-O*J9Cs7+DgR;^jJ9Lv z$iH8se;ysJ_|Vih@wLhf-0*T-W6KKw$oHN;cPCz`tI+03Pb`@FAY_`Xy!TeIg!`dy z9+e-pS@-hKY#|Xkoo3?(Gp?aAL6!N?LplJt?UfFNQcENyh-OXaGgpWoNMRDXlNzK8 z>@H_&aB+aQRvaIq<|RHfomTl@6H$*Yiqo^enlqD)3ZCmu2!&=3iS+h-dLkT_kY@Fi zH8T`#%c_(|B@qV#g*#SzIbC14V+xkp^N!kgGTr-OF&MP9h`9)eOC|&sK;l~in1FyP z2UHu}7nwg-)NSM%L4-Y-d_g*k^Tgd*hWkV@_pJ-l?AbpRBW=o8IQ>+`I)+v|%fKNS zUi{Q>BjcN{K_$$%ZE1q(-yd_th`*RTx3C z@G&m`+j@8xLZ9;_)3S*=w+SaC8=k2%eR3aLO48HGL&Z&^3kI)NnSfTMigO-N$q=?v2|EgeVYB z9`D7lw8^_^h4{INecZ;hdr`)Stphrkbxfe9S17K9(=yeE@;b2M03kpjPAz>2Q#xUMKZ09)PPFw~5qC#>)NTY2Y#?wc1Ul|| zGcN{R3AKXdah`E%)NSeQtvO*;=OnqiD*UNZ%^m)MG=`}@;D)~^zdWM9T4Xg+=9=os zPso^bJbezb6#XtC$tOg%lh`z=nON80X8W4{iU7zY>SjmpI{W2-!4kz|1m6zV`@nzxNS0PR1;nYc+pgZY6CNTmY0C}xUu;vQA)k^Y(Uif(IrFa%-@L8ql%;ZnN1wXme znf9y6zYi|B-Zs~eakZWDXh>3S8S*>2WoAOS(2z3T-u5qrp1If&LvciDfp?9+_WAB? zpC~w!G@Uo$xN8WT#a`*~ZHcJjjFRKY=>l44z z18KX9cF~(p`GHYU=4N#Ta5ozRAXhj0l8UX84V)M#I@A#q^ijXAtiaiLK{IY|Vkn{P z`Qa23k@D7T9Omv0vYpqI8KS^&pSpg(tzW1i>Xg~TK5TY>W=&m)dG%lD+*63%HBBrv zGwff&4u#3GMGH?hkb^4fDQ97OCAA~A3P80ZPz8AO?cy$?E8yNygtO3mrUch-b$al; zjvhW)>Wjt#y$b?JvPl-#GVDNWHF#6QW85uTNneTHy`d>BxJ6Jqi8c06kNoT-09kCc z?V8`+Z4D@&2Sb;wKC&c*b_p!(i7Bt|87S^d^qRR@G8It(Tk=g>*Pid`+6*suqbPQ$ zg!5NAg-PEe=hCdDC3Tt?Y9hp9G^!u`R8I8oUt3VM+37mYxE>yi3=!F5J)?4 z`y?!5(mU{vZIl3(MxoYHu#+@{`|kin+{Ep?{6+l*$fWakZV)KzrR)ceH)7J=y$`sK#YG+u^EKnhk=7Pl%CmrkdU7>3&Y+_BBDx5>NQTw+tt-u#ylox0c{%@dfD z2n`Cfn*J`LkDlN9HO`CtcOCXW9~_;IyN&N2hIFqHrrWHjT=J}|01o}7V)j`%m(rv6HeNG|!zING}hf8q@BeeZT% z4bpk_!_4Vt_5=+kIBpv=2b`2SD=N~o9TVCFAxRY2T<#aq_ta;1UQu}he4^-o8%K>i z_SWfPpf6Uuz_1YU@f#C-Y+cD#jBW=3ax-K5F9O@A0WV2q8fxUU694@x z?S(S}uI{!Pwc7DK($}aM?|cr=WuPM^DvHx|so1~{-xzdi9VirHhDY9Ix;1fbG8W|Z zNC~a%SkN)BV6k*u-t3Lb-E}E(@(2OeJIZ5rqjc_@^q~t{AE2d`31up~tz?U0mW=XY z*SDorX0I0gw_iff_t#~3x2ODC{xktIxbwa{J?8iU;T#B+;wR(CK(BtQ^ zuTcMG>b|hB0(SoM!0?Rq{4lArz{cQ_=T`sO-B?GbEyMK~+DdtS?r|o9f&%ZT%gfAC zf)Kv~?h#3-7;L4ns}6I|ZD=8I!ZquBsrA1v0l9})K7=zxPQ4QYk0;?9Q19sXWM};b z*!cDr5c9$w@1SY#tup4`+4NwSqYGYM86?n`u0UVrRgISWztFQAlo#o&mBWo2IDiUx z6)&&<})9||B`~~-0y0VuW2v=;=Q@OFNBKqKVbbnB$H}x%}q8;)J)LF4kw2f zho|e0DGylh)P0;5JU|v+ZNwbpyHV5KGF22)qIS&hPsd#L8B!@t8G#>-aQv!JmGyqd zW?{vG?S)F>r`p91z$W@###3Z-J`v5R*ETu~b5A?b}I?F`Tw9R?1W?v}-_72jj z?5(ZY+7IkYz1Oku4~Q-<1Betli`f4;`t432dwWHwn*=549(@6aUQC7cu1Z3W-q+I+ zfp!PxMzc+fQp%fbUMHCP$axDxSNl)6tP4=jzv}=@x_UKu4#S?0SHk4o%%jg2%OVZy zTouagSEzVkj>-hGcXU&0(H`(QVYP5Sff&tst22et<;nZ?VovO0Qr++N3fJ@Rj}~dX zlgE1ao3eqOidla0hqc&5k~#D}*A~ytbU1l3C9m({cj+Hc>f`w+vUPU{C4-=K^JCa-y^hLE zD(qT)m$!R7VgP7-&TKQtN4nk`z9tY9eX5A-u95kXUoW+<16U7Cv6h1cxhS+(Sl=t* zE44QU<%c(8>jmAbzD1OmxvrTsLP3KenBFzyxjaz?b) z8MeD48(vCpehHIC?eC3g7}K6Ly;N|d1xB$j4{V&6MpRHrU$ACMFEWt^X z-8M$~w*U4(y!S6B%*;R1%3#TkxJ^uscjc~gn01jQ5d!o%@2?$85N+$X#sdv6T80*d z=89RtsOxuw^)X?9+2@z_Usp%AHo^sW4eNH$CehO{z*g z`iw+umRlE>0mkjN8AP3iS+oju?ze>L2>c0xn)4uX#<`oUZf=&CaG7x}Y4M;!qe#MZl*nv<_G074?A5?9zV!zpG#aCXkA~ z)dKp%Hd+m^?-5cBLJgYA4R@KAQAFbW3%_c27IGOnzWoc*WA4=szK^z1ARe4KYPU=(|?*< zh!$#QNdLDNh5*JQzj!M(yUE3&8r#RZH6XUNJ;aPtDHrd_L>{%Q@kbny3itKDg!l<< zXkT_3(_jGs0a)rlp80>y3!Ja#wY}_FiksSg#NawE9HUkO%IC(jBQgrAlw=Uc7oQXS zlzyH}@rDLndeRGo3je2MDx#T9?#_Gjq-|qsLv}S-y#^HN_UrkZ*yf;4Hv}xGW^v{p zM5YtC&D>q?)kML`GcXkZ_3Js20*{^cGQYEH3%P9gAFks|5|NtpoEe&*ElG&m4a9{R z@BH6tbCB)*QS+;Y%*&<;2%f>dNYP=MiM8j zUmuWKTPl?%gw1M}!~eVPH>PD6LyQK>f&9BIU;>u%sKchSR)Bc2ltpl0MQmmd;<3{~ z{qo1MQ~+vnt5uzI^eJdyJXIdGoMl)5>C<;4Q zp3HO#*AG<%D%sDiiZCk^FqC3q@`(=bA$L#M{qen*cK_+RF2FBJVBal)Ieu(CCGJhL zdK-qa&{QrMI|cFhA2i6UF_Xp(FCX}!CS(A=&m4zhUm^oa^#^WZLteqJjCiOe@`FoT zK?|FE?5!iC>OD`L?U%p3jJNPct@p0)x=O0jR;PWgmkjIDci6~NGyv=*!AVu@+vA9v z0!tb?On^gyUu!Fj)<}F7^m`9>{SQ{PnHKh%9LX#bdJ@X=F&#qIk>4!syo9Rcvg^DVxyl@`Ia?y$EJUs8GS239m~}&}mp(YS5_~)8L+^60|L(7?iXeBanxeOR^?*NV z3+8KUOcijck2Zhr5LemVFsv{VHGAkxafjm<<}bLsyF4{r zTY>D18Y*;H@*nY-+bQi)cp=Y;J0aka0d~Z^7=M6!VA9UfAuM(-BSD13Oi`KY}%&+T#ZNqXlk*@6{e0zAkAlLOtzlZiGn-H+dFByrl5w!Pei>7yr+^9t#hidS_Ewswk zHf8SqSu_p%#F2)6A{ewkWGWRK@Wd1Qeu`(ht&Qf&73Ko5x=bG8-@c!3% zY5F_4M(UtNI5GyOE!vo|qMmy5pdqwi%Bp`VBU&h&aOlgnws2GW)933B0^ypqKP5gq zqe)I$c?tzkinD){4oeGH)684az5bVX6IKjY zr&cV!mx)gPAZYuo&qX(}P?)A-(j(g*WMNTMcQP?r^mujEEIV7#d7XtvT3NMrv zP+k@O@mm{xVk?0#oDU}Y2dxvIOYKiL)|nH56{K-R{A+S`7<04jeX5$8Qal?0wD2ce z`k!n7Dx^6TYsWJmJ41Mg{%wN}c}F$XR;QO@3l5*si;+bc|Z7Eg5G$mjy**4n3OiV2`#ot4#o%xongD}VzlDVi2kd9VVDQhGTFSZ|B)J#TTy>dQLJ1Z ztfj36Dl&?L+ig6FEn(|C8SbsJhfuEv8zxXD^&URXmpH`j>LXHMPfIiLX@J6)9l{u& z&1GUqw{lhG{8t3SII$72%gNdb?dfW7A>$Rgtu9goU?eLRF62I4e&?*c#1DTd5a>xX z+V>%uSNubaK}8-o@XRt4R>ao6J{1L&=!u&EGIWiGJV&_Q$I+-gED$JG{6wmV`qxQa z6e;0>=-F=n_s_C4h5Ctg^$LXX>CTf4jywA6QfON{G4NmyhVUU!bHn~!HrzoS@6qoi z-z#f@`Cy;zfrD)5f#cc{5*s++im`b~r?X)%UiHH%`1!{)!a~KM$^Gyio)&=!01=$2cRVYd>GTtP|SSDK+o>llN)gD z1d&K02;=1d>bS&YtQ#Av$3ZR)ORGx(0_>!JX{E1Cf^|#iC#k%A_O=&gFgFmf*f=z= zBm-WT&%2&>JEQmSeMB^}bV&bI6z4{zi!_+IX9xw~0AA%lg&WlY-EuEsCf+A^d?`0` zN~0&`fG_D}y}cmAO)oAm;ncx)?ygEDxCfpz1WbKgiqz(Jr&bVy{(6iGzy#Q~`5I+X zY{HS@+qS{jO?u_vQfi3 zUP7STGOE(Gv%5&V-hZ@qd8+xIx3Vo0G1Zm7%Ee)b<|PIm$gWCHrKfKsca{o}kVT-c z?lN}^+nSe9Vc9?dnmJX#n|*|x$Ter$|If4xLLoD5uWs3Z*NkT{R`d+1{XGDbnL|*d zP@HFWwC8fRnnVwJ=V|Y4ZSC#M`GKI9mmZ+R1=@*Ge6|_IQ((i6aU(Rjwwj$wzuUQ` zk&!7_Ro|S&{Q6GUS8iXutlgNka`@MQupMysm+LX%+NOXVjE!-UaouNI;63C(&+CUP|BdiV%Se(tm$5JcJMq7~y7AsA4-A z;py;Xjt!ac#GHjR0F-|NDz#Zkd7a1-wnzAYHM-*m%O{=n&f<_;mj7SXV)NnqVprJb z82oUuU-KbaZ_!8IV4S6gYJzZ_Ea`!jLv;!5`W=oXZo$o|mwaYfY0nI^VMHlV+8#?U zC84ydpl!uJqntMSWpsUZ5vNy`$wHzhE$vKyGf=8XP@(Vc)GYSJ`zEb3k62r=Xu&%w zOuK#sSpOhcK9+)8QeKBkiDLFO@TjhlHsyP%!vxxB`>LB=Te{8)cEx;=V#CBz`g^bF zYL1)6hIihtC!`~EWDhNGBgp#F;!?osoJv8jVo_0pEDu3-Uq*I%i9zu~TesvgMBPu~ z_7g%WRDRyGVn1d(WKA!93sO;nE?Uym=@Zypv3%S+XXs%8ITq3D6qtUDcIPsv+oNe)E0@*it8QvGA)I+Bq zhW;EONjn*Yb4`m{th8dh_?ucgsJQo)jij7FB}ND}LU^JfP6bL}_415BR} z6$OU06HtF785u*5-?gUY6gnPe#cG|=H%X2e!y}GKdT0B^y7WspfgMy?m|Tq&f@+E_ zae5fW!|ET?85y{%plZra(=-xa%NhH8u~RwH8$v3YmW`>HMan(j|z5?1}Z{NYwRIh#v;C*ro++8Hr2t*5|2(>(GQKuGEy zkqn8)^bpb$9;z~|}lkhu8M(5jTM z)UOS@2%xMZ7HHv-MNV`T_3TN$23I~uO$?$xvZOWwK|hP*N)r26?)R867H4Px@5dCs zo%IuwYTX&DT}i3M;o22XXHecKPi;j_1D3*api)ds;EJiBCT_SUs4oZfGAo(@EY^Bz zY3a&qD*6>C!lOQ7wO~LzM3qAJy;}nh&$L9Wqi#11AYj~|r{@?KJpB8asyaEdB^+q& zlkfYF_n9}n+6Sa?SaKzj4U3P1JRv!DNmt)VYBXn1eTEEM2iffdrm&G{j!3I-+<))y z!w%*06V;x!P4?6u_n?K{>ptSb1~$DrI~Utf{4pVH+xvS5`^QLP7>T%?1+CKU{>=|X z9}N4q5A$yl!!XnOJva0@B@LAg&`Op=6vN|t7vb+KJ>9^EQR4Tn#|wXoNIDonpgyP8 zPPuLtdf-2`?W;K;6laM;Sz$kgZc-{>L|A=-zG_liG_N4fL=9EzdP8J-*%u|I9ex+r z?F9~%4ovGEAB62s9w)Ra_TT~kr|JG0aRF|OFF%?bDE=0=>qJA5YVU%mPhKW%(XFf` z1ckR=1p7f{9CnS)`fl*n$=b=Xg9f%xF#__7=&PpT;=OtE89F-ju{vy^pON8XN0IZ> zZs_@*?_SY6^hA;-^Jb%8LM0T@n{QCPg0(|-5OLd+3_0XUuIL~FPK>|55o&00h4cQU z&f7?zcvoEf!!%!{oCENcg@>j!gz35bJqj-UI0*ntMaZ{LG>}X8dv1#n$hQtT6pSP_ z3FXix-~Gl&QW8YFUnv~#V!8z1t)P^fb0*fyYZM9_S`>R7YCo<6rBj>zFni!Bt}qO) z^=QHq89Mt-aQ(JMZAsZ61BEBy(QA@OXn^Kb1Bue{^!dS;gHLBWgE@LBt3={HT$1vv zRN*}*CQy$TOY(ZU`S<<=ZSfQGbJa6+=Afnb#<12~%A^z%0vm7@yAxO@c_#XAb!yc< zFy^-6)hj&g#DUzIyx~6wOd;3)b-}0aCIj7YEFA%zSoy;-%?$8rKh14jNiAdqY0l7ljD9Sv!qx)-`w0_Dz7-a#~IcXHG6 z;>DH=o0FvHITCA%Dc} z6ly$9ea*!yF6CA^aoXDT7$GtNy>BuU-P&DPG#jqEnR;H`)l4nsVUZlpI?ZgZF)*Vk z_j;?5aYOcp^uI+37A7+NfJ!n?*Tc#7GiUR0&64xXV2(?ht8yn1|CCf0ra7 zrNn^&$*!)rWlx&>CHnghyc-@of_*F~Wl}eiPpw5}MxFk@_P)X^j;Cw02LdF4AR$!0D&Ypgy2pfK!6MchCyb~;1Jy1oxvse&hLBod-vP(?fwIMcFvip zI^DN!-LC5HDY^G~SjOb1xQBk8SnjPIc%k10fLT$>hK|OfMC~KC2(YQ})=3@p?^FZe z5F)|D>`HySH&h#>Ux>zudsiLEq-kpdLQzC8#61V>e02ZHtuIb{pCDPpumCgi43h{a zPA+GuuOicV6s_AQzGASii|1#3qQ0LC`3f`Ub7G*5E7z3;XjT&o%Id9MG#0EN)n$L{ z>zl2KUk6*7qml5*p5n&|D=c^ov;KNoMN2AeyM|i?D%@Ht0dwdNpDe ziI~mi2LNe5nUj>oja`D_^mMpi(On)s&sZ;MmqZe*46^@YQ|0n%2HzDR)ZBs`=An0m z?@zs~Af8+`WXe`eT6R_SG5v_j^YXGX*nAHF9GYtmj8MXVf3ZHjYjbhLOicxUUEZxn z&FP{*cQi{~*_%cXxf+S+og`9@iQ7PbKvI^pZ@0_~87ta!@xj9{@N7Cy2 zPik_GB70QC?$_~gA+CK4`DZ#|AuNT&r!RH8`1=v766fdV1>$2MAmj;t4UL4a^n?4e z=DE{giYh+dU7Fnf&giNlNcOx`l2Y7^@4+5*=9m~t9Q`iQOtfdz)mC`8p7Zy>G469Y zS0z{}C5exPF)l&YC;aBgK)(4*Q|)Gcq~+Q42CXYZ_btq$6U#y%Mu2h?K#gdRg2*~W80 zqe24Su99o+I7m-Cs0eXqML7>ZQhp{5C-f3gIAM@7})kP$caA#vT z*8WquoL1W?fSX%M^7!t7el>s1NVvmlB1zzW|zOH0JLbWoN$>2DUC^}$=iHwS3J8E2J-fdSJj;xc>%9D z9Rg7Yk4jp5ggpjf)GAc)!$L5LZ?J5@n?z+`=y+IQLZkjB8$g5i1QO9_s+V#yl|dN` zD>kL(CijhSC+kR*r8W5H(K}Q8%)bOyk|A#vO{RzN)A94ZpIjXjy!p8DAg649VL9~m zYiEbcB?Z&|ilZmb>1Int$&-Y2Q#pXKB{Btah2R> z>0!L(faDaJ2O$7JZ1=ZE3;%ow->Dyz*`uk|rv;WW#-b9U&haNDs7h~+`Zc`PJsC`O z@Dhg_nCFB>TuSQJ?QJhYp7H>B4Q)2IWht1%zhYI87x$S6{>1NW(fH0zT#){eH@^30 z+i?ay`8m^y8wyeKo}uGp$76NxeijFK_0PSw>X%;bce>oYCZ1Vw#`Q&|lvXKG-CE9c zwu0UmXUPwH(*ao1(6iI+KRmA`byE}tDKfmUwf509)poe|Bj%9!UHHc?SpJ#ny z>_ja3V8Ny6ag>clHTf2G;`* zz0ilD2Q4$hyXJ9UVj~W6x2`lE;Dw3)Vr@B7Jv#&d2b;^YlTQfyV5P?D%Lgy!tGVdLS=3KX(E3Vp-jCZBjz- zr#SEn)!XH2OEHuWEgdm7F^$k95%M)R@$xyy`_S&*PC&QwT+k>kbCew_9~vpuEa8zK}~K!od>8z zt0t9<3IzseKOFt-{YJ9A%AGU^p8kdj=pkimb?`;zMkY|p0H7cipue2wv@)^Z3g7^F zHfV0u^nx*gzDyd-Mtn4u;I|ORgF%D{$3yMrhOZG?%KBew+K)m{W^ECzkCn24H#-#x zVb2fl`BU5=)$dz3Cc;-e-RWwZA=IPZL!t8q!-p`}o zooR%v%ZXm|o#pZ?qXxE?rfe)(#L%omm0GFzK#R}!g%{^*gvjfr)9y{u+RMYYvWCd( z=0C})PXi(gpvKy@mkYC|q*IUg-Po_Yh?6bKYL4SZ0DzG}Uh1t@qAo?0R&s%+B5IEj z#dO(776yFz%x66=jnj$Ex~Z7ibD8Rz>IgL*8p-`xRIuW^vL*hTH%g%cDqRev0|*y7 zcgUbL_g3X*0PWFqiykvT$XtzlE3N>TgU|8n&>+O8$2zjJ zZ_ziwH0p*I$Jdd=z50`*f7EnLxYToi+(%aGiXI?D_`iuJl`5~oT;$iJgy|pm+tGBm z*s7d-B|0$kvEJ6cSZFdRZ4}m>`QB)m%$J5jIoEtHJ}ilZ<}CCEul@YZvPNDnhqj5^ za~3HbhCxe<2y6N?e2!<2H>_cpNfiDGWZ;E^AyQ(pnXp7jeyj%Auv9joxCtHt)f{6k z%m6U0dJvy>H2cxQssqjD4)l)KQ{Q^d1104pC(HXrXVvS+vi+B+%8vv6IU6MO=Wb^A z&mR&;WmYWG4DpZhW$q%W;~>=J?W8Uz5#CQ}#)FDAinRPl9<^0!gdKRc8g~G+g=in$ zWb|YJ7i*pGA@I@e^6z<(SUV8HF_sujH8&|ItXo$chQ*z16v#Z{qo%3p_P0st6W?g= zCc*3rG!u`7$WkRH;0}gD?oJlVh|R;M#8P^+qyc9?Pg5y6v#cEw^fP&J7gbmCU1(F6 zz(3D%d;YBEcAN0g>Jwk;(it=AH_4@4`1Wy)F|Q%sMje0|X=1?e7diB1_iAKz&lPy6 zFA^%q1ptdYIelXkPQQG>etH0RUym=sx5ZgWI9&5PsO4iIug7V-k-rNwE1G#PuEsT| z8e!B3$rGj}QQS?2MJru8javNz2TSW_smrzRdbzU>tG+09yl++)Y;K-g0^1dpYd_I@ znqtdkt-IKY?k`}-!_ZKN2ng}4$2ScNV6RSJ*xN@>0T4`D&Va`>nQVN9tD9Hfp_&y!*ZzzuC+a(cjEj(V z1$EBV*7L3MS49nyX-@oKh)WR^QZRJTeBa=!P77lu5U>Ez0fmr9CNDe%02ECcbW$Eg zwRJlJ%{DOVq2`Z}c`%roQKhd^s3?0-%!`{)0cu$R-&|Uj)$d?)Ggim5)x2pi;!IwL zrN7j_g$su_deC;tl^=|kd9O`~@%nc_`urdkVT`GV`D$lRjm7>(XUfj;?pxG<1p!G; z8+{y|$T{?T@?l{YDb5KKC@gi(Io9QMQ?+qLlxCbvl>*uZ zq`0iA%U>+(lPOjleq|O@Tf)4`#&=v1WfZ`g)v+R5M#bm@;c31v z)GSxcLNtsT{p2!qbobh9=TTRN_=q-*0pGo95*o5RHXQFUohxrHwc!>_i7;(Wm%_R7 zxNqH8of|H6ny*R_MfUKT0}<(@e#Z*-Pcr^|20}M-)9O9YJJ12#PFa@4YHB+eu-UuX^XXrg+JT5a?3KC{Q&QbiyBozLEq z_;At-{keYAhKAp|d_Z^4_Xofm;qWjqv&WA*UVy!oV0SZIuj`*3qWvdtEVuuHK(yR* zyZPv;y6gV>ZUcqmEy7=RVB>l3A820(T^9yGKP7b*pPF(pL6x#|V9To#fV3wRX(Cqb zJg4i?VyZ~H(uaB!NTtH7l=WiPt3yNW-*tDs;>?~&2 zX(O#CSrpzT9CGL#GHm55(Z@2lHz3`RLlxWG>ZQ*`6BGeVfWJdM=I2*C&xh0SLbf@k%ZM@oQZ{0A^fz)zCH%MS_azmz&*E^d9`?ZEM#fhs-_;)^qh zf)kkE+@ef90;N*HJFg}6jvQ%n3`BnhYH^Qq)rTlW-P)um`Xx9})=c{4`(+`@?QKMA z;8hJ(M5(8+y4pu=+A&B9hbAvQV%dJ}jRni>azu6rf7#u19q%K@1IVdei@y6wSx>e< zEQ=+f%=3}(v~_*N`v`Q`Zml1u%D%L$q;kXhaUSsctOlE&p}F$gWVWyiDgEqG!;^>R zjX@Rg4FI`xfFEf5@UI_I1)x1WC^Lgs&FKL{$rb57cKexj#f+0=pVO8;aBND3<}Pj$ zc)RSie=Xrld-=xKu_JL-3;#aIKti|D>Z{GAe{06c#cdAJ!&ez3drjZO+7@~jXao>B zKWaNm?@n6ixXHL!{%St~WR4sKGODP@{G=|X`_6P~G#HMJ`X(0tD)va#(wnmZzs}9L z4NCn()RO3jHeLdsQx=ToN&+q*+20*@N@w&;Vc&x0n<6Zl<^Ncdr(;Pvds1I{D0WY0 z%R6!W2{w?tm2jb(`WVF&QbZ++^OlQ*mGzO$ZPMJk`}vj0#dPk5Hex5-%WR|d3bq4w zY1J=`=X5UkLE4x=%YiC|hZ=FnF;$Ifq0c5?aCf`ANPQ(|)PoRV|Jv_6Ny9&p$bM;1 zh>4ucPCSI@%8{VDL`aX~eiiHEg3!M10->LKODjzkBDHe*#-Orq_nC7-LtrmY2)DQ) zHGm(G{7pw$t8`J`etUAA%LgIP6WT_JH=dEEK4%a^B?+XFaZ-{4M)Sa7v8C>;-Ok}0 z*=3;`?E_%xg<@CfNf_>JqA4t}sGz<;XD>cD7bR)R;i7OfLb$|uwRqX_S(@fLw> zY+zGu2TfjX))df?js6?Vrwrfxd(Fqv#e)i#p}=CHl!qm$T9vdJRJ7aR#>UNf_?LPi z3em9jYGr zC~=BpAU_mwHuzU|$Gg`zRx7DbYJ_SnQG_LsppPk{A#_|{9qh>XRUja-+Jj1>i^ zfzjdF$wi8q7ap&OuI!4FUS%x=*6wgN7d!wu9V*D%?k#_u)U6!kHXE`SbqC!f)@Oi1 zDj~*7`Kf(4;)5|;v#2ZL50Ax;=-L0IPDp$X00AHOhoP|$O-TFxw>$t)Gct{$5saQw z8?!_&fkLQn%U*~4uz^Xm5`jWk(wW7stsK8fvV zSKFD=;QP6==IWfZ18yIdngndG7Y zoe{=3g4nMd-F#(dCE#&y3LHQZ9n%EHQ;N|Oy+9tnu$Tjlx2MZShsM=kSG2D)dn{-v zKaaySbz-|J(2S<#igj%9(Z1YkRfVzV93r3)0+LzdY1hosnz)J{4p^DucH4r&^{tZr z@Q9v8(ACBEz|4nnYM53Wi06}8fG`z4PJ>Eek0MHOcwJSb!*(aoxxIxO(#bmHGtL@48~WsD<)}9GNG%Z3ZF>0FmEnTDo9eg z%KO}zs-`o?(J_&Yj~w6k5}8|$GZ0&!#`eH1p2SgiT%h4V(48Sqf0QzXn6L_DJp0Qg z0!JdM>l)HUPUY5bVePG#fSt3gAd6{(%187#D=7F?hQo3T9KKe~8JjWXh0PAMU|o*{ z7sV{iwdTcRagS@UXP|jr3!gRZam%s4(0z}F$P~^7fIP+Yo0nasJ$TZZ&xqzen05V{ zTYgshyyl&(#FW{7tf-Q9>2vv)I>8KvwTd6%GpwSZ@!#&AX)Ha3izcYGc(o5|3-|Xr zyZ!2FjAs~3PZ~1NBUpmKo|h$SRkk^8Z>Q7YVjMurCv5OU@V)NJbMn*5f0pr6zJ@OZ z6=hu_DpQxhf@;7ccO;rrFmdf9e86+~tYVovIc9I)#q0Kd7Fn?&Sha`0vTrLQvdvHbS7wKq#1m#wBPcSVNlRedH%hu30aj|;l-o_^>S5qv%mxdk-n-VoZk zy@bl$1-t&nBSH=;Z{{G$b58WH--no;T)!T-x2C5!yZQ9YZX@GNNcNUhFuqHG5EBXC zAu%*9uN?_5iqq%bVHV)KUp(^=!)*DZ@x4~ES(7#R7#NCe#&hIrR!|n>H{A7xE>;)8k6eS!tVSh;nVFGc$s0)? zpi_mbcbl?q;j7a`hVjmKUtHZ%G@wZpX&uaZP^3`t!f74PxxBAfu)#tA)3dB42Bi&?tOKkNo$dEL z>gqKYG+}+nZ1C=lp4_CER8k4Qm$Rk$5~8*abGl5W{t55%4qU7OsRIo!Et;-+s-q_h zQP~zjV@#jGyv2{CvaD*m=1s%?tl;}nZSYb~DU0)Ofw6(vz3s>`l+%79I;y{{Brr2V z?vzs|MWGn0$J%u5G;J3wXq$g%!|Zk6T+ZT~O4?AOmgTFAf*!C{>ebG(E!CWOk z_f$OEJU%%hX2zX;k=ygq+u<@$%|>c1>LmN1e}=}&E8mDNz^MOL(@jgq ziV_igA##0RV2R4?J>{h=&zvO(#1pJ@lOu!$xXLD8TYvJAXbz9)hCQ8SrhAIv*r!5A z$5Bhkk?9Z=W5eWp!b9h=@VZ1tsi}(Nm#`x}-3Z&!pYQ=e*dR0q7YN-TN*wqWyvQ-B zz0j=sC33_nU5@@}rS)fpB+%VD9zfE_efrtv{IWayutg=$1+G;d9~Gfgb@rQl@I`xH z&fPOt#WnYv`M>&Ulslx@z>AyG$?&y)r+paJr=F98(2Ep`geB8>k;sUTm$I3hbaeF1 zG(wjzlHR#YC`zp@{5i-pbSHK0Q~b7&5Hjz<>O%@t$Jr!o8>#9&-ofQ`-}0=1<7yKW zWtip?XA%@&?fKMQ)OnZs(K;V{k*;y;S6MO6B7au!Ivq}?T(MVO;O`*E-cdnS< z8^JgB{bF8yVUXS2CK@V0jXqhRF{Pm0l;(oKL2C2nDy;hf8=Fus6y4U&?hwa%A@+f0 z$s6(4Au1BtEG$`RdjwqlGY^gjxWcXI=oo4GGVtC(r_9xv>8d`_`J_181c~e(uL>{| zB`kDr_StSeI&>+JsEh3(y}K$~`Z5+Q%OEUFKL{Tn8FdK{5`rgMnY(4QHu>IPGvkt_ zV5C{z_4vedE|je|{@CUWWIo#XalcMpuk*sS?vF(46VKhxfX3ftT{aLdQ9?pcJs+nC zSOGDP#*TTKuxG01&06zGBwk7CvwB}~6w^V`Ow%r9M=!;r^XYJrVWouqba?SDn2rwW zmUTHb@H|$=kXl&I@{Xo`zvKI>*_qMg)&XqY=csLz|8l>VcqLWUh0w*wiX`Iuh8gOm z;#SW=lOe(_g?zBdUzg|FeL~PFA|)h7XxcWrwA#b3Z7A*5QptBtXVVlcL%yD3e5Vh zKHk}s?G(g}ew_gq1d{V-kzuN83VX~-7i*^qbUBaDa%wgM_l{XI!0J9lv>D=?C3cY(fErd+P2s`=WfWd%`7}OT zyt3WIevxRSbMMFKpT(**>!7v)Mh9~3g6?k7a;AMRW=MkqF^ zc^4%5!gbTX%Z~InoLyaG0@E8bI*%qHZKtq9E7p3fx!X-W?M0Me_C&&^n=46O_ow&r z@Mw53m*$kjpL69z0n6d>=o4$^ZU4bHlBJ9uVLFFJn!^{#5> zYhK%Ht|cc9^!d3AMT`u4aq3Ym4BdpfcHd4$Nz7*3k(drPK5;rP#{5d|uND~0f3=ZJ zbLSYORsT*V_Ef>)H&N`7!WE;QlZ-Xi+hCa;83eab>jJJ-FTl9Xw*th|zP`{d%(P z3?ND{>0{_4Hsa3y9(Z5b$Mkgg4<;qotNy+MoJ`0mvdhQcbM_2nT5yZSWq1_UHDe}9 z;OWdRK)G%aO-@G5S=(ox$n_HhE}OQ1Ai~VyRKcrc2S$JHedhH?yxNw~H#0-Dbd&G( zwgUKK{78yVq@j*Xg@XW(QG7RDUly{KLwng{;A53-*V}NToxOH(^K>o;FmuOAooKqV zflp5EwJ+{7C=E6%gDQ%?f`o`7zjY-j)6mnwQ}|#{mgpPPr~Mcg+zAsHUuo^!>Fs~z zXsYsAUZ`FCi3qqaZ3q^0i?1H7^b+8Adm2KkXA|mQkWaW8di&F91rUIwWuEKlaW(kh zw2_$(@Jh^ngWd1$Cicj97;$u7*i2&Fa;=-{y;h3blYjVvAa>&q^-P7Kaf=}_z%V#d z5Kf>nxWZK0eC_8NdV8dqXS15XNJlp~8YfFj=TIDnOT3`iPhI@X13i$Kk8j*i>g1`L94JP$z zk!)^)S9%x-e)NgEJKcOK|2|eoC%|_uA%v`2W7ZWc(JG#*epP02-y^y`t`~57qO$#1 z{s#WzU^Z&Zba@m$JT_O3k&@P5-h*YB5|_*t}H<`Bw8>r&xP;Z>CNi^ak&q@UGJDZp*dRA(0_` zlIG!G33h(UlI%&Yh2pN8k(JxvzJ~=TsPqZeeb-EmXFc$p9yITw3_moZKTaaZ?T5=w z{Y!hcMhA=hHqPh|T^%0KLW*`N`I`E$p!i_-J0}@sk-vSW;K%Pp`TSSc(oe!o^xusd zMA|kpN%qu;K!c8r$^&cpTV*VBrXfcs=Ojq_b)T1p_gODs*n*Z0r<#FvT+^|Sf#0F` z+i#@(n7E%xZLgAojk%hy4^po!ZL11#686(hJU*#xFG&(_uyuenkS{Lufu;UadFlG! zHHfNw`Oj8~s_}I`<+7(PaJ7Riqc2W;0~F!xk+!x0_6k=W&CMKm(cW2;rnTA?#)83p z_Wh>=u*qb!7XeE{y|HV+p3C&wIsf|#)Xn5c_8*dHP%YSobP^jOIS{KMa(k)sxfxH0 z72x)BnxC){p@tmozIE9<_(R2n-Cdqy8_K2DPYrbm^u6;JH>p?H?J#r~6EcW?K}k=? zB#)mzJ#90&r1aG}?gaP3;b^Nrcd?jLo??IP$)=LG<%H7%yESwa?u%!V=nX$!BYm z*}&PGQ}31LS3>jvH!(@3Uvc59j)IFplTBGLC3E^`-k1;itD}CM%Osws9(3A|vYRyF zZiLj&0T~G_A|m_o@^7#D$G==S4a6ABrSpiQ$5mFFo2m5RxA_D1ahe{1LU@>B2ml!t@K+U?)skW6I^|=^$G<Z{D{V&qF2Q4jMT#b{u`+Nwc9!GC!Cu$XqhY>h{+7CajWzDU z{gPMLtK;np=lkZpQaNl$J&DCYtV)+V?Q>M`L?beqzFZOdY;jsrg~>D3`BR;*03Pn! z>;ke6A5er=#ZXiZ}fg^U5t-GNXYAk+B`d)lt+YTEHJU`t9(eR;d<%(lk zvJA=OaGmAvLk?(QGP8vC6EbljFJmFm%fHu~Vm-%o-{MmGsij7rFp66yN~u57yN6n! zqc-ehYQLhnznIW-tpv~a&JI_Xe;5qsZ%XQ+QZ}xf`p&GNw_h04h3~<>2L;~Ik*LiB zV#c$tiwTtT;CYXxln4g=S-x+D3($qy3&yxdrLUjnh(Mke4qxze68jZEO<>u85Cg!^ z*F`;f2(swe5dOgP9qK4}z|#%B2njd{%V_M@@t#tdo>ti;M|J!Gwuk96F9lXqOM zNE{zT@Ilj`H<9U=*{po-CuC9Ij#E$=-VqhZPY|gH4w~=`LVPWOJJhF%iNrBiX%nZ? zb3IZx@Bb-DetK;rXn0?4wBRyPwyq(OtJtB8Ul*&w!gPiOIGW!Khtrs3%+TM$`-nq0uclvf%wdi|(JYy#S&?#_uEm}LtwC&L zyf0@jTV#IoPPS>( zU?q+27!J=TSGY6o2TK?{`kD2dv~kA0FF|<^>B7KaJRwY^TZZ%5v8usL1{zocp7#eP zT}CXXY`>tY+BtE7&)+CBiqegK5u^A>VbdZpl>SIpObQr!yra?{>*BceEZM4ZhG8XU zH-q;yM0waDnX!|?9yRcHbpxx1Zr155!|cy0sdl`=@~w;+)Q=r2+-#+<(5eo)$LL2B zTGbv?URs(_?r5N^Ek^tk%xiu~X(a>W*&fnMVz1IpVR&0D29;`us}vVF7}S=5kp+t1 zcv@F}J%XSa3}ekVvAHwbc)4G9`xY1OWXXMT!nd#D=a50ns2A&TU&87hq0yLO0)00_4S9{f)k6?FQ~=L`D#PnmzEm|s7mJ;?w7?QR12=3)G&G^jTZ^WXUf^f};gUgr;N3)y^W|e`bX8q#?#sh5EAYg3qU(p0p$Nat7h+O?W8A#*6ZSF@9F~Z z3kdUR-yQvT8U6nv!_VJzVSz%+kp5ebwx_kndsk<)8n1sfRrRXD0$SofY`3?x6t#49 z^YgH`weter|7VW&t(%*ZHLbjhB_})WKdts;@_7lm4B0 Date: Fri, 5 Jul 2024 14:43:29 +0200 Subject: [PATCH 14/85] feat: Add settings screen UI --- .../settings/SettingsScreenView.swift | 52 +++++++++++++++++-- resources/Localizable.xcstrings | 21 +++++++- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/demo-store-ios/features/settings/SettingsScreenView.swift b/demo-store-ios/features/settings/SettingsScreenView.swift index 3940c0d..a35acad 100644 --- a/demo-store-ios/features/settings/SettingsScreenView.swift +++ b/demo-store-ios/features/settings/SettingsScreenView.swift @@ -1,15 +1,57 @@ - import SwiftUI struct SettingsScreenView: View { + @State private var username: String = "" + var body: some View { NavigationView { - VStack { - Text("settings_tab_title") - .foregroundColor(.white) + VStack(spacing: 20) { + Text("settings_title") + .font(.title) + .font(.system(size: 24)) + .foregroundColor(.black) + + Text("settings_sub_title") + .font(.system(size: 18)) + .multilineTextAlignment(.center) + .foregroundColor(.black) + + VStack { + TextField("store_key_hint", text: $username) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .font(.system(size: 16)) + .frame(height: 55) +// .padding(.horizontal) + + Button(action: { + // Action to perform when the button is tapped + print("Button tapped") + }) { + Text("upload_button_title") + .foregroundColor(.white) + .padding() + .frame(height: 44) + .font(.system(size: 16)) + .frame(maxWidth: .infinity) + .background(Color.black) + .cornerRadius(10) + } + .buttonStyle(PlainButtonStyle()) + } + + Text("process_timeout_title") + .font(.system(size: 13)) + .foregroundColor(.gray) } + .padding() .navigationTitle("settings_tab_title") - .background(Color.black.edgesIgnoringSafeArea(.all)) + .background(Color.white.edgesIgnoringSafeArea(.all)) } } } + +struct SettingsScreenView_Previews: PreviewProvider { + static var previews: some View { + SettingsScreenView() + } +} diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 9c2cb81..90cf0f6 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -147,6 +147,17 @@ } } }, + "process_timeout_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "This process may take some time." + } + } + } + }, "processing_title" : { "extractionState" : "manual", "localizations" : { @@ -269,7 +280,15 @@ } }, "total_title" : { - "extractionState" : "manual" + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Total" + } + } + } }, "upload_button_title" : { "extractionState" : "manual", From 8f76cb33dd6a7b20b337e9b8aeee83cbaebe61ca Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 5 Jul 2024 19:24:30 +0200 Subject: [PATCH 15/85] feat: Add NavigationManager.swift, SettingsScreenView.swift, changing toolbar visibility for searching feature --- Info.plist | 14 ++++ Podfile | 8 +- Podfile.lock | 2 +- Pods/Manifest.lock | 2 +- Pods/Pods.xcodeproj/project.pbxproj | 2 + demo-store-ios.xcodeproj/project.pbxproj | 28 +++++-- demo-store-ios/AppDelegate.swift | 4 + demo-store-ios/ContentView.swift | 64 +++------------- demo-store-ios/Info.plist | 23 ++++++ .../settings/SettingsErrroScreenView.swift | 41 ++++++++++ .../settings/SettingsInputCodeView.swift | 56 ++++++++++++++ .../settings/SettingsScreenView.swift | 75 ++++++++++--------- demo-store-ios/mainSubView/ToolbarView.swift | 54 +++++++++++++ .../{utils => mainSubView}/UiUtils.swift | 0 demo-store-ios/navigation/BottomBarView.swift | 40 +++++----- .../navigation/NavigationManager.swift | 22 ++++++ resources/Localizable.xcstrings | 13 +--- 17 files changed, 315 insertions(+), 133 deletions(-) create mode 100644 Info.plist create mode 100644 demo-store-ios/Info.plist create mode 100644 demo-store-ios/features/settings/SettingsErrroScreenView.swift create mode 100644 demo-store-ios/features/settings/SettingsInputCodeView.swift create mode 100644 demo-store-ios/mainSubView/ToolbarView.swift rename demo-store-ios/{utils => mainSubView}/UiUtils.swift (100%) create mode 100644 demo-store-ios/navigation/NavigationManager.swift diff --git a/Info.plist b/Info.plist new file mode 100644 index 0000000..935565a --- /dev/null +++ b/Info.plist @@ -0,0 +1,14 @@ + + + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + + + diff --git a/Podfile b/Podfile index 873e67f..8de313e 100644 --- a/Podfile +++ b/Podfile @@ -4,7 +4,7 @@ target 'demo-store-ios' do use_frameworks! pod 'REES46', :git => 'https://github.com/rees46/ios-sdk.git', :branch => 'master', :tag => '3.6.19' - pod 'Swinject', '~> 2.8' +# pod 'Swinject', '~> 2.8' target 'demo-store-iosTests' do inherit! :search_paths @@ -16,3 +16,9 @@ target 'demo-store-ios' do end end + +post_install do |installer| + installer.pods_project.build_configurations.each do |config| + config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" + end +end diff --git a/Podfile.lock b/Podfile.lock index d3ba685..e5e2492 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -19,6 +19,6 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb -PODFILE CHECKSUM: cc0e8f2ccf8aa25af5cf4ba63af552191bd817d2 +PODFILE CHECKSUM: 904ef94ca4cc9c5fb28bf31df73479a3e0a72263 COCOAPODS: 1.15.2 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index d3ba685..e5e2492 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -19,6 +19,6 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb -PODFILE CHECKSUM: cc0e8f2ccf8aa25af5cf4ba63af552191bd817d2 +PODFILE CHECKSUM: 904ef94ca4cc9c5fb28bf31df73479a3e0a72263 COCOAPODS: 1.15.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index bd1cf68..986522b 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -1202,6 +1202,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1343,6 +1344,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 2a0121b..e080b10 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -12,6 +12,10 @@ 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; + 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */; }; + 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; + 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */; }; + 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4282C38593800AAC175 /* ToolbarView.swift */; }; 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* DemoStoreApp.swift */; }; 75B935592C3564360063E814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; @@ -52,6 +56,11 @@ 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.swift; sourceTree = ""; }; + 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrroScreenView.swift; sourceTree = ""; }; + 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationManager.swift; sourceTree = ""; }; + 75A3F4282C38593800AAC175 /* ToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarView.swift; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935562C3564360063E814 /* DemoStoreApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.swift; sourceTree = ""; }; 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -133,11 +142,12 @@ path = main; sourceTree = ""; }; - 755944A32C35883F00C274C9 /* utils */ = { + 755944A32C35883F00C274C9 /* mainSubView */ = { isa = PBXGroup; children = ( + 75A3F4282C38593800AAC175 /* ToolbarView.swift */, ); - path = utils; + path = mainSubView; sourceTree = ""; }; 75B9354A2C3564360063E814 = { @@ -166,9 +176,10 @@ 75B935552C3564360063E814 /* demo-store-ios */ = { isa = PBXGroup; children = ( + 75A3F4212C3828A400AAC175 /* Info.plist */, 75ECCD1B2C37F09100D6D346 /* di */, 75ECCD182C36F92A00D6D346 /* navigation */, - 755944A32C35883F00C274C9 /* utils */, + 755944A32C35883F00C274C9 /* mainSubView */, 7559449C2C357E1800C274C9 /* features */, 75B935562C3564360063E814 /* DemoStoreApp.swift */, 75A3F41D2C38065000AAC175 /* AppDelegate.swift */, @@ -224,6 +235,8 @@ isa = PBXGroup; children = ( 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */, + 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */, + 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */, ); path = settings; sourceTree = ""; @@ -240,6 +253,7 @@ isa = PBXGroup; children = ( 75ECCD192C36F94800D6D346 /* BottomBarView.swift */, + 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */, ); path = navigation; sourceTree = ""; @@ -513,15 +527,19 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */, 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, + 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */, 75B935592C3564360063E814 /* ContentView.swift in Sources */, 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, + 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, + 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -689,7 +707,7 @@ DEVELOPMENT_ASSET_PATHS = "\"demo-store-ios/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = "Demo store"; + INFOPLIST_FILE = "demo-store-ios/Info.plist"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -719,7 +737,7 @@ DEVELOPMENT_ASSET_PATHS = "\"demo-store-ios/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_CFBundleDisplayName = "Demo store"; + INFOPLIST_FILE = "demo-store-ios/Info.plist"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; diff --git a/demo-store-ios/AppDelegate.swift b/demo-store-ios/AppDelegate.swift index eea547a..a0395d4 100644 --- a/demo-store-ios/AppDelegate.swift +++ b/demo-store-ios/AppDelegate.swift @@ -34,6 +34,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate { print("SDK Initialization succeeded") } } +#if DEBUG + print("SDK Session Initialization result: \(sdk?.getSession() ?? "No session")") +#endif + } func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { diff --git a/demo-store-ios/ContentView.swift b/demo-store-ios/ContentView.swift index 21f737b..bb94cb0 100644 --- a/demo-store-ios/ContentView.swift +++ b/demo-store-ios/ContentView.swift @@ -1,72 +1,26 @@ -import SwiftUI -import Combine - import SwiftUI struct ContentView: View { - @StateObject var tabSelection = TabSelection() + @StateObject var navigationManager = NavigationManager() var body: some View { ZStack { - Color.black.edgesIgnoringSafeArea(.top) + Color.black.edgesIgnoringSafeArea(.all) VStack(spacing: 0) { - ToolbarView(tabSelection: tabSelection) + ToolbarView() - BottomBarView(tabSelection: tabSelection) + navigationManager.currentScreen .edgesIgnoringSafeArea(.bottom) + + BottomBarView() + .environmentObject(navigationManager) + .frame(height: 70) } } .background(Color.white.edgesIgnoringSafeArea(.all)) .statusBar(hidden: false) - } -} - -struct ToolbarView: View { - @ObservedObject var tabSelection: TabSelection - - var body: some View { - VStack { - ZStack { - Color.black - Image("ToolbarLogo") - .resizable() - .aspectRatio(contentMode: .fit) - .padding(.vertical, 10) - .foregroundColor(.white) - } - .frame(height: 50) - - HStack(spacing: 20) { - - Image("MenuIcon") - .resizable() - .renderingMode(.template) - .frame(width: 24, height: 24) - .foregroundColor(.black) - .padding(.leading, 12) - - Spacer() - - Image("SearchIcon") - .resizable() - .renderingMode(.template) - .frame(width: 30, height: 30) - .foregroundColor(.black) - - Image("CartIcon") - .resizable() - .renderingMode(.template) - .frame(width: 30, height: 30) - .foregroundColor(.black) - .padding(.trailing, 12) - .onTapGesture { - tabSelection.selectedTabIndex = 2 - } - } - .frame(height: 50) - } - .background(Color.white) + .environmentObject(navigationManager) } } diff --git a/demo-store-ios/Info.plist b/demo-store-ios/Info.plist new file mode 100644 index 0000000..f72471e --- /dev/null +++ b/demo-store-ios/Info.plist @@ -0,0 +1,23 @@ + + + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + + UIRequiresPersistentWiFi + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + + + + diff --git a/demo-store-ios/features/settings/SettingsErrroScreenView.swift b/demo-store-ios/features/settings/SettingsErrroScreenView.swift new file mode 100644 index 0000000..7f03c5f --- /dev/null +++ b/demo-store-ios/features/settings/SettingsErrroScreenView.swift @@ -0,0 +1,41 @@ + +import SwiftUI + +struct SettingsErrroScreenView: View { + let retryAction: () -> Void + + var body: some View { + VStack { + Text("default_error_title") + .font(.system(size: 32)) + .multilineTextAlignment(.center) + .foregroundColor(.black) + .font(Font.footnote.weight(.bold)) + + Text("default_error_sub_title") + .font(.system(size: 18)) + .padding(.vertical,20) + .padding(.horizontal,16) + .multilineTextAlignment(.center) + .foregroundColor(.black) + + Button(action: retryAction) { + Text("go_home_button") + .foregroundColor(.white) + .frame(height: 44) + .frame(maxWidth: .infinity) + .background(Color.black) + .cornerRadius(10) + } + .padding(.horizontal) + } + } +} + +struct SettingsInputCodeError_preview: PreviewProvider { + static var previews: some View { + SettingsErrroScreenView(){ + + } + } +} diff --git a/demo-store-ios/features/settings/SettingsInputCodeView.swift b/demo-store-ios/features/settings/SettingsInputCodeView.swift new file mode 100644 index 0000000..735b57e --- /dev/null +++ b/demo-store-ios/features/settings/SettingsInputCodeView.swift @@ -0,0 +1,56 @@ +import SwiftUI + +struct SettingsInputCodeView: View { + + @Binding var storeKey: String + @EnvironmentObject var navigationManager: NavigationManager + + var body: some View { + VStack(spacing: 20) { + Text("settings_title") + .font(.title) + .font(.system(size: 24)) + .foregroundColor(.black) + + Text("settings_sub_title") + .font(.system(size: 18)) + .multilineTextAlignment(.center) + .foregroundColor(.black) + + VStack { + TextField("store_key_hint", text: $storeKey) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .font(.system(size: 16)) + .frame(height: 55) + + Button( + action: { + // TODO Add uploading code click + print("Button tapped") + } + ) { + Text("upload_button_title") + .foregroundColor(.white) + .padding() + .frame(height: 44) + .font(.system(size: 16)) + .frame(maxWidth: .infinity) + .background(Color.black) + .cornerRadius(10) + } + .buttonStyle(PlainButtonStyle()) + } + + Text("process_timeout_title") + .font(.system(size: 13)) + .foregroundColor(.gray) + } + .padding() + } +} + +struct SettingsInputCode_preview: PreviewProvider { + static var previews: some View { + SettingsInputCodeView(storeKey: .constant("Some key")) + } +} diff --git a/demo-store-ios/features/settings/SettingsScreenView.swift b/demo-store-ios/features/settings/SettingsScreenView.swift index a35acad..b6eb73f 100644 --- a/demo-store-ios/features/settings/SettingsScreenView.swift +++ b/demo-store-ios/features/settings/SettingsScreenView.swift @@ -1,53 +1,58 @@ import SwiftUI +enum ViewState { + case loading + case error(String) + case data +} + struct SettingsScreenView: View { - @State private var username: String = "" + + @EnvironmentObject var navigationManager: NavigationManager + + @State private var storeKey: String = "" + @State private var viewState: ViewState = .loading var body: some View { NavigationView { - VStack(spacing: 20) { - Text("settings_title") - .font(.title) - .font(.system(size: 24)) - .foregroundColor(.black) - - Text("settings_sub_title") - .font(.system(size: 18)) - .multilineTextAlignment(.center) - .foregroundColor(.black) - - VStack { - TextField("store_key_hint", text: $username) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .font(.system(size: 16)) - .frame(height: 55) -// .padding(.horizontal) + VStack { + switch viewState { + case .loading: + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .onAppear { + // Start a timer to simulate loading + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + loadData() + } + } - Button(action: { - // Action to perform when the button is tapped - print("Button tapped") - }) { - Text("upload_button_title") - .foregroundColor(.white) - .padding() - .frame(height: 44) - .font(.system(size: 16)) - .frame(maxWidth: .infinity) - .background(Color.black) - .cornerRadius(10) + case .error: + SettingsErrroScreenView() { + navigationManager.navigateTo(screen: AnyView(MainScreenView())) } - .buttonStyle(PlainButtonStyle()) + + case .data: + SettingsInputCodeView(storeKey: $storeKey) } - - Text("process_timeout_title") - .font(.system(size: 13)) - .foregroundColor(.gray) } .padding() .navigationTitle("settings_tab_title") .background(Color.white.edgesIgnoringSafeArea(.all)) } } + + private func loadData() { + // Simulate data loading + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + let success = Bool.random() + if success { + viewState = .data + } else { + viewState = .error("Failed to load data") + } + } + } } struct SettingsScreenView_Previews: PreviewProvider { diff --git a/demo-store-ios/mainSubView/ToolbarView.swift b/demo-store-ios/mainSubView/ToolbarView.swift new file mode 100644 index 0000000..48c34ca --- /dev/null +++ b/demo-store-ios/mainSubView/ToolbarView.swift @@ -0,0 +1,54 @@ +import SwiftUI +import Combine + +protocol ToolbarConfigurable { + var isToolbarHidden: Bool { get } +} + +struct ToolbarView: View { + @EnvironmentObject var navigationManager: NavigationManager + + var body: some View { + VStack { + ZStack { + Color.black + Image("ToolbarLogo") + .resizable() + .aspectRatio(contentMode: .fit) + .padding(.vertical, 10) + .foregroundColor(.white) + } + .frame(height: 50) + + HStack(spacing: 20) { + + Image("MenuIcon") + .resizable() + .renderingMode(.template) + .frame(width: 24, height: 24) + .foregroundColor(.black) + .padding(.leading, 12) + + Spacer() + + Image("SearchIcon") + .resizable() + .renderingMode(.template) + .frame(width: 30, height: 30) + .foregroundColor(.black) + + Image("CartIcon") + .resizable() + .renderingMode(.template) + .frame(width: 30, height: 30) + .foregroundColor(.black) + .padding(.trailing, 12) + .onTapGesture { + navigationManager.navigateTo(screen: AnyView(CartScreenView())) + } + } + .frame(height: 50) + } + .background(Color.white) + } +} diff --git a/demo-store-ios/utils/UiUtils.swift b/demo-store-ios/mainSubView/UiUtils.swift similarity index 100% rename from demo-store-ios/utils/UiUtils.swift rename to demo-store-ios/mainSubView/UiUtils.swift diff --git a/demo-store-ios/navigation/BottomBarView.swift b/demo-store-ios/navigation/BottomBarView.swift index 7b1f0b7..460d2ca 100644 --- a/demo-store-ios/navigation/BottomBarView.swift +++ b/demo-store-ios/navigation/BottomBarView.swift @@ -1,48 +1,42 @@ import SwiftUI import Combine -class TabSelection: ObservableObject { - @Published var selectedTabIndex = 0 -} - struct BottomBarView: View { - @ObservedObject var tabSelection: TabSelection + @EnvironmentObject var navigationManager: NavigationManager var body: some View { VStack { - switch tabSelection.selectedTabIndex { - case 0: MainScreenView() - case 1: CatalogScreenView() - case 2: CartScreenView() - case 3: SettingsScreenView() - default: MainScreenView() - } - Spacer() HStack { - TabBarButton(image: "MainTab", isSelected: tabSelection.selectedTabIndex == 0) - .onTapGesture { tabSelection.selectedTabIndex = 0 } + TabBarButton(image: "MainTab", isSelected: navigationManager.currentScreenType == MainScreenView.self) + .onTapGesture { + navigationManager.navigateTo(screen: AnyView(MainScreenView())) + } .padding(.leading, 20) Spacer() - TabBarButton(image: "CatalogTab", isSelected: tabSelection.selectedTabIndex == 1) - .onTapGesture { tabSelection.selectedTabIndex = 1 } + TabBarButton(image: "CatalogTab", isSelected: navigationManager.currentScreenType == CatalogScreenView.self) + .onTapGesture { + navigationManager.navigateTo(screen: AnyView(CatalogScreenView())) + } Spacer() - TabBarButton(image: "CartTab", isSelected: tabSelection.selectedTabIndex == 2) - .onTapGesture { tabSelection.selectedTabIndex = 2 } + TabBarButton(image: "CartTab", isSelected: navigationManager.currentScreenType == CartScreenView.self) + .onTapGesture { + navigationManager.navigateTo(screen: AnyView(CartScreenView())) + } Spacer() - TabBarButton(image: "SettingsTab", isSelected: tabSelection.selectedTabIndex == 3) - .onTapGesture { tabSelection.selectedTabIndex = 3 } + TabBarButton(image: "SettingsTab", isSelected: navigationManager.currentScreenType == SettingsScreenView.self) + .onTapGesture { + navigationManager.navigateTo(screen: AnyView(SettingsScreenView())) + } .padding(.trailing, 20) } - .frame(height: 70) - .background(Color.black) } } } diff --git a/demo-store-ios/navigation/NavigationManager.swift b/demo-store-ios/navigation/NavigationManager.swift new file mode 100644 index 0000000..ffe906e --- /dev/null +++ b/demo-store-ios/navigation/NavigationManager.swift @@ -0,0 +1,22 @@ +import SwiftUI +import Combine + +class NavigationManager: ObservableObject { + @Published var currentScreen: AnyView + @Published var isToolbarHidden: Bool = false + @Published var currentScreenType: Any.Type + + init() { + self.currentScreen = AnyView(MainScreenView()) + self.currentScreenType = MainScreenView.self + } + + func navigateTo(screen: Content) { + self.currentScreen = AnyView(screen) + self.currentScreenType = type(of: screen) + } + + func navigateBack() { + // Implement navigation back logic if needed + } +} diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 90cf0f6..6b2eeda 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -84,7 +84,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Something went wrong." + "value" : "Something\\nwent wrong." } } } @@ -158,17 +158,6 @@ } } }, - "processing_title" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Page not found." - } - } - } - }, "reccomender_title" : { "extractionState" : "manual", "localizations" : { From beb14f3176c14d1fee92f0b317deea65d92b127c Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 5 Jul 2024 19:37:44 +0200 Subject: [PATCH 16/85] feat: Handling visibility toolbar block --- .../features/main/MainScreenView.swift | 8 ++- demo-store-ios/mainSubView/ToolbarView.swift | 58 ++++++++++--------- .../navigation/NavigationManager.swift | 4 ++ 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/demo-store-ios/features/main/MainScreenView.swift b/demo-store-ios/features/main/MainScreenView.swift index f0b1bec..67ee6cb 100644 --- a/demo-store-ios/features/main/MainScreenView.swift +++ b/demo-store-ios/features/main/MainScreenView.swift @@ -1,7 +1,8 @@ - import SwiftUI struct MainScreenView: View { + @EnvironmentObject var navigationManager: NavigationManager + var body: some View { NavigationView { VStack { @@ -9,7 +10,10 @@ struct MainScreenView: View { .foregroundColor(.white) } .navigationTitle("main_tab_title") - .background(Color.black.edgesIgnoringSafeArea(.all)) + .background(Color.black.edgesIgnoringSafeArea(.all)) + .onAppear { + navigationManager.setToolbarHidden(hidden: false) + } } } } diff --git a/demo-store-ios/mainSubView/ToolbarView.swift b/demo-store-ios/mainSubView/ToolbarView.swift index 48c34ca..e04ad4b 100644 --- a/demo-store-ios/mainSubView/ToolbarView.swift +++ b/demo-store-ios/mainSubView/ToolbarView.swift @@ -19,35 +19,37 @@ struct ToolbarView: View { .foregroundColor(.white) } .frame(height: 50) - - HStack(spacing: 20) { - - Image("MenuIcon") - .resizable() - .renderingMode(.template) - .frame(width: 24, height: 24) - .foregroundColor(.black) - .padding(.leading, 12) - - Spacer() - - Image("SearchIcon") - .resizable() - .renderingMode(.template) - .frame(width: 30, height: 30) - .foregroundColor(.black) - - Image("CartIcon") - .resizable() - .renderingMode(.template) - .frame(width: 30, height: 30) - .foregroundColor(.black) - .padding(.trailing, 12) - .onTapGesture { - navigationManager.navigateTo(screen: AnyView(CartScreenView())) - } + if !navigationManager.isToolbarHidden { + HStack(spacing: 20) { + + Image("MenuIcon") + .resizable() + .renderingMode(.template) + .frame(width: 24, height: 24) + .foregroundColor(.black) + .padding(.leading, 12) + + Spacer() + + Image("SearchIcon") + .resizable() + .renderingMode(.template) + .frame(width: 30, height: 30) + .foregroundColor(.black) + + Image("CartIcon") + .resizable() + .renderingMode(.template) + .frame(width: 30, height: 30) + .foregroundColor(.black) + .padding(.trailing, 12) + .onTapGesture { + navigationManager.navigateTo(screen: AnyView(CartScreenView())) + } + } + .frame(height: 50) } - .frame(height: 50) + } .background(Color.white) } diff --git a/demo-store-ios/navigation/NavigationManager.swift b/demo-store-ios/navigation/NavigationManager.swift index ffe906e..b0a232e 100644 --- a/demo-store-ios/navigation/NavigationManager.swift +++ b/demo-store-ios/navigation/NavigationManager.swift @@ -16,6 +16,10 @@ class NavigationManager: ObservableObject { self.currentScreenType = type(of: screen) } + func setToolbarHidden(hidden: Bool) { + self.isToolbarHidden = hidden + } + func navigateBack() { // Implement navigation back logic if needed } From 912aec4f5d7d8bbfd108466c3f711f05ee2ea6a4 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 8 Jul 2024 15:02:25 +0200 Subject: [PATCH 17/85] feat: Add discover list --- demo-store-ios.xcodeproj/project.pbxproj | 4 ++ .../features/main/MainDiscoverView.swift | 49 +++++++++++++++++++ .../features/main/MainScreenView.swift | 20 ++++++-- 3 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 demo-store-ios/features/main/MainDiscoverView.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index e080b10..666b94d 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 748A7C58839E67C62D21DB52 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; + 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */; }; 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; @@ -55,6 +56,7 @@ 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; + 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.swift; sourceTree = ""; }; @@ -138,6 +140,7 @@ isa = PBXGroup; children = ( 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */, + 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */, ); path = main; sourceTree = ""; @@ -528,6 +531,7 @@ buildActionMask = 2147483647; files = ( 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, + 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */, 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, diff --git a/demo-store-ios/features/main/MainDiscoverView.swift b/demo-store-ios/features/main/MainDiscoverView.swift new file mode 100644 index 0000000..7cb1f62 --- /dev/null +++ b/demo-store-ios/features/main/MainDiscoverView.swift @@ -0,0 +1,49 @@ +import SwiftUI + +struct MainDiscoverView: View { + var body: some View { + VStack { + Text("main_tab_title") + .foregroundColor(.white) + + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 8) { + ForEach(0..<10) { index in + VStack { + Image(systemName: "photo") + .resizable() + .frame(width: 140, height: 180) + .cornerRadius(8) + .overlay( + VStack(alignment: .leading, spacing: 4) { + Spacer() + Text("Title") + .font(.system(size: 18)) + .foregroundColor(.white) + HStack { + Text("Subtitle 1") + .font(.system(size: 12)) + .foregroundColor(.white) + Text("Subtitle 2") + .font(.system(size: 12)) + .foregroundColor(.white) + } + } + .padding(8) + .cornerRadius(8) + ) + } + } + } + .padding(.horizontal, 8) + } + .frame(height: 180) + } + } +} + +struct MainDiscoverView_Previews: PreviewProvider { + static var previews: some View { + MainDiscoverView() + } +} diff --git a/demo-store-ios/features/main/MainScreenView.swift b/demo-store-ios/features/main/MainScreenView.swift index 67ee6cb..a6afb56 100644 --- a/demo-store-ios/features/main/MainScreenView.swift +++ b/demo-store-ios/features/main/MainScreenView.swift @@ -2,18 +2,28 @@ import SwiftUI struct MainScreenView: View { @EnvironmentObject var navigationManager: NavigationManager - + var body: some View { NavigationView { - VStack { - Text("main_tab_title") - .foregroundColor(.white) + ScrollView { + VStack(spacing: 16) { + ForEach(0..<1) { _ in + MainDiscoverView() + } + } + .padding(.vertical, 16) } .navigationTitle("main_tab_title") - .background(Color.black.edgesIgnoringSafeArea(.all)) .onAppear { navigationManager.setToolbarHidden(hidden: false) } } } } + +struct MainScreenView_Previews: PreviewProvider { + static var previews: some View { + MainScreenView() + .environmentObject(NavigationManager()) + } +} From e8209a309f8cfa6f7531b45b79e7622956e50d13 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 9 Jul 2024 10:12:00 +0200 Subject: [PATCH 18/85] feat: Add discover and stories views --- .idea/other.xml | 263 ++++++++++++++++++ demo-store-ios.xcodeproj/project.pbxproj | 4 + demo-store-ios/AppDelegate.swift | 31 ++- demo-store-ios/ContentView.swift | 4 +- demo-store-ios/DemoStoreApp.swift | 4 +- .../features/main/MainDiscoverView.swift | 3 +- .../features/main/MainScreenView.swift | 9 +- .../main/MainStoriesContainerView.swift | 24 ++ demo-store-ios/mainSubView/ToolbarView.swift | 1 - resources/Localizable.xcstrings | 12 + 10 files changed, 333 insertions(+), 22 deletions(-) create mode 100644 .idea/other.xml create mode 100644 demo-store-ios/features/main/MainStoriesContainerView.swift diff --git a/.idea/other.xml b/.idea/other.xml new file mode 100644 index 0000000..0d3a1fb --- /dev/null +++ b/.idea/other.xml @@ -0,0 +1,263 @@ + + + + + + \ No newline at end of file diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 666b94d..5f8cafa 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; + 75674CDE2C3C4292007FAB88 /* MainStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */; }; 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; @@ -57,6 +58,7 @@ 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; + 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainStoriesContainerView.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.swift; sourceTree = ""; }; @@ -141,6 +143,7 @@ children = ( 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */, 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */, + 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */, ); path = main; sourceTree = ""; @@ -535,6 +538,7 @@ 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, + 75674CDE2C3C4292007FAB88 /* MainStoriesContainerView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */, 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */, diff --git a/demo-store-ios/AppDelegate.swift b/demo-store-ios/AppDelegate.swift index a0395d4..84b1981 100644 --- a/demo-store-ios/AppDelegate.swift +++ b/demo-store-ios/AppDelegate.swift @@ -2,9 +2,9 @@ import UIKit import REES46 class AppDelegate: UIResponder, UIApplicationDelegate { - + var window: UIWindow? - + private let SHOP_ID = "357382bf66ac0ce2f1722677c59511" private let API_DOMAIN = "https://api.rees46.ru/" private let USER_EMAIL: String? = nil @@ -16,6 +16,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate { private let NOTIFICATION_ID = "DEMO NOTIFICATION ID" var sdk: PersonalizationSDK? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + // Initialize SDK + initializeSDK() + + return true + } func initializeSDK() { sdk = createPersonalizationSDK( @@ -29,19 +37,18 @@ class AppDelegate: UIResponder, UIApplicationDelegate { autoSendPushToken: true ) { error in if let error = error { - print("SDK Initialization failed: \(error.description)") + print("SDK Initialization failed: \(error.localizedDescription)") + // Handle the initialization failure appropriately + // For example, retry initialization or show an error message } else { print("SDK Initialization succeeded") + // SDK is initialized, you can access its session or perform other actions + if let sessionId = self.sdk?.getSession() { + print("SDK Session ID: \(sessionId)") + } else { + print("Failed to retrieve SDK session ID") + } } } -#if DEBUG - print("SDK Session Initialization result: \(sdk?.getSession() ?? "No session")") -#endif - - } - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - initializeSDK() - return true } } diff --git a/demo-store-ios/ContentView.swift b/demo-store-ios/ContentView.swift index bb94cb0..0c1c6dc 100644 --- a/demo-store-ios/ContentView.swift +++ b/demo-store-ios/ContentView.swift @@ -1,8 +1,9 @@ import SwiftUI +import REES46 struct ContentView: View { @StateObject var navigationManager = NavigationManager() - + var body: some View { ZStack { Color.black.edgesIgnoringSafeArea(.all) @@ -11,6 +12,7 @@ struct ContentView: View { ToolbarView() navigationManager.currentScreen + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) .edgesIgnoringSafeArea(.bottom) BottomBarView() diff --git a/demo-store-ios/DemoStoreApp.swift b/demo-store-ios/DemoStoreApp.swift index 142e2fb..a9b223c 100644 --- a/demo-store-ios/DemoStoreApp.swift +++ b/demo-store-ios/DemoStoreApp.swift @@ -2,8 +2,7 @@ import SwiftUI @main struct DemoStoreApp: App { - - @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate + @StateObject private var diContainer = DIContainer() @State private var showSplash = true @@ -21,6 +20,7 @@ struct DemoStoreApp: App { } } else { ContentView() + .environmentObject(diContainer) } } } diff --git a/demo-store-ios/features/main/MainDiscoverView.swift b/demo-store-ios/features/main/MainDiscoverView.swift index 7cb1f62..8f2b457 100644 --- a/demo-store-ios/features/main/MainDiscoverView.swift +++ b/demo-store-ios/features/main/MainDiscoverView.swift @@ -12,7 +12,7 @@ struct MainDiscoverView: View { VStack { Image(systemName: "photo") .resizable() - .frame(width: 140, height: 180) + .frame(width: 140, height: 160) .cornerRadius(8) .overlay( VStack(alignment: .leading, spacing: 4) { @@ -37,7 +37,6 @@ struct MainDiscoverView: View { } .padding(.horizontal, 8) } - .frame(height: 180) } } } diff --git a/demo-store-ios/features/main/MainScreenView.swift b/demo-store-ios/features/main/MainScreenView.swift index a6afb56..efa40b1 100644 --- a/demo-store-ios/features/main/MainScreenView.swift +++ b/demo-store-ios/features/main/MainScreenView.swift @@ -1,17 +1,18 @@ import SwiftUI +import REES46 struct MainScreenView: View { @EnvironmentObject var navigationManager: NavigationManager - + var body: some View { NavigationView { ScrollView { VStack(spacing: 16) { - ForEach(0..<1) { _ in - MainDiscoverView() - } + MainDiscoverView() + MainStoriesContainerView() } .padding(.vertical, 16) + .frame(maxWidth: .infinity, alignment: .top) } .navigationTitle("main_tab_title") .onAppear { diff --git a/demo-store-ios/features/main/MainStoriesContainerView.swift b/demo-store-ios/features/main/MainStoriesContainerView.swift new file mode 100644 index 0000000..f13ac6b --- /dev/null +++ b/demo-store-ios/features/main/MainStoriesContainerView.swift @@ -0,0 +1,24 @@ +import SwiftUI +import UIKit +import REES46 + +struct MainStoriesContainerView: View { + + var body: some View { + VStack(alignment: .leading, spacing: 16) { + Text("Stories") + .font(.title) + .foregroundColor(.black) + .padding(.horizontal) + + .padding(.horizontal) + .padding(.bottom, 16) + } + } +} + +struct MainStoriesContainerView_Previews: PreviewProvider { + static var previews: some View { + MainStoriesContainerView() + } +} diff --git a/demo-store-ios/mainSubView/ToolbarView.swift b/demo-store-ios/mainSubView/ToolbarView.swift index e04ad4b..4d69de7 100644 --- a/demo-store-ios/mainSubView/ToolbarView.swift +++ b/demo-store-ios/mainSubView/ToolbarView.swift @@ -47,7 +47,6 @@ struct ToolbarView: View { navigationManager.navigateTo(screen: AnyView(CartScreenView())) } } - .frame(height: 50) } } diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 6b2eeda..d9bb9a8 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -245,6 +245,9 @@ } } } + }, + "Stories" : { + }, "stories_title" : { "extractionState" : "manual", @@ -256,6 +259,15 @@ } } } + }, + "Subtitle 1" : { + + }, + "Subtitle 2" : { + + }, + "Title" : { + }, "top_trend_title" : { "extractionState" : "manual", From ea0073b500cc7d09109dbf9bc17fd970384a2591 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 9 Jul 2024 11:28:39 +0200 Subject: [PATCH 19/85] feat: Add stories representable for showing stories --- demo-store-ios.xcodeproj/project.pbxproj | 48 ++++++++++++++++- demo-store-ios/DemoStoreApp.swift | 4 +- demo-store-ios/di/SdkManager.swift | 44 ++++++++++++++++ .../{ => discover}/MainDiscoverView.swift | 0 .../MainStoriesContainerView.swift | 10 ++-- .../controller/StoriesViewController.swift | 51 +++++++++++++++++++ demo-store-ios/viewModel/SdkViewModel.swift | 16 ++++++ 7 files changed, 164 insertions(+), 9 deletions(-) create mode 100644 demo-store-ios/di/SdkManager.swift rename demo-store-ios/features/main/{ => discover}/MainDiscoverView.swift (100%) rename demo-store-ios/features/main/{ => stories}/MainStoriesContainerView.swift (67%) create mode 100644 demo-store-ios/features/main/stories/controller/StoriesViewController.swift create mode 100644 demo-store-ios/viewModel/SdkViewModel.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 5f8cafa..91f1d46 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -13,6 +13,9 @@ 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; 75674CDE2C3C4292007FAB88 /* MainStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */; }; + 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE52C3D295F007FAB88 /* SdkManager.swift */; }; + 75674CE82C3D299A007FAB88 /* SdkViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */; }; + 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */; }; 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; @@ -59,6 +62,9 @@ 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainStoriesContainerView.swift; sourceTree = ""; }; + 75674CE52C3D295F007FAB88 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; + 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkViewModel.swift; sourceTree = ""; }; + 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.swift; sourceTree = ""; }; @@ -141,9 +147,9 @@ 755944A22C35858C00C274C9 /* main */ = { isa = PBXGroup; children = ( + 75674CEC2C3D2E45007FAB88 /* discover */, + 75674CEA2C3D2E32007FAB88 /* stories */, 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */, - 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */, - 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */, ); path = main; sourceTree = ""; @@ -156,6 +162,39 @@ path = mainSubView; sourceTree = ""; }; + 75674CE92C3D29BF007FAB88 /* viewModel */ = { + isa = PBXGroup; + children = ( + 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */, + ); + path = viewModel; + sourceTree = ""; + }; + 75674CEA2C3D2E32007FAB88 /* stories */ = { + isa = PBXGroup; + children = ( + 75674CED2C3D39E8007FAB88 /* controller */, + 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */, + ); + path = stories; + sourceTree = ""; + }; + 75674CEC2C3D2E45007FAB88 /* discover */ = { + isa = PBXGroup; + children = ( + 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */, + ); + path = discover; + sourceTree = ""; + }; + 75674CED2C3D39E8007FAB88 /* controller */ = { + isa = PBXGroup; + children = ( + 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */, + ); + path = controller; + sourceTree = ""; + }; 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( @@ -183,6 +222,7 @@ isa = PBXGroup; children = ( 75A3F4212C3828A400AAC175 /* Info.plist */, + 75674CE92C3D29BF007FAB88 /* viewModel */, 75ECCD1B2C37F09100D6D346 /* di */, 75ECCD182C36F92A00D6D346 /* navigation */, 755944A32C35883F00C274C9 /* mainSubView */, @@ -267,6 +307,7 @@ 75ECCD1B2C37F09100D6D346 /* di */ = { isa = PBXGroup; children = ( + 75674CE52C3D295F007FAB88 /* SdkManager.swift */, ); path = di; sourceTree = ""; @@ -533,10 +574,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */, 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */, 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, + 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, 75674CDE2C3C4292007FAB88 /* MainStoriesContainerView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */, @@ -545,6 +588,7 @@ 75B935592C3564360063E814 /* ContentView.swift in Sources */, 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, + 75674CE82C3D299A007FAB88 /* SdkViewModel.swift in Sources */, 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, diff --git a/demo-store-ios/DemoStoreApp.swift b/demo-store-ios/DemoStoreApp.swift index a9b223c..0c61b01 100644 --- a/demo-store-ios/DemoStoreApp.swift +++ b/demo-store-ios/DemoStoreApp.swift @@ -2,7 +2,7 @@ import SwiftUI @main struct DemoStoreApp: App { - @StateObject private var diContainer = DIContainer() + @StateObject private var sdkViewModel = SDKViewModel() @State private var showSplash = true @@ -20,7 +20,7 @@ struct DemoStoreApp: App { } } else { ContentView() - .environmentObject(diContainer) + .environmentObject(sdkViewModel) } } } diff --git a/demo-store-ios/di/SdkManager.swift b/demo-store-ios/di/SdkManager.swift new file mode 100644 index 0000000..3cc39d9 --- /dev/null +++ b/demo-store-ios/di/SdkManager.swift @@ -0,0 +1,44 @@ +import REES46 + +class SDKManager { + static let shared = SDKManager() + + var sdk: PersonalizationSDK? + + private init() { + initializeSDK() + } + + private let SHOP_ID = "357382bf66ac0ce2f1722677c59511" + private let API_DOMAIN = "api.rees46.ru" + private let USER_EMAIL: String? = nil + private let USER_PHONE: String? = nil + private let USER_LOYALTY_ID: String? = nil + private let SDK_STREAM = "ios" + private let NOTIFICATION_TYPE = "DEMO NOTIFICATION TYPE" + private let NOTIFICATION_ID = "DEMO NOTIFICATION ID" + + private func initializeSDK() { + sdk = createPersonalizationSDK( + shopId: SHOP_ID, + userEmail: USER_EMAIL, + userPhone: USER_PHONE, + userLoyaltyId: USER_LOYALTY_ID, + apiDomain: API_DOMAIN, + stream: SDK_STREAM, + enableLogs: true, + autoSendPushToken: true + ) { error in + if let error = error { + print("SDK Initialization failed: \(error.localizedDescription)") + } else { + print("SDK Initialization succeeded") + if let sessionId = self.sdk?.getSession() { + print("SDK Session ID: \(sessionId)") + } else { + print("Failed to retrieve SDK session ID") + } + } + } + } +} diff --git a/demo-store-ios/features/main/MainDiscoverView.swift b/demo-store-ios/features/main/discover/MainDiscoverView.swift similarity index 100% rename from demo-store-ios/features/main/MainDiscoverView.swift rename to demo-store-ios/features/main/discover/MainDiscoverView.swift diff --git a/demo-store-ios/features/main/MainStoriesContainerView.swift b/demo-store-ios/features/main/stories/MainStoriesContainerView.swift similarity index 67% rename from demo-store-ios/features/main/MainStoriesContainerView.swift rename to demo-store-ios/features/main/stories/MainStoriesContainerView.swift index f13ac6b..5950e49 100644 --- a/demo-store-ios/features/main/MainStoriesContainerView.swift +++ b/demo-store-ios/features/main/stories/MainStoriesContainerView.swift @@ -1,19 +1,19 @@ import SwiftUI import UIKit -import REES46 struct MainStoriesContainerView: View { - var body: some View { VStack(alignment: .leading, spacing: 16) { Text("Stories") - .font(.title) + .font(.system(size: 24)) .foregroundColor(.black) .padding(.horizontal) + .padding(.top, 32) - .padding(.horizontal) - .padding(.bottom, 16) + StoriesViewControllerRepresentable() + .frame(height: 200) } + .environmentObject(SDKViewModel()) } } diff --git a/demo-store-ios/features/main/stories/controller/StoriesViewController.swift b/demo-store-ios/features/main/stories/controller/StoriesViewController.swift new file mode 100644 index 0000000..f94b88a --- /dev/null +++ b/demo-store-ios/features/main/stories/controller/StoriesViewController.swift @@ -0,0 +1,51 @@ +import SwiftUI +import UIKit +import REES46 + +class StoriesViewController: UIViewController { + var sdk: PersonalizationSDK? + var storiesView: StoriesView? + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .clear + print("StoriesViewController loaded") + } + + func configure(with sdk: PersonalizationSDK) { + self.sdk = sdk + let storiesView = StoriesView() + self.storiesView = storiesView + storiesView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(storiesView) + + NSLayoutConstraint.activate([ + storiesView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + storiesView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + storiesView.topAnchor.constraint(equalTo: view.topAnchor), + storiesView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + + storiesView.configure(sdk: sdk, mainVC: self, code: "40e9f2c0b33aa016dba02b5b1024bd36") + print("StoriesView configured with SDK") + } +} + +struct StoriesViewControllerRepresentable: UIViewControllerRepresentable { + @EnvironmentObject var sdkViewModel: SDKViewModel + + func makeUIViewController(context: Context) -> StoriesViewController { + let viewController = StoriesViewController() + print("StoriesViewControllerRepresentable: Created StoriesViewController") + return viewController + } + + func updateUIViewController(_ uiViewController: StoriesViewController, context: Context) { + if let sdk = sdkViewModel.sdkManager.sdk { + print("StoriesViewControllerRepresentable: SDK found, configuring StoriesView") + uiViewController.configure(with: sdk) + } else { + print("StoriesViewControllerRepresentable: SDK not found") + } + } +} diff --git a/demo-store-ios/viewModel/SdkViewModel.swift b/demo-store-ios/viewModel/SdkViewModel.swift new file mode 100644 index 0000000..f261134 --- /dev/null +++ b/demo-store-ios/viewModel/SdkViewModel.swift @@ -0,0 +1,16 @@ +import SwiftUI + +class SDKViewModel: ObservableObject { + let sdkManager = SDKManager.shared + + func performSDKAction() { + // Use sdkManager.sdk to perform actions + if let sdk = sdkManager.sdk { + // Example of using sdk + } + } + + func loadStories() { + // Perform actions to load stories if needed + } +} From 70b1d1f3fce5187fd6b5eb1f043bfcfd477986c4 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 9 Jul 2024 11:33:02 +0200 Subject: [PATCH 20/85] feat: Change stories code --- .../stories/controller/StoriesViewController.swift | 9 ++++----- demo-store-ios/viewModel/SdkViewModel.swift | 11 ----------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/demo-store-ios/features/main/stories/controller/StoriesViewController.swift b/demo-store-ios/features/main/stories/controller/StoriesViewController.swift index f94b88a..8236e9d 100644 --- a/demo-store-ios/features/main/stories/controller/StoriesViewController.swift +++ b/demo-store-ios/features/main/stories/controller/StoriesViewController.swift @@ -3,13 +3,14 @@ import UIKit import REES46 class StoriesViewController: UIViewController { + var sdk: PersonalizationSDK? var storiesView: StoriesView? + var storiesCode:String = "40e9f2c0b33aa016dba02b5b1024bd36" override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .clear - print("StoriesViewController loaded") } func configure(with sdk: PersonalizationSDK) { @@ -26,23 +27,21 @@ class StoriesViewController: UIViewController { storiesView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) - storiesView.configure(sdk: sdk, mainVC: self, code: "40e9f2c0b33aa016dba02b5b1024bd36") - print("StoriesView configured with SDK") + storiesView.configure(sdk: sdk, mainVC: self, code: storiesCode) } } struct StoriesViewControllerRepresentable: UIViewControllerRepresentable { + @EnvironmentObject var sdkViewModel: SDKViewModel func makeUIViewController(context: Context) -> StoriesViewController { let viewController = StoriesViewController() - print("StoriesViewControllerRepresentable: Created StoriesViewController") return viewController } func updateUIViewController(_ uiViewController: StoriesViewController, context: Context) { if let sdk = sdkViewModel.sdkManager.sdk { - print("StoriesViewControllerRepresentable: SDK found, configuring StoriesView") uiViewController.configure(with: sdk) } else { print("StoriesViewControllerRepresentable: SDK not found") diff --git a/demo-store-ios/viewModel/SdkViewModel.swift b/demo-store-ios/viewModel/SdkViewModel.swift index f261134..df3629a 100644 --- a/demo-store-ios/viewModel/SdkViewModel.swift +++ b/demo-store-ios/viewModel/SdkViewModel.swift @@ -2,15 +2,4 @@ import SwiftUI class SDKViewModel: ObservableObject { let sdkManager = SDKManager.shared - - func performSDKAction() { - // Use sdkManager.sdk to perform actions - if let sdk = sdkManager.sdk { - // Example of using sdk - } - } - - func loadStories() { - // Perform actions to load stories if needed - } } From 754d34c6201012f876cd8a49dced3f1e26f2be1c Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 9 Jul 2024 16:48:32 +0200 Subject: [PATCH 21/85] feat: Add reusable header --- demo-store-ios.xcodeproj/project.pbxproj | 12 ++++++ .../features/main/MainScreenView.swift | 14 +++++++ .../controller/StoriesViewController.swift | 6 ++- .../settings/SettingsScreenView.swift | 39 ++++++++++--------- .../mainSubView/SectionHeaderView.swift | 36 +++++++++++++++++ resources/Localizable.xcstrings | 2 +- 6 files changed, 87 insertions(+), 22 deletions(-) create mode 100644 demo-store-ios/mainSubView/SectionHeaderView.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 91f1d46..603dd87 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE52C3D295F007FAB88 /* SdkManager.swift */; }; 75674CE82C3D299A007FAB88 /* SdkViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */; }; 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; + 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */; }; 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; @@ -65,6 +66,7 @@ 75674CE52C3D295F007FAB88 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkViewModel.swift; sourceTree = ""; }; 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; + 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.swift; sourceTree = ""; }; @@ -147,6 +149,7 @@ 755944A22C35858C00C274C9 /* main */ = { isa = PBXGroup; children = ( + 75674CF02C3D787A007FAB88 /* newArriwals */, 75674CEC2C3D2E45007FAB88 /* discover */, 75674CEA2C3D2E32007FAB88 /* stories */, 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */, @@ -158,6 +161,7 @@ isa = PBXGroup; children = ( 75A3F4282C38593800AAC175 /* ToolbarView.swift */, + 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */, ); path = mainSubView; sourceTree = ""; @@ -195,6 +199,13 @@ path = controller; sourceTree = ""; }; + 75674CF02C3D787A007FAB88 /* newArriwals */ = { + isa = PBXGroup; + children = ( + ); + path = newArriwals; + sourceTree = ""; + }; 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( @@ -581,6 +592,7 @@ 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, + 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, 75674CDE2C3C4292007FAB88 /* MainStoriesContainerView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */, 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, diff --git a/demo-store-ios/features/main/MainScreenView.swift b/demo-store-ios/features/main/MainScreenView.swift index efa40b1..8ea26af 100644 --- a/demo-store-ios/features/main/MainScreenView.swift +++ b/demo-store-ios/features/main/MainScreenView.swift @@ -9,7 +9,21 @@ struct MainScreenView: View { ScrollView { VStack(spacing: 16) { MainDiscoverView() + MainStoriesContainerView() + + + SectionHeaderView(title: NSLocalizedString("arrivals_title", comment: "")) { + // Button action here + } + + SectionHeaderView(title: NSLocalizedString("top_trend_title", comment: "")) { + // Button action here + } + + SectionHeaderView(title: NSLocalizedString("reccomender_title", comment: "")) { + // Button action here + } } .padding(.vertical, 16) .frame(maxWidth: .infinity, alignment: .top) diff --git a/demo-store-ios/features/main/stories/controller/StoriesViewController.swift b/demo-store-ios/features/main/stories/controller/StoriesViewController.swift index 8236e9d..55ad829 100644 --- a/demo-store-ios/features/main/stories/controller/StoriesViewController.swift +++ b/demo-store-ios/features/main/stories/controller/StoriesViewController.swift @@ -20,12 +20,14 @@ class StoriesViewController: UIViewController { storiesView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(storiesView) - NSLayoutConstraint.activate([ + NSLayoutConstraint.activate( + [ storiesView.leadingAnchor.constraint(equalTo: view.leadingAnchor), storiesView.trailingAnchor.constraint(equalTo: view.trailingAnchor), storiesView.topAnchor.constraint(equalTo: view.topAnchor), storiesView.bottomAnchor.constraint(equalTo: view.bottomAnchor) - ]) + ] + ) storiesView.configure(sdk: sdk, mainVC: self, code: storiesCode) } diff --git a/demo-store-ios/features/settings/SettingsScreenView.swift b/demo-store-ios/features/settings/SettingsScreenView.swift index b6eb73f..ff4ab7e 100644 --- a/demo-store-ios/features/settings/SettingsScreenView.swift +++ b/demo-store-ios/features/settings/SettingsScreenView.swift @@ -16,25 +16,26 @@ struct SettingsScreenView: View { var body: some View { NavigationView { VStack { - switch viewState { - case .loading: - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .onAppear { - // Start a timer to simulate loading - DispatchQueue.main.asyncAfter(deadline: .now() + 3) { - loadData() - } - } - - case .error: - SettingsErrroScreenView() { - navigationManager.navigateTo(screen: AnyView(MainScreenView())) - } - - case .data: - SettingsInputCodeView(storeKey: $storeKey) - } + SettingsInputCodeView(storeKey: $storeKey) +// switch viewState { +// case .loading: +// ProgressView() +// .progressViewStyle(CircularProgressViewStyle()) +// .onAppear { +// // Start a timer to simulate loading +// DispatchQueue.main.asyncAfter(deadline: .now() + 3) { +// loadData() +// } +// } +// +// case .error: +// SettingsErrroScreenView() { +// navigationManager.navigateTo(screen: AnyView(MainScreenView())) +// } +// +// case .data: +// SettingsInputCodeView(storeKey: $storeKey) +// } } .padding() .navigationTitle("settings_tab_title") diff --git a/demo-store-ios/mainSubView/SectionHeaderView.swift b/demo-store-ios/mainSubView/SectionHeaderView.swift new file mode 100644 index 0000000..770326b --- /dev/null +++ b/demo-store-ios/mainSubView/SectionHeaderView.swift @@ -0,0 +1,36 @@ +import SwiftUI + +struct SectionHeaderView: View { + let title: String + let buttonAction: () -> Void + + var body: some View { + HStack { + Text(title) + .font(.system(size: 24, weight: .bold)) + .foregroundColor(.black) + + Spacer() + + Button(action: buttonAction) { + HStack { + Text("show_all_button") + .font(.system(size: 14)) + .foregroundColor(.black) + Image(systemName: "chevron.right") + .font(.system(size: 16, weight: .semibold)) + .foregroundColor(.black) + } + } + } + .padding(.horizontal) + } +} + +struct SectionHeaderView_Previews: PreviewProvider { + static var previews: some View { + SectionHeaderView(title: "Section Title", buttonAction: { + print("Show All tapped") + }) + } +} diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index d9bb9a8..5744cd7 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -84,7 +84,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Something\\nwent wrong." + "value" : "Something went wrong." } } } From 58e62a377916a93dfca6a989e5c4f78f6fa5c972 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 9 Jul 2024 18:09:09 +0200 Subject: [PATCH 22/85] feat: Add getting recommendation items and models --- demo-store-ios.xcodeproj/project.pbxproj | 16 +++++ demo-store-ios/models/Category.swift | 9 +++ .../models/RecommendedProduct.swift | 36 ++++++++++ .../models/RecommenderResponse.swift | 8 +++ demo-store-ios/viewModel/SdkViewModel.swift | 68 ++++++++++++++++++- 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 demo-store-ios/models/Category.swift create mode 100644 demo-store-ios/models/RecommendedProduct.swift create mode 100644 demo-store-ios/models/RecommenderResponse.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 603dd87..05b6948 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -17,6 +17,8 @@ 75674CE82C3D299A007FAB88 /* SdkViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */; }; 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; + 75674CF52C3D92CC007FAB88 /* Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Category.swift */; }; + 75674CF72C3D92E0007FAB88 /* RecommendedProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */; }; 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; @@ -67,6 +69,8 @@ 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkViewModel.swift; sourceTree = ""; }; 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; + 75674CF42C3D92CC007FAB88 /* Category.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Category.swift; sourceTree = ""; }; + 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProduct.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.swift; sourceTree = ""; }; @@ -206,6 +210,15 @@ path = newArriwals; sourceTree = ""; }; + 75674CF32C3D92B0007FAB88 /* models */ = { + isa = PBXGroup; + children = ( + 75674CF42C3D92CC007FAB88 /* Category.swift */, + 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */, + ); + path = models; + sourceTree = ""; + }; 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( @@ -232,6 +245,7 @@ 75B935552C3564360063E814 /* demo-store-ios */ = { isa = PBXGroup; children = ( + 75674CF32C3D92B0007FAB88 /* models */, 75A3F4212C3828A400AAC175 /* Info.plist */, 75674CE92C3D29BF007FAB88 /* viewModel */, 75ECCD1B2C37F09100D6D346 /* di */, @@ -590,6 +604,7 @@ 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */, 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, + 75674CF72C3D92E0007FAB88 /* RecommendedProduct.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, @@ -605,6 +620,7 @@ 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, + 75674CF52C3D92CC007FAB88 /* Category.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/demo-store-ios/models/Category.swift b/demo-store-ios/models/Category.swift new file mode 100644 index 0000000..163e183 --- /dev/null +++ b/demo-store-ios/models/Category.swift @@ -0,0 +1,9 @@ +import Foundation + +struct Category { + let id: String + let name: String + let url: String? + let alias: String? + let parentId: String? +} diff --git a/demo-store-ios/models/RecommendedProduct.swift b/demo-store-ios/models/RecommendedProduct.swift new file mode 100644 index 0000000..e78b230 --- /dev/null +++ b/demo-store-ios/models/RecommendedProduct.swift @@ -0,0 +1,36 @@ +import Foundation +import REES46 + +struct RecommendedProduct { + let id: String + let barcode: String + let name: String + let brand: String + let model: String + let description: String + let imageUrl: String + let resizedImageUrl: String + let url: String + let deeplinkIos: String + let categories: [Category] + let locations: [REES46.Location] + let price: Double + let priceFormatted: String? + let priceFull: Double + let priceFullFormatted: String? + let oldPrice: Double + let oldPriceFormatted: String? + let oldPriceFull: Double + let oldPriceFullFormatted: String? + let currency: String + let salesRate: Int + let discount: Int + let rating: Int + let relativeSalesRate: Float + let paramsRaw: [[String: Any]]? + let fashionOriginalSizes: [String] + let fashionSizes: [String] + let fashionColors: [String] + let resizedImages: [String: String] +} + diff --git a/demo-store-ios/models/RecommenderResponse.swift b/demo-store-ios/models/RecommenderResponse.swift new file mode 100644 index 0000000..3f414c6 --- /dev/null +++ b/demo-store-ios/models/RecommenderResponse.swift @@ -0,0 +1,8 @@ + +import Foundation + +struct RecommenderResponse { + let recommended: [RecommendedProduct] + let title: String + let locations: [String]? +} diff --git a/demo-store-ios/viewModel/SdkViewModel.swift b/demo-store-ios/viewModel/SdkViewModel.swift index df3629a..311ae1d 100644 --- a/demo-store-ios/viewModel/SdkViewModel.swift +++ b/demo-store-ios/viewModel/SdkViewModel.swift @@ -1,5 +1,71 @@ -import SwiftUI +import Foundation +import Combine +import REES46 class SDKViewModel: ObservableObject { + @Published var recommendedProducts: [RecommendedProduct] = [] + let sdkManager = SDKManager.shared + private let blockId = "977cb67194a72fdc7b424f49d69a862d" + private let currentProductId = "644" + + func getRecommendations() { + sdkManager.sdk?.recommend(blockId: blockId, currentProductId: currentProductId) { [weak self] response in + guard let self = self else { return } + switch response { + case .success(let recommendResponse): + self.mapResponseToModel(response: recommendResponse) + case .failure(let error): + print("Error:", error.localizedDescription) + } + } + } + + private func mapResponseToModel(response: REES46.RecommenderResponse) { + let products = response.recommended.map { recommended -> RecommendedProduct in + return RecommendedProduct( + id: recommended.id, + barcode: recommended.barcode, + name: recommended.name, + brand: recommended.brand, + model: recommended.model, + description: recommended.description, + imageUrl: recommended.imageUrl, + resizedImageUrl: recommended.resizedImageUrl, + url: recommended.url, + deeplinkIos: recommended.deeplinkIos, + categories: recommended.categories.map { category in + Category( + id: category.id, + name: category.name, + url: category.url, + alias: category.alias, + parentId: category.parentId + ) + }, + locations: recommended.locations, + price: recommended.price, + priceFormatted: recommended.priceFormatted, + priceFull: recommended.priceFull, + priceFullFormatted: recommended.priceFullFormatted, + oldPrice: recommended.oldPrice, + oldPriceFormatted: recommended.oldPriceFormatted, + oldPriceFull: recommended.oldPriceFull, + oldPriceFullFormatted: recommended.oldPriceFullFormatted, + currency: recommended.currency, + salesRate: recommended.salesRate, + discount: recommended.discount, + rating: recommended.rating, + relativeSalesRate: recommended.relativeSalesRate, + paramsRaw: recommended.paramsRaw, + fashionOriginalSizes: recommended.fashionOriginalSizes, + fashionSizes: recommended.fashionSizes, + fashionColors: recommended.fashionColors, + resizedImages: recommended.resizedImages + ) + } + DispatchQueue.main.async { + self.recommendedProducts = products + } + } } From d2fe698ffb767a9d6483d0deb1e16d52f76ddd4b Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 9 Jul 2024 19:07:36 +0200 Subject: [PATCH 23/85] feat: Add getting recommendation viewing items --- demo-store-ios.xcodeproj/project.pbxproj | 32 +++++ .../features/main/MainScreenView.swift | 11 +- .../main/newArriwals/NewArriwalsView.swift | 134 ++++++++++++++++++ .../mappers/RecommendedProductMapper.swift | 50 +++++++ demo-store-ios/utils/RatingConverter.swift | 17 +++ demo-store-ios/utils/RemoteImageLoader.swift | 52 +++++++ demo-store-ios/viewModel/SdkViewModel.swift | 75 ++-------- 7 files changed, 308 insertions(+), 63 deletions(-) create mode 100644 demo-store-ios/features/main/newArriwals/NewArriwalsView.swift create mode 100644 demo-store-ios/mappers/RecommendedProductMapper.swift create mode 100644 demo-store-ios/utils/RatingConverter.swift create mode 100644 demo-store-ios/utils/RemoteImageLoader.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 05b6948..14a0bac 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -19,6 +19,10 @@ 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; 75674CF52C3D92CC007FAB88 /* Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Category.swift */; }; 75674CF72C3D92E0007FAB88 /* RecommendedProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */; }; + 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; + 75674CFE2C3D9A5A007FAB88 /* NewArriwalsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* NewArriwalsView.swift */; }; + 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */; }; + 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D022C3DA14F007FAB88 /* RatingConverter.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */; }; 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; @@ -71,6 +75,10 @@ 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; 75674CF42C3D92CC007FAB88 /* Category.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Category.swift; sourceTree = ""; }; 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProduct.swift; sourceTree = ""; }; + 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; + 75674CFD2C3D9A5A007FAB88 /* NewArriwalsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewArriwalsView.swift; sourceTree = ""; }; + 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageLoader.swift; sourceTree = ""; }; + 75674D022C3DA14F007FAB88 /* RatingConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingConverter.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.swift; sourceTree = ""; }; @@ -206,6 +214,7 @@ 75674CF02C3D787A007FAB88 /* newArriwals */ = { isa = PBXGroup; children = ( + 75674CFD2C3D9A5A007FAB88 /* NewArriwalsView.swift */, ); path = newArriwals; sourceTree = ""; @@ -219,6 +228,23 @@ path = models; sourceTree = ""; }; + 75674CFA2C3D9957007FAB88 /* mappers */ = { + isa = PBXGroup; + children = ( + 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */, + ); + path = mappers; + sourceTree = ""; + }; + 75674CFF2C3DA0EC007FAB88 /* utils */ = { + isa = PBXGroup; + children = ( + 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */, + 75674D022C3DA14F007FAB88 /* RatingConverter.swift */, + ); + path = utils; + sourceTree = ""; + }; 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( @@ -245,6 +271,8 @@ 75B935552C3564360063E814 /* demo-store-ios */ = { isa = PBXGroup; children = ( + 75674CFF2C3DA0EC007FAB88 /* utils */, + 75674CFA2C3D9957007FAB88 /* mappers */, 75674CF32C3D92B0007FAB88 /* models */, 75A3F4212C3828A400AAC175 /* Info.plist */, 75674CE92C3D29BF007FAB88 /* viewModel */, @@ -606,17 +634,21 @@ 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, 75674CF72C3D92E0007FAB88 /* RecommendedProduct.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, + 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, 75674CDE2C3C4292007FAB88 /* MainStoriesContainerView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */, 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, + 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */, 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */, 75B935592C3564360063E814 /* ContentView.swift in Sources */, 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, 75674CE82C3D299A007FAB88 /* SdkViewModel.swift in Sources */, + 75674CFE2C3D9A5A007FAB88 /* NewArriwalsView.swift in Sources */, 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, + 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, diff --git a/demo-store-ios/features/main/MainScreenView.swift b/demo-store-ios/features/main/MainScreenView.swift index 8ea26af..0f2b4a5 100644 --- a/demo-store-ios/features/main/MainScreenView.swift +++ b/demo-store-ios/features/main/MainScreenView.swift @@ -3,6 +3,9 @@ import REES46 struct MainScreenView: View { @EnvironmentObject var navigationManager: NavigationManager + @ObservedObject var viewModel = SDKViewModel() + + private let blockId = "977cb67194a72fdc7b424f49d69a862d" var body: some View { NavigationView { @@ -13,9 +16,11 @@ struct MainScreenView: View { MainStoriesContainerView() - SectionHeaderView(title: NSLocalizedString("arrivals_title", comment: "")) { - // Button action here - } + NewArrivalsView(recommendedProducts: viewModel.recommendedProducts) + .onAppear{ + viewModel.getRecommendations(blockId: blockId, currentProductId: "646") + } + SectionHeaderView(title: NSLocalizedString("top_trend_title", comment: "")) { // Button action here diff --git a/demo-store-ios/features/main/newArriwals/NewArriwalsView.swift b/demo-store-ios/features/main/newArriwals/NewArriwalsView.swift new file mode 100644 index 0000000..27058b8 --- /dev/null +++ b/demo-store-ios/features/main/newArriwals/NewArriwalsView.swift @@ -0,0 +1,134 @@ +import SwiftUI + +struct NewArrivalsView: View { + var recommendedProducts: [RecommendedProduct] + + var body: some View { + VStack(alignment: .leading) { + SectionHeaderView(title: "New Arrivals") { + // Button action here if needed + } + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 16) { + ForEach(recommendedProducts, id: \.id) { product in + ProductItemView(product: product) + } + } + .padding(.horizontal, 16) + } + } + } +} + + +struct ProductItemView: View { + var product: RecommendedProduct + + var body: some View { + VStack(alignment: .leading, spacing: 5) { + RemoteImageView(urlString: product.resizedImageUrl) + + + Text(product.brand) + .font(.subheadline) + .foregroundColor(.secondary) + .lineLimit(1) + + Text(product.name) + .font(.headline) + .foregroundColor(.primary) + .lineLimit(1) + + RatingView(rating: Double(product.rating)) + + if let oldPrice = product.oldPriceFormatted { + Text(oldPrice) + .font(.subheadline) + .foregroundColor(.secondary) + .strikethrough() + } + + Text(product.priceFormatted ?? "") + .font(.body) + .foregroundColor(.primary) + + Spacer() + } + .cornerRadius(10) + .frame(width: 140, height: 260) + + } +} + +struct NewArrivalsView_Previews: PreviewProvider { + static var previews: some View { + let products = [ + RecommendedProduct( + id: "1", + barcode: "123456", + name: "Product 1", + brand: "Brand 1", + model: "Model 1", + description: "Description 1", + imageUrl: "https://example.com/product1.jpg", + resizedImageUrl: "https://example.com/product1_resized.jpg", + url: "https://example.com/product1", + deeplinkIos: "", + categories: [], + locations: [], + price: 99.99, + priceFormatted: "$99.99", + priceFull: 129.99, + priceFullFormatted: "$129.99", + oldPrice: 10.0, + oldPriceFormatted: nil, + oldPriceFull: 0.0, + oldPriceFullFormatted: nil, + currency: "USD", + salesRate: 10, + discount: 20, + rating: 4, + relativeSalesRate: 0.5, + paramsRaw: nil, + fashionOriginalSizes: [], + fashionSizes: [], + fashionColors: [], + resizedImages: [:] + ), + RecommendedProduct( + id: "2", + barcode: "789012", + name: "Product 2", + brand: "Brand 2", + model: "Model 2", + description: "Description 2", + imageUrl: "https://example.com/product2.jpg", + resizedImageUrl: "https://example.com/product2_resized.jpg", + url: "https://example.com/product2", + deeplinkIos: "", + categories: [], + locations: [], + price: 149.99, + priceFormatted: "$149.99", + priceFull: 179.99, + priceFullFormatted: "$179.99", + oldPrice: 0.0, + oldPriceFormatted: nil, + oldPriceFull: 0.0, + oldPriceFullFormatted: nil, + currency: "USD", + salesRate: 15, + discount: 16, + rating: 4, + relativeSalesRate: 0.6, + paramsRaw: nil, + fashionOriginalSizes: [], + fashionSizes: [], + fashionColors: [], + resizedImages: [:] + ) + ] + + return NewArrivalsView(recommendedProducts: products) + } +} diff --git a/demo-store-ios/mappers/RecommendedProductMapper.swift b/demo-store-ios/mappers/RecommendedProductMapper.swift new file mode 100644 index 0000000..0fcebbb --- /dev/null +++ b/demo-store-ios/mappers/RecommendedProductMapper.swift @@ -0,0 +1,50 @@ +import Foundation +import REES46 + +class RecommendedProductMapper { + + static func mapResponseToProducts(response: REES46.RecommenderResponse) -> [RecommendedProduct] { + return response.recommended.map { recommended in + return RecommendedProduct( + id: recommended.id, + barcode: recommended.barcode, + name: recommended.name, + brand: recommended.brand, + model: recommended.model, + description: recommended.description, + imageUrl: recommended.imageUrl, + resizedImageUrl: recommended.resizedImageUrl, + url: recommended.url, + deeplinkIos: recommended.deeplinkIos, + categories: recommended.categories.map { category in + Category( + id: category.id, + name: category.name, + url: category.url, + alias: category.alias, + parentId: category.parentId + ) + }, + locations: recommended.locations, + price: recommended.price, + priceFormatted: recommended.priceFormatted, + priceFull: recommended.priceFull, + priceFullFormatted: recommended.priceFullFormatted, + oldPrice: recommended.oldPrice, + oldPriceFormatted: recommended.oldPriceFormatted, + oldPriceFull: recommended.oldPriceFull, + oldPriceFullFormatted: recommended.oldPriceFullFormatted, + currency: recommended.currency, + salesRate: recommended.salesRate, + discount: recommended.discount, + rating: recommended.rating, + relativeSalesRate: recommended.relativeSalesRate, + paramsRaw: recommended.paramsRaw, + fashionOriginalSizes: recommended.fashionOriginalSizes, + fashionSizes: recommended.fashionSizes, + fashionColors: recommended.fashionColors, + resizedImages: recommended.resizedImages + ) + } + } +} diff --git a/demo-store-ios/utils/RatingConverter.swift b/demo-store-ios/utils/RatingConverter.swift new file mode 100644 index 0000000..04702ba --- /dev/null +++ b/demo-store-ios/utils/RatingConverter.swift @@ -0,0 +1,17 @@ +import SwiftUI + +struct RatingView: View { + var rating: Double + + var body: some View { + HStack(spacing: 2) { + ForEach(1...5, id: \.self) { index in + Image(systemName: index <= Int(self.rating) ? "star.fill" : "star") + .foregroundColor(.yellow) + } + } + .font(.caption) + .padding(.top, 2) + .padding(.bottom, 5) + } +} diff --git a/demo-store-ios/utils/RemoteImageLoader.swift b/demo-store-ios/utils/RemoteImageLoader.swift new file mode 100644 index 0000000..238260e --- /dev/null +++ b/demo-store-ios/utils/RemoteImageLoader.swift @@ -0,0 +1,52 @@ +import Combine +import SwiftUI + +class RemoteImageLoader: ObservableObject { + @Published var imageData = Data() + private var cancellable: AnyCancellable? + + init(urlString: String) { + guard let url = URL(string: urlString) else { return } + + cancellable = URLSession.shared.dataTaskPublisher(for: url) + .map { $0.data } + .replaceError(with: Data()) + .receive(on: DispatchQueue.main) + .assign(to: \.imageData, on: self) + } +} + +struct RemoteImageView: View { + @ObservedObject var imageLoader: RemoteImageLoader + let imageSize: CGFloat = 140 + + init(urlString: String) { + imageLoader = RemoteImageLoader(urlString: urlString) + } + + var body: some View { + if let uiImage = UIImage(data: imageLoader.imageData) { + Image(uiImage: uiImage) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: imageSize, height: imageSize) + .cornerRadius(5) + .overlay( + RoundedRectangle(cornerRadius: 10) + .stroke(Color.gray.opacity(0.5), lineWidth: 1) + ) + .clipped() + } else { + Image(systemName: "photo") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: imageSize, height: imageSize) + .cornerRadius(5) + .overlay( + RoundedRectangle(cornerRadius: 10) + .stroke(Color.gray.opacity(0.5), lineWidth: 1) + ) + .clipped() + } + } +} diff --git a/demo-store-ios/viewModel/SdkViewModel.swift b/demo-store-ios/viewModel/SdkViewModel.swift index 311ae1d..dd6cac3 100644 --- a/demo-store-ios/viewModel/SdkViewModel.swift +++ b/demo-store-ios/viewModel/SdkViewModel.swift @@ -7,65 +7,20 @@ class SDKViewModel: ObservableObject { let sdkManager = SDKManager.shared private let blockId = "977cb67194a72fdc7b424f49d69a862d" - private let currentProductId = "644" + private let currentProductId = "646" - func getRecommendations() { - sdkManager.sdk?.recommend(blockId: blockId, currentProductId: currentProductId) { [weak self] response in - guard let self = self else { return } - switch response { - case .success(let recommendResponse): - self.mapResponseToModel(response: recommendResponse) - case .failure(let error): - print("Error:", error.localizedDescription) - } - } - } - - private func mapResponseToModel(response: REES46.RecommenderResponse) { - let products = response.recommended.map { recommended -> RecommendedProduct in - return RecommendedProduct( - id: recommended.id, - barcode: recommended.barcode, - name: recommended.name, - brand: recommended.brand, - model: recommended.model, - description: recommended.description, - imageUrl: recommended.imageUrl, - resizedImageUrl: recommended.resizedImageUrl, - url: recommended.url, - deeplinkIos: recommended.deeplinkIos, - categories: recommended.categories.map { category in - Category( - id: category.id, - name: category.name, - url: category.url, - alias: category.alias, - parentId: category.parentId - ) - }, - locations: recommended.locations, - price: recommended.price, - priceFormatted: recommended.priceFormatted, - priceFull: recommended.priceFull, - priceFullFormatted: recommended.priceFullFormatted, - oldPrice: recommended.oldPrice, - oldPriceFormatted: recommended.oldPriceFormatted, - oldPriceFull: recommended.oldPriceFull, - oldPriceFullFormatted: recommended.oldPriceFullFormatted, - currency: recommended.currency, - salesRate: recommended.salesRate, - discount: recommended.discount, - rating: recommended.rating, - relativeSalesRate: recommended.relativeSalesRate, - paramsRaw: recommended.paramsRaw, - fashionOriginalSizes: recommended.fashionOriginalSizes, - fashionSizes: recommended.fashionSizes, - fashionColors: recommended.fashionColors, - resizedImages: recommended.resizedImages - ) - } - DispatchQueue.main.async { - self.recommendedProducts = products - } - } + func getRecommendations(blockId: String, currentProductId: String) { + sdkManager.sdk?.recommend(blockId: blockId, currentProductId: currentProductId) { [weak self] response in + guard let self = self else { return } + switch response { + case .success(let recommendResponse): + let products = RecommendedProductMapper.mapResponseToProducts(response: recommendResponse) + DispatchQueue.main.async { + self.recommendedProducts = products + } + case .failure(let error): + print("Error:", error.localizedDescription) + } + } + } } From c26854cfebc9417c84fac783d3633be3cd93cd3f Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 9 Jul 2024 19:40:24 +0200 Subject: [PATCH 24/85] fix: Fix bug with selecting tab from another views --- demo-store-ios/mainSubView/ToolbarView.swift | 5 ++- demo-store-ios/navigation/BottomBarView.swift | 25 +++++++----- .../navigation/NavigationManager.swift | 38 +++++++++++++++---- 3 files changed, 51 insertions(+), 17 deletions(-) diff --git a/demo-store-ios/mainSubView/ToolbarView.swift b/demo-store-ios/mainSubView/ToolbarView.swift index 4d69de7..3ea7f50 100644 --- a/demo-store-ios/mainSubView/ToolbarView.swift +++ b/demo-store-ios/mainSubView/ToolbarView.swift @@ -44,7 +44,10 @@ struct ToolbarView: View { .foregroundColor(.black) .padding(.trailing, 12) .onTapGesture { - navigationManager.navigateTo(screen: AnyView(CartScreenView())) + navigationManager.navigateTo( + screen: AnyView(CartScreenView()), + selectedTab: .cart + ) } } } diff --git a/demo-store-ios/navigation/BottomBarView.swift b/demo-store-ios/navigation/BottomBarView.swift index 460d2ca..99c3d70 100644 --- a/demo-store-ios/navigation/BottomBarView.swift +++ b/demo-store-ios/navigation/BottomBarView.swift @@ -1,43 +1,50 @@ import SwiftUI -import Combine struct BottomBarView: View { @EnvironmentObject var navigationManager: NavigationManager + @State private var selectedTab: ScreenType? = .main var body: some View { VStack { Spacer() HStack { - TabBarButton(image: "MainTab", isSelected: navigationManager.currentScreenType == MainScreenView.self) + TabBarButton(image: "MainTab", isSelected: selectedTab == .main) .onTapGesture { - navigationManager.navigateTo(screen: AnyView(MainScreenView())) + selectedTab = .main + navigationManager.navigateTo(screen: AnyView(MainScreenView()), selectedTab: .main) } .padding(.leading, 20) Spacer() - TabBarButton(image: "CatalogTab", isSelected: navigationManager.currentScreenType == CatalogScreenView.self) + TabBarButton(image: "CatalogTab", isSelected: selectedTab == .catalog) .onTapGesture { - navigationManager.navigateTo(screen: AnyView(CatalogScreenView())) + selectedTab = .catalog + navigationManager.navigateTo(screen: AnyView(CatalogScreenView()), selectedTab: .catalog) } Spacer() - TabBarButton(image: "CartTab", isSelected: navigationManager.currentScreenType == CartScreenView.self) + TabBarButton(image: "CartTab", isSelected: selectedTab == .cart) .onTapGesture { - navigationManager.navigateTo(screen: AnyView(CartScreenView())) + selectedTab = .cart + navigationManager.navigateTo(screen: AnyView(CartScreenView()), selectedTab: .cart) } Spacer() - TabBarButton(image: "SettingsTab", isSelected: navigationManager.currentScreenType == SettingsScreenView.self) + TabBarButton(image: "SettingsTab", isSelected: selectedTab == .settings) .onTapGesture { - navigationManager.navigateTo(screen: AnyView(SettingsScreenView())) + selectedTab = .settings + navigationManager.navigateTo(screen: AnyView(SettingsScreenView()), selectedTab: .settings) } .padding(.trailing, 20) } } + .onChange(of: navigationManager.selectedTab) { newTab in + selectedTab = newTab + } } } diff --git a/demo-store-ios/navigation/NavigationManager.swift b/demo-store-ios/navigation/NavigationManager.swift index b0a232e..ec8f400 100644 --- a/demo-store-ios/navigation/NavigationManager.swift +++ b/demo-store-ios/navigation/NavigationManager.swift @@ -1,26 +1,50 @@ import SwiftUI -import Combine class NavigationManager: ObservableObject { @Published var currentScreen: AnyView @Published var isToolbarHidden: Bool = false - @Published var currentScreenType: Any.Type + @Published var currentScreenType: ScreenType = .none + @Published var selectedTab: ScreenType? = .main init() { self.currentScreen = AnyView(MainScreenView()) - self.currentScreenType = MainScreenView.self + self.currentScreenType = .main } - func navigateTo(screen: Content) { + func navigateTo(screen: Content, selectedTab: ScreenType) { self.currentScreen = AnyView(screen) - self.currentScreenType = type(of: screen) + self.selectedTab = selectedTab + switch screen { + case is MainScreenView: + self.currentScreenType = .main + case is CatalogScreenView: + self.currentScreenType = .catalog + case is CartScreenView: + self.currentScreenType = .cart + case is SettingsScreenView: + self.currentScreenType = .settings + default: + self.currentScreenType = .none + } } func setToolbarHidden(hidden: Bool) { - self.isToolbarHidden = hidden - } + self.isToolbarHidden = hidden + } + + func resetSelection() { + self.selectedTab = nil + } func navigateBack() { // Implement navigation back logic if needed } } + +enum ScreenType { + case main + case catalog + case cart + case settings + case none +} From c46ae930b786a58ca36083b66f7394b4cebe87a5 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 10 Jul 2024 10:10:17 +0200 Subject: [PATCH 25/85] feat: Add reusable products list --- demo-store-ios.xcodeproj/project.pbxproj | 14 ++--- .../features/main/MainScreenView.swift | 27 ++++++---- .../RecommendationListView.swift} | 13 +++-- demo-store-ios/viewModel/SdkViewModel.swift | 53 ++++++++++++------- 4 files changed, 68 insertions(+), 39 deletions(-) rename demo-store-ios/features/main/{newArriwals/NewArriwalsView.swift => recommendation/RecommendationListView.swift} (94%) diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 14a0bac..1d0ded7 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -20,7 +20,7 @@ 75674CF52C3D92CC007FAB88 /* Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Category.swift */; }; 75674CF72C3D92E0007FAB88 /* RecommendedProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */; }; 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; - 75674CFE2C3D9A5A007FAB88 /* NewArriwalsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* NewArriwalsView.swift */; }; + 75674CFE2C3D9A5A007FAB88 /* RecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* RecommendationListView.swift */; }; 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */; }; 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D022C3DA14F007FAB88 /* RatingConverter.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; @@ -76,7 +76,7 @@ 75674CF42C3D92CC007FAB88 /* Category.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Category.swift; sourceTree = ""; }; 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProduct.swift; sourceTree = ""; }; 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; - 75674CFD2C3D9A5A007FAB88 /* NewArriwalsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewArriwalsView.swift; sourceTree = ""; }; + 75674CFD2C3D9A5A007FAB88 /* RecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendationListView.swift; sourceTree = ""; }; 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageLoader.swift; sourceTree = ""; }; 75674D022C3DA14F007FAB88 /* RatingConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingConverter.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -161,7 +161,7 @@ 755944A22C35858C00C274C9 /* main */ = { isa = PBXGroup; children = ( - 75674CF02C3D787A007FAB88 /* newArriwals */, + 75674CF02C3D787A007FAB88 /* recommendation */, 75674CEC2C3D2E45007FAB88 /* discover */, 75674CEA2C3D2E32007FAB88 /* stories */, 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */, @@ -211,12 +211,12 @@ path = controller; sourceTree = ""; }; - 75674CF02C3D787A007FAB88 /* newArriwals */ = { + 75674CF02C3D787A007FAB88 /* recommendation */ = { isa = PBXGroup; children = ( - 75674CFD2C3D9A5A007FAB88 /* NewArriwalsView.swift */, + 75674CFD2C3D9A5A007FAB88 /* RecommendationListView.swift */, ); - path = newArriwals; + path = recommendation; sourceTree = ""; }; 75674CF32C3D92B0007FAB88 /* models */ = { @@ -646,7 +646,7 @@ 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, 75674CE82C3D299A007FAB88 /* SdkViewModel.swift in Sources */, - 75674CFE2C3D9A5A007FAB88 /* NewArriwalsView.swift in Sources */, + 75674CFE2C3D9A5A007FAB88 /* RecommendationListView.swift in Sources */, 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, diff --git a/demo-store-ios/features/main/MainScreenView.swift b/demo-store-ios/features/main/MainScreenView.swift index 0f2b4a5..3b4af8b 100644 --- a/demo-store-ios/features/main/MainScreenView.swift +++ b/demo-store-ios/features/main/MainScreenView.swift @@ -15,20 +15,27 @@ struct MainScreenView: View { MainStoriesContainerView() + RecommendationListView( + recommendedProducts: viewModel.arrivalsProducts, + title: NSLocalizedString("arrivals_title", comment: "") + ).onAppear { + viewModel.loadArrivalsRecommendations(blockId: blockId, currentProductId: "646") + } - NewArrivalsView(recommendedProducts: viewModel.recommendedProducts) - .onAppear{ - viewModel.getRecommendations(blockId: blockId, currentProductId: "646") - } - - - SectionHeaderView(title: NSLocalizedString("top_trend_title", comment: "")) { - // Button action here + RecommendationListView( + recommendedProducts: viewModel.topTrendProducts, + title: NSLocalizedString("top_trend_title", comment: "") + ).onAppear { + viewModel.loadTopTrendRecommendations(blockId: blockId, currentProductId: "649") } - SectionHeaderView(title: NSLocalizedString("reccomender_title", comment: "")) { - // Button action here + RecommendationListView( + recommendedProducts: viewModel.recommenderProducts, + title: NSLocalizedString("reccomender_title", comment: "") + ).onAppear { + viewModel.loadRecommenderRecommendations(blockId: blockId, currentProductId: "641") } + } .padding(.vertical, 16) .frame(maxWidth: .infinity, alignment: .top) diff --git a/demo-store-ios/features/main/newArriwals/NewArriwalsView.swift b/demo-store-ios/features/main/recommendation/RecommendationListView.swift similarity index 94% rename from demo-store-ios/features/main/newArriwals/NewArriwalsView.swift rename to demo-store-ios/features/main/recommendation/RecommendationListView.swift index 27058b8..45a246b 100644 --- a/demo-store-ios/features/main/newArriwals/NewArriwalsView.swift +++ b/demo-store-ios/features/main/recommendation/RecommendationListView.swift @@ -1,11 +1,13 @@ import SwiftUI -struct NewArrivalsView: View { +struct RecommendationListView: View { + var recommendedProducts: [RecommendedProduct] + var title: String var body: some View { VStack(alignment: .leading) { - SectionHeaderView(title: "New Arrivals") { + SectionHeaderView(title: title) { // Button action here if needed } ScrollView(.horizontal, showsIndicators: false) { @@ -27,7 +29,7 @@ struct ProductItemView: View { var body: some View { VStack(alignment: .leading, spacing: 5) { RemoteImageView(urlString: product.resizedImageUrl) - + Text(product.brand) .font(.subheadline) @@ -129,6 +131,9 @@ struct NewArrivalsView_Previews: PreviewProvider { ) ] - return NewArrivalsView(recommendedProducts: products) + return RecommendationListView( + recommendedProducts: products, + title:"Top products" + ) } } diff --git a/demo-store-ios/viewModel/SdkViewModel.swift b/demo-store-ios/viewModel/SdkViewModel.swift index dd6cac3..157dfc8 100644 --- a/demo-store-ios/viewModel/SdkViewModel.swift +++ b/demo-store-ios/viewModel/SdkViewModel.swift @@ -3,24 +3,41 @@ import Combine import REES46 class SDKViewModel: ObservableObject { - @Published var recommendedProducts: [RecommendedProduct] = [] - + @Published var arrivalsProducts: [RecommendedProduct] = [] + @Published var topTrendProducts: [RecommendedProduct] = [] + @Published var recommenderProducts: [RecommendedProduct] = [] + let sdkManager = SDKManager.shared - private let blockId = "977cb67194a72fdc7b424f49d69a862d" - private let currentProductId = "646" - func getRecommendations(blockId: String, currentProductId: String) { - sdkManager.sdk?.recommend(blockId: blockId, currentProductId: currentProductId) { [weak self] response in - guard let self = self else { return } - switch response { - case .success(let recommendResponse): - let products = RecommendedProductMapper.mapResponseToProducts(response: recommendResponse) - DispatchQueue.main.async { - self.recommendedProducts = products - } - case .failure(let error): - print("Error:", error.localizedDescription) - } - } - } + func getRecommendations(blockId: String, currentProductId: String, completion: @escaping ([RecommendedProduct]) -> Void) { + sdkManager.sdk?.recommend(blockId: blockId, currentProductId: currentProductId) { response in + switch response { + case .success(let recommendResponse): + let products = RecommendedProductMapper.mapResponseToProducts(response: recommendResponse) + DispatchQueue.main.async { + completion(products) + } + case .failure(let error): + print("Error:", error.localizedDescription) + } + } + } + + func loadArrivalsRecommendations(blockId: String, currentProductId: String) { + getRecommendations(blockId: blockId, currentProductId: currentProductId) { products in + self.arrivalsProducts = products + } + } + + func loadTopTrendRecommendations(blockId: String, currentProductId: String) { + getRecommendations(blockId: blockId, currentProductId: currentProductId) { products in + self.topTrendProducts = products + } + } + + func loadRecommenderRecommendations(blockId: String, currentProductId: String) { + getRecommendations(blockId: blockId, currentProductId: currentProductId) { products in + self.recommenderProducts = products + } + } } From 8c2790e952eb45e946277b25752124a9f1f93e88 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 10 Jul 2024 16:59:13 +0200 Subject: [PATCH 26/85] feat: Add grid and discover moko data, reusable toolbar and list items --- demo-store-ios.xcodeproj/project.pbxproj | 20 +++- .../features/main/MainScreenView.swift | 6 +- .../main/discover/MainDiscoverView.swift | 57 +++++---- .../FullRecommendationListView.swift | 111 ++++++++++++++++++ .../recommendation/ProductListItemView.swift | 67 +++++++++++ ...wift => ShortRecommendationListView.swift} | 71 ++++------- .../mainSubView/DetailsToolbar.swift | 62 ++++++++++ demo-store-ios/mainSubView/ToolbarView.swift | 26 ++-- .../navigation/NavigationManager.swift | 4 +- demo-store-ios/utils/RemoteImageLoader.swift | 19 ++- resources/Localizable.xcstrings | 21 ++-- 11 files changed, 360 insertions(+), 104 deletions(-) create mode 100644 demo-store-ios/features/main/recommendation/FullRecommendationListView.swift create mode 100644 demo-store-ios/features/main/recommendation/ProductListItemView.swift rename demo-store-ios/features/main/recommendation/{RecommendationListView.swift => ShortRecommendationListView.swift} (68%) create mode 100644 demo-store-ios/mainSubView/DetailsToolbar.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 1d0ded7..2d45490 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -20,7 +20,7 @@ 75674CF52C3D92CC007FAB88 /* Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Category.swift */; }; 75674CF72C3D92E0007FAB88 /* RecommendedProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */; }; 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; - 75674CFE2C3D9A5A007FAB88 /* RecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* RecommendationListView.swift */; }; + 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */; }; 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */; }; 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D022C3DA14F007FAB88 /* RatingConverter.swift */; }; 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; @@ -35,6 +35,9 @@ 75B935682C3564370063E814 /* DemoStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935672C3564370063E814 /* DemoStoreTests.swift */; }; 75B935722C3564370063E814 /* DemoStoreUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935712C3564370063E814 /* DemoStoreUITests.swift */; }; 75B935742C3564370063E814 /* DemoStoreUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */; }; + 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */; }; + 75E1C8ED2C3EACDA005018B4 /* DetailsToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */; }; + 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */; }; 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */; }; 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; @@ -76,7 +79,7 @@ 75674CF42C3D92CC007FAB88 /* Category.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Category.swift; sourceTree = ""; }; 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProduct.swift; sourceTree = ""; }; 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; - 75674CFD2C3D9A5A007FAB88 /* RecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendationListView.swift; sourceTree = ""; }; + 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortRecommendationListView.swift; sourceTree = ""; }; 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageLoader.swift; sourceTree = ""; }; 75674D022C3DA14F007FAB88 /* RatingConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingConverter.swift; sourceTree = ""; }; 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -95,6 +98,9 @@ 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "demo-store-iosUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935712C3564370063E814 /* DemoStoreUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreUITests.swift; sourceTree = ""; }; 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreUITestsLaunchTests.swift; sourceTree = ""; }; + 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.swift; sourceTree = ""; }; + 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbar.swift; sourceTree = ""; }; + 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.swift; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainScreenView.swift; sourceTree = ""; }; 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CatalogScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; @@ -174,6 +180,7 @@ children = ( 75A3F4282C38593800AAC175 /* ToolbarView.swift */, 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */, + 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */, ); path = mainSubView; sourceTree = ""; @@ -214,7 +221,9 @@ 75674CF02C3D787A007FAB88 /* recommendation */ = { isa = PBXGroup; children = ( - 75674CFD2C3D9A5A007FAB88 /* RecommendationListView.swift */, + 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */, + 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */, + 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */, ); path = recommendation; sourceTree = ""; @@ -644,9 +653,12 @@ 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */, 75B935592C3564360063E814 /* ContentView.swift in Sources */, 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, + 75E1C8ED2C3EACDA005018B4 /* DetailsToolbar.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, + 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */, 75674CE82C3D299A007FAB88 /* SdkViewModel.swift in Sources */, - 75674CFE2C3D9A5A007FAB88 /* RecommendationListView.swift in Sources */, + 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, + 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, diff --git a/demo-store-ios/features/main/MainScreenView.swift b/demo-store-ios/features/main/MainScreenView.swift index 3b4af8b..1a56e60 100644 --- a/demo-store-ios/features/main/MainScreenView.swift +++ b/demo-store-ios/features/main/MainScreenView.swift @@ -15,21 +15,21 @@ struct MainScreenView: View { MainStoriesContainerView() - RecommendationListView( + ShortRecommendationListView( recommendedProducts: viewModel.arrivalsProducts, title: NSLocalizedString("arrivals_title", comment: "") ).onAppear { viewModel.loadArrivalsRecommendations(blockId: blockId, currentProductId: "646") } - RecommendationListView( + ShortRecommendationListView( recommendedProducts: viewModel.topTrendProducts, title: NSLocalizedString("top_trend_title", comment: "") ).onAppear { viewModel.loadTopTrendRecommendations(blockId: blockId, currentProductId: "649") } - RecommendationListView( + ShortRecommendationListView( recommendedProducts: viewModel.recommenderProducts, title: NSLocalizedString("reccomender_title", comment: "") ).onAppear { diff --git a/demo-store-ios/features/main/discover/MainDiscoverView.swift b/demo-store-ios/features/main/discover/MainDiscoverView.swift index 8f2b457..c77d684 100644 --- a/demo-store-ios/features/main/discover/MainDiscoverView.swift +++ b/demo-store-ios/features/main/discover/MainDiscoverView.swift @@ -1,37 +1,54 @@ import SwiftUI +struct ImageItem { + let urlString: String + let type: String + let count: Int +} + struct MainDiscoverView: View { + let imageItems: [ImageItem] = [ + ImageItem(urlString: "https://m.media-amazon.com/images/I/71qqPTyiatS._AC_UY580_.jpg", type: "Summer style", count: 10), + ImageItem(urlString: "https://ankerliebe.com/wp-content/uploads/2022/10/6f147a6d-b07c-43b9-9185-74516049e68a.jpg", type: "Evening style", count: 5), + ImageItem(urlString: "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSr5xYylSSx5eBFzxggQRXoH-E2AAU05jcSckFoUGphRwWdBE1W9OSQbOiVP67RDq_kdX0&usqp=CAU", type: "Formal style", count: 7), + ImageItem(urlString: "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSzWEQ1KTnzIU2I-xehvxIRR2hwg-SPwR--SOnmhUcuu3DgqshTkUVFfBrnVUKqSEXuDCg&usqp=CAU", type: "Ceremonial style", count: 3) + ] + var body: some View { VStack { Text("main_tab_title") .foregroundColor(.white) - + ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 8) { - ForEach(0..<10) { index in + ForEach(imageItems, id: \.urlString) { item in VStack { - Image(systemName: "photo") - .resizable() - .frame(width: 140, height: 160) - .cornerRadius(8) - .overlay( - VStack(alignment: .leading, spacing: 4) { - Spacer() - Text("Title") - .font(.system(size: 18)) + RemoteImageView( + urlString: item.urlString, + width: 140, + height: 180, + contentMode: .fill + ) + .aspectRatio(contentMode: .fill) + .overlay( + VStack(alignment: .leading, spacing: 4) { + Spacer() + Text("\(item.type)") + .font(.system(size: 18)) + .foregroundColor(.white) + HStack() { + Text("\(item.count)") + .font(.system(size: 12)) + .foregroundColor(.white) + Text("Products") + .font(.system(size: 12)) .foregroundColor(.white) - HStack { - Text("Subtitle 1") - .font(.system(size: 12)) - .foregroundColor(.white) - Text("Subtitle 2") - .font(.system(size: 12)) - .foregroundColor(.white) - } + } + } .padding(8) .cornerRadius(8) - ) + ) } } } diff --git a/demo-store-ios/features/main/recommendation/FullRecommendationListView.swift b/demo-store-ios/features/main/recommendation/FullRecommendationListView.swift new file mode 100644 index 0000000..040fc37 --- /dev/null +++ b/demo-store-ios/features/main/recommendation/FullRecommendationListView.swift @@ -0,0 +1,111 @@ +import SwiftUI + +struct FullRecommendationListView: View { + + @EnvironmentObject var navigationManager: NavigationManager + + var recommendedProducts: [RecommendedProduct] + var title: String + var body: some View { + VStack(alignment: .leading) { + DetailsToolbarView() + + + ScrollView { + Spacer().frame(height: 20) + LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: 16) { + ForEach(recommendedProducts, id: \.id) { product in + ProductListItemView( + product: product, + containerWidth: 170, + containerHeight: 280, + imageWidth: 170, + imageHeight: 170, + showShopButton: true + ).padding(.bottom,20) + } + } + } + } + .background(Color.white) + .onAppear{ + navigationManager.setToolbarHidden(hidden: true) + } + } +} + +struct FullRecommendationListView_Previews: PreviewProvider { + static var previews: some View { + let products = [ + RecommendedProduct( + id: "1", + barcode: "123456", + name: "Product 1", + brand: "Brand 1", + model: "Model 1", + description: "Description 1", + imageUrl: "https://example.com/product1.jpg", + resizedImageUrl: "https://example.com/product1_resized.jpg", + url: "https://example.com/product1", + deeplinkIos: "", + categories: [], + locations: [], + price: 99.99, + priceFormatted: "$99.99", + priceFull: 129.99, + priceFullFormatted: "$129.99", + oldPrice: 10.0, + oldPriceFormatted: "$129.99", + oldPriceFull: 0.0, + oldPriceFullFormatted: nil, + currency: "USD", + salesRate: 10, + discount: 20, + rating: 4, + relativeSalesRate: 0.5, + paramsRaw: nil, + fashionOriginalSizes: [], + fashionSizes: [], + fashionColors: [], + resizedImages: [:] + ), + RecommendedProduct( + id: "2", + barcode: "789012", + name: "Product 2", + brand: "Brand 2", + model: "Model 2", + description: "Description 2", + imageUrl: "https://example.com/product2.jpg", + resizedImageUrl: "https://example.com/product2_resized.jpg", + url: "https://example.com/product2", + deeplinkIos: "", + categories: [], + locations: [], + price: 149.99, + priceFormatted: "$149.99", + priceFull: 179.99, + priceFullFormatted: "$179.99", + oldPrice: 0.0, + oldPriceFormatted: nil, + oldPriceFull: 0.0, + oldPriceFullFormatted: nil, + currency: "USD", + salesRate: 15, + discount: 16, + rating: 4, + relativeSalesRate: 0.6, + paramsRaw: nil, + fashionOriginalSizes: [], + fashionSizes: [], + fashionColors: [], + resizedImages: [:] + ) + ] + + return FullRecommendationListView( + recommendedProducts: products, + title: "Top Products" + ) + } +} diff --git a/demo-store-ios/features/main/recommendation/ProductListItemView.swift b/demo-store-ios/features/main/recommendation/ProductListItemView.swift new file mode 100644 index 0000000..88864e9 --- /dev/null +++ b/demo-store-ios/features/main/recommendation/ProductListItemView.swift @@ -0,0 +1,67 @@ +import SwiftUI + +struct ProductListItemView: View { + var product: RecommendedProduct + var containerWidth: CGFloat + var containerHeight: CGFloat + var imageWidth: CGFloat + var imageHeight: CGFloat + var showShopButton: Bool + + var body: some View { + VStack(alignment: .leading, spacing: 5) { + RemoteImageView( + urlString: product.resizedImageUrl, + width: imageWidth, + height: imageHeight + ) + + Text(product.brand) + .font(.system(size: 12)) + .padding(.top, 8) + .padding(.bottom, 4) + .foregroundColor(.secondary) + .lineLimit(1) + + Text(product.name) + .font(.system(size: 19)) + .padding(.bottom, 4) + .foregroundColor(.primary) + .lineLimit(1) + + RatingView(rating: Double(product.rating)) + + if let oldPrice = product.oldPriceFormatted { + Text(oldPrice) + .font(.subheadline) + .foregroundColor(.secondary) + .strikethrough() + } + + HStack { + Text(product.priceFormatted ?? "") + .font(.system(size: 17, weight: .bold)) + .foregroundColor(.primary) + + Spacer() + + if showShopButton { + Button(action: { + // TODO Действие по нажатию кнопки + }) { + Text("Shop") + .font(.system(size: 12)) + .foregroundColor(.white) + .frame(width: 62, height: 28) + .background(Color.black) + .cornerRadius(3) + } + } + } + + Spacer() + } + .cornerRadius(10) + .frame(width: containerWidth, height: containerHeight) + } +} diff --git a/demo-store-ios/features/main/recommendation/RecommendationListView.swift b/demo-store-ios/features/main/recommendation/ShortRecommendationListView.swift similarity index 68% rename from demo-store-ios/features/main/recommendation/RecommendationListView.swift rename to demo-store-ios/features/main/recommendation/ShortRecommendationListView.swift index 45a246b..d7d69ad 100644 --- a/demo-store-ios/features/main/recommendation/RecommendationListView.swift +++ b/demo-store-ios/features/main/recommendation/ShortRecommendationListView.swift @@ -1,19 +1,34 @@ import SwiftUI -struct RecommendationListView: View { - +struct ShortRecommendationListView: View { + @EnvironmentObject var navigationManager: NavigationManager var recommendedProducts: [RecommendedProduct] var title: String var body: some View { VStack(alignment: .leading) { SectionHeaderView(title: title) { - // Button action here if needed + navigationManager.navigateTo( + screen: AnyView( + FullRecommendationListView( + recommendedProducts: recommendedProducts, + title: NSLocalizedString("reccomender_title", comment: "") + ) + ) + ) } + ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 16) { ForEach(recommendedProducts, id: \.id) { product in - ProductItemView(product: product) + ProductListItemView( + product: product, + containerWidth: 140, + containerHeight: 270, + imageWidth: 140, + imageHeight: 140, + showShopButton: false + ) } } .padding(.horizontal, 16) @@ -22,46 +37,6 @@ struct RecommendationListView: View { } } - -struct ProductItemView: View { - var product: RecommendedProduct - - var body: some View { - VStack(alignment: .leading, spacing: 5) { - RemoteImageView(urlString: product.resizedImageUrl) - - - Text(product.brand) - .font(.subheadline) - .foregroundColor(.secondary) - .lineLimit(1) - - Text(product.name) - .font(.headline) - .foregroundColor(.primary) - .lineLimit(1) - - RatingView(rating: Double(product.rating)) - - if let oldPrice = product.oldPriceFormatted { - Text(oldPrice) - .font(.subheadline) - .foregroundColor(.secondary) - .strikethrough() - } - - Text(product.priceFormatted ?? "") - .font(.body) - .foregroundColor(.primary) - - Spacer() - } - .cornerRadius(10) - .frame(width: 140, height: 260) - - } -} - struct NewArrivalsView_Previews: PreviewProvider { static var previews: some View { let products = [ @@ -83,7 +58,7 @@ struct NewArrivalsView_Previews: PreviewProvider { priceFull: 129.99, priceFullFormatted: "$129.99", oldPrice: 10.0, - oldPriceFormatted: nil, + oldPriceFormatted: "$129.99", oldPriceFull: 0.0, oldPriceFullFormatted: nil, currency: "USD", @@ -111,11 +86,11 @@ struct NewArrivalsView_Previews: PreviewProvider { categories: [], locations: [], price: 149.99, - priceFormatted: "$149.99", + priceFormatted: "$109.99", priceFull: 179.99, priceFullFormatted: "$179.99", oldPrice: 0.0, - oldPriceFormatted: nil, + oldPriceFormatted: "$129.99", oldPriceFull: 0.0, oldPriceFullFormatted: nil, currency: "USD", @@ -131,7 +106,7 @@ struct NewArrivalsView_Previews: PreviewProvider { ) ] - return RecommendationListView( + return ShortRecommendationListView( recommendedProducts: products, title:"Top products" ) diff --git a/demo-store-ios/mainSubView/DetailsToolbar.swift b/demo-store-ios/mainSubView/DetailsToolbar.swift new file mode 100644 index 0000000..a6bd874 --- /dev/null +++ b/demo-store-ios/mainSubView/DetailsToolbar.swift @@ -0,0 +1,62 @@ +import SwiftUI + +struct DetailsToolbarView: View { + @EnvironmentObject var navigationManager: NavigationManager + + var body: some View { + ZStack { + RemoteImageView( + urlString: "https://png.pngtree.com/thumb_back/fw800/background/20240121/pngtree-set-of-various-kinds-girls-dress-in-same-color-image_15613096.jpg" + ) + + VStack { + ZStack { + Image("ToolbarLogo") + .resizable() + .aspectRatio(contentMode: .fit) + .padding(.vertical, 10) + .foregroundColor(.white) + } + .frame(height: 50) + + HStack(spacing: 20) { + Image("MenuIcon") + .resizable() + .renderingMode(.template) + .frame(width: 24, height: 24) + .foregroundColor(.white) + .padding(.leading, 12) + + Spacer() + + Image("SearchIcon") + .resizable() + .renderingMode(.template) + .frame(width: 30, height: 30) + .foregroundColor(.white) + + Image("CartIcon") + .resizable() + .renderingMode(.template) + .frame(width: 30, height: 30) + .foregroundColor(.white) + .padding(.trailing, 12) + .onTapGesture { + navigationManager.navigateTo( + screen: AnyView(CartScreenView()), + selectedTab: .cart + ) + } + } + } + .padding(.horizontal, 10) + .edgesIgnoringSafeArea(.all) + } + } +} + +struct DetailsToolbarView_Previews: PreviewProvider { + static var previews: some View { + DetailsToolbarView() + } +} diff --git a/demo-store-ios/mainSubView/ToolbarView.swift b/demo-store-ios/mainSubView/ToolbarView.swift index 3ea7f50..5605957 100644 --- a/demo-store-ios/mainSubView/ToolbarView.swift +++ b/demo-store-ios/mainSubView/ToolbarView.swift @@ -9,17 +9,18 @@ struct ToolbarView: View { @EnvironmentObject var navigationManager: NavigationManager var body: some View { - VStack { - ZStack { - Color.black - Image("ToolbarLogo") - .resizable() - .aspectRatio(contentMode: .fit) - .padding(.vertical, 10) - .foregroundColor(.white) - } - .frame(height: 50) - if !navigationManager.isToolbarHidden { + if !navigationManager.isToolbarHidden { + VStack { + ZStack { + Color.black + Image("ToolbarLogo") + .resizable() + .aspectRatio(contentMode: .fit) + .padding(.vertical, 10) + .foregroundColor(.white) + } + .frame(height: 50) + HStack(spacing: 20) { Image("MenuIcon") @@ -51,8 +52,7 @@ struct ToolbarView: View { } } } - + .background(Color.white) } - .background(Color.white) } } diff --git a/demo-store-ios/navigation/NavigationManager.swift b/demo-store-ios/navigation/NavigationManager.swift index ec8f400..16b43fa 100644 --- a/demo-store-ios/navigation/NavigationManager.swift +++ b/demo-store-ios/navigation/NavigationManager.swift @@ -11,9 +11,11 @@ class NavigationManager: ObservableObject { self.currentScreenType = .main } - func navigateTo(screen: Content, selectedTab: ScreenType) { + func navigateTo(screen: Content, selectedTab: ScreenType? = .main) { + self.currentScreen = AnyView(screen) self.selectedTab = selectedTab + switch screen { case is MainScreenView: self.currentScreenType = .main diff --git a/demo-store-ios/utils/RemoteImageLoader.swift b/demo-store-ios/utils/RemoteImageLoader.swift index 238260e..04f10a1 100644 --- a/demo-store-ios/utils/RemoteImageLoader.swift +++ b/demo-store-ios/utils/RemoteImageLoader.swift @@ -17,19 +17,26 @@ class RemoteImageLoader: ObservableObject { } struct RemoteImageView: View { + @ObservedObject var imageLoader: RemoteImageLoader - let imageSize: CGFloat = 140 + let width: CGFloat? + let height: CGFloat? + let contentMode: ContentMode - init(urlString: String) { - imageLoader = RemoteImageLoader(urlString: urlString) + init(urlString: String, width: CGFloat? = nil, height: CGFloat? = nil, contentMode: ContentMode = .fit) { + self.imageLoader = RemoteImageLoader(urlString: urlString) + self.width = width + self.height = height + self.contentMode = contentMode } + var body: some View { if let uiImage = UIImage(data: imageLoader.imageData) { Image(uiImage: uiImage) .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: imageSize, height: imageSize) + .aspectRatio(contentMode: contentMode) + .frame(width: width, height: height) .cornerRadius(5) .overlay( RoundedRectangle(cornerRadius: 10) @@ -40,7 +47,7 @@ struct RemoteImageView: View { Image(systemName: "photo") .resizable() .aspectRatio(contentMode: .fit) - .frame(width: imageSize, height: imageSize) + .frame(width: width, height: height) .cornerRadius(5) .overlay( RoundedRectangle(cornerRadius: 10) diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 5744cd7..b23b415 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -1,6 +1,12 @@ { "sourceLanguage" : "en", "strings" : { + "%@" : { + + }, + "%lld" : { + + }, "also_bought_title" : { "extractionState" : "manual", "localizations" : { @@ -157,6 +163,9 @@ } } } + }, + "Products" : { + }, "reccomender_title" : { "extractionState" : "manual", @@ -212,6 +221,9 @@ } } } + }, + "Shop" : { + }, "show_all_button" : { "extractionState" : "manual", @@ -259,15 +271,6 @@ } } } - }, - "Subtitle 1" : { - - }, - "Subtitle 2" : { - - }, - "Title" : { - }, "top_trend_title" : { "extractionState" : "manual", From ccf5b8dca25c0c3160ec7c22c68543fafd944c63 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 10 Jul 2024 20:32:05 +0200 Subject: [PATCH 27/85] feat: Change loading image --- .../main/discover/MainDiscoverView.swift | 2 +- demo-store-ios/utils/RemoteImageLoader.swift | 68 +++++++++++-------- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/demo-store-ios/features/main/discover/MainDiscoverView.swift b/demo-store-ios/features/main/discover/MainDiscoverView.swift index c77d684..bd684db 100644 --- a/demo-store-ios/features/main/discover/MainDiscoverView.swift +++ b/demo-store-ios/features/main/discover/MainDiscoverView.swift @@ -27,7 +27,7 @@ struct MainDiscoverView: View { urlString: item.urlString, width: 140, height: 180, - contentMode: .fill + contentMode: .fill ) .aspectRatio(contentMode: .fill) .overlay( diff --git a/demo-store-ios/utils/RemoteImageLoader.swift b/demo-store-ios/utils/RemoteImageLoader.swift index 04f10a1..82a13f6 100644 --- a/demo-store-ios/utils/RemoteImageLoader.swift +++ b/demo-store-ios/utils/RemoteImageLoader.swift @@ -5,55 +5,67 @@ class RemoteImageLoader: ObservableObject { @Published var imageData = Data() private var cancellable: AnyCancellable? - init(urlString: String) { + func loadImage(from urlString: String) { guard let url = URL(string: urlString) else { return } cancellable = URLSession.shared.dataTaskPublisher(for: url) .map { $0.data } .replaceError(with: Data()) .receive(on: DispatchQueue.main) - .assign(to: \.imageData, on: self) + .sink { [weak self] data in + self?.imageData = data + } + } + + func cancel() { + cancellable?.cancel() } } struct RemoteImageView: View { - - @ObservedObject var imageLoader: RemoteImageLoader + @StateObject var imageLoader = RemoteImageLoader() + let urlString: String let width: CGFloat? let height: CGFloat? let contentMode: ContentMode init(urlString: String, width: CGFloat? = nil, height: CGFloat? = nil, contentMode: ContentMode = .fit) { - self.imageLoader = RemoteImageLoader(urlString: urlString) + self.urlString = urlString self.width = width self.height = height self.contentMode = contentMode } - var body: some View { - if let uiImage = UIImage(data: imageLoader.imageData) { - Image(uiImage: uiImage) - .resizable() - .aspectRatio(contentMode: contentMode) - .frame(width: width, height: height) - .cornerRadius(5) - .overlay( - RoundedRectangle(cornerRadius: 10) - .stroke(Color.gray.opacity(0.5), lineWidth: 1) - ) - .clipped() - } else { - Image(systemName: "photo") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: width, height: height) - .cornerRadius(5) - .overlay( - RoundedRectangle(cornerRadius: 10) - .stroke(Color.gray.opacity(0.5), lineWidth: 1) - ) - .clipped() + ZStack { + if let uiImage = UIImage(data: imageLoader.imageData) { + Image(uiImage: uiImage) + .resizable() + .aspectRatio(contentMode: contentMode) + .frame(width: width, height: height) + .cornerRadius(5) + .overlay( + RoundedRectangle(cornerRadius: 10) + .stroke(Color.gray.opacity(0.5), lineWidth: 1) + ) + } else { + Rectangle() + .fill(Color.gray.opacity(0.3)) + .frame(width: width, height: height) + .cornerRadius(5) + + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .scaleEffect(1.5, anchor: .center) + .padding() + } + } + .onAppear { + imageLoader.loadImage(from: urlString) + } + .onDisappear { + imageLoader.cancel() } + .clipped() } } From 2e5afb7d8e4294cae2a5c55f21fa22248e63faf4 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 10 Jul 2024 21:36:47 +0200 Subject: [PATCH 28/85] feat: Rename packages --- demo-store-ios.xcodeproj/project.pbxproj | 24 +++++++++---------- .../{cart => cartTab}/CartScreenView.swift | 0 .../CatalogScreenView.swift | 0 .../{main => mainTab}/MainScreenView.swift | 0 .../discover/MainDiscoverView.swift | 0 .../FullRecommendationListView.swift | 0 .../recommendation/ProductListItemView.swift | 0 .../ShortRecommendationListView.swift | 0 .../stories/MainStoriesContainerView.swift | 0 .../controller/StoriesViewController.swift | 0 .../SettingsErrroScreenView.swift | 0 .../SettingsInputCodeView.swift | 0 .../SettingsScreenView.swift | 0 13 files changed, 12 insertions(+), 12 deletions(-) rename demo-store-ios/features/{cart => cartTab}/CartScreenView.swift (100%) rename demo-store-ios/features/{catalog => catalogTab}/CatalogScreenView.swift (100%) rename demo-store-ios/features/{main => mainTab}/MainScreenView.swift (100%) rename demo-store-ios/features/{main => mainTab}/discover/MainDiscoverView.swift (100%) rename demo-store-ios/features/{main => mainTab}/recommendation/FullRecommendationListView.swift (100%) rename demo-store-ios/features/{main => mainTab}/recommendation/ProductListItemView.swift (100%) rename demo-store-ios/features/{main => mainTab}/recommendation/ShortRecommendationListView.swift (100%) rename demo-store-ios/features/{main => mainTab}/stories/MainStoriesContainerView.swift (100%) rename demo-store-ios/features/{main => mainTab}/stories/controller/StoriesViewController.swift (100%) rename demo-store-ios/features/{settings => settingsTab}/SettingsErrroScreenView.swift (100%) rename demo-store-ios/features/{settings => settingsTab}/SettingsInputCodeView.swift (100%) rename demo-store-ios/features/{settings => settingsTab}/SettingsScreenView.swift (100%) diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 2d45490..905a5af 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -146,10 +146,10 @@ 7559449C2C357E1800C274C9 /* features */ = { isa = PBXGroup; children = ( - 75ECCD0E2C36BE1000D6D346 /* settings */, - 75ECCD0D2C36BE0600D6D346 /* cart */, - 75ECCD0C2C36BDFF00D6D346 /* catalog */, - 755944A22C35858C00C274C9 /* main */, + 75ECCD0E2C36BE1000D6D346 /* settingsTab */, + 75ECCD0D2C36BE0600D6D346 /* cartTab */, + 75ECCD0C2C36BDFF00D6D346 /* catalogTab */, + 755944A22C35858C00C274C9 /* mainTab */, 7559449D2C357E4300C274C9 /* splash */, ); path = features; @@ -164,7 +164,7 @@ path = splash; sourceTree = ""; }; - 755944A22C35858C00C274C9 /* main */ = { + 755944A22C35858C00C274C9 /* mainTab */ = { isa = PBXGroup; children = ( 75674CF02C3D787A007FAB88 /* recommendation */, @@ -172,7 +172,7 @@ 75674CEA2C3D2E32007FAB88 /* stories */, 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */, ); - path = main; + path = mainTab; sourceTree = ""; }; 755944A32C35883F00C274C9 /* mainSubView */ = { @@ -323,30 +323,30 @@ path = "demo-store-iosUITests"; sourceTree = ""; }; - 75ECCD0C2C36BDFF00D6D346 /* catalog */ = { + 75ECCD0C2C36BDFF00D6D346 /* catalogTab */ = { isa = PBXGroup; children = ( 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */, ); - path = catalog; + path = catalogTab; sourceTree = ""; }; - 75ECCD0D2C36BE0600D6D346 /* cart */ = { + 75ECCD0D2C36BE0600D6D346 /* cartTab */ = { isa = PBXGroup; children = ( 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, ); - path = cart; + path = cartTab; sourceTree = ""; }; - 75ECCD0E2C36BE1000D6D346 /* settings */ = { + 75ECCD0E2C36BE1000D6D346 /* settingsTab */ = { isa = PBXGroup; children = ( 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */, 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */, 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */, ); - path = settings; + path = settingsTab; sourceTree = ""; }; 75ECCD152C36D6B400D6D346 /* resources */ = { diff --git a/demo-store-ios/features/cart/CartScreenView.swift b/demo-store-ios/features/cartTab/CartScreenView.swift similarity index 100% rename from demo-store-ios/features/cart/CartScreenView.swift rename to demo-store-ios/features/cartTab/CartScreenView.swift diff --git a/demo-store-ios/features/catalog/CatalogScreenView.swift b/demo-store-ios/features/catalogTab/CatalogScreenView.swift similarity index 100% rename from demo-store-ios/features/catalog/CatalogScreenView.swift rename to demo-store-ios/features/catalogTab/CatalogScreenView.swift diff --git a/demo-store-ios/features/main/MainScreenView.swift b/demo-store-ios/features/mainTab/MainScreenView.swift similarity index 100% rename from demo-store-ios/features/main/MainScreenView.swift rename to demo-store-ios/features/mainTab/MainScreenView.swift diff --git a/demo-store-ios/features/main/discover/MainDiscoverView.swift b/demo-store-ios/features/mainTab/discover/MainDiscoverView.swift similarity index 100% rename from demo-store-ios/features/main/discover/MainDiscoverView.swift rename to demo-store-ios/features/mainTab/discover/MainDiscoverView.swift diff --git a/demo-store-ios/features/main/recommendation/FullRecommendationListView.swift b/demo-store-ios/features/mainTab/recommendation/FullRecommendationListView.swift similarity index 100% rename from demo-store-ios/features/main/recommendation/FullRecommendationListView.swift rename to demo-store-ios/features/mainTab/recommendation/FullRecommendationListView.swift diff --git a/demo-store-ios/features/main/recommendation/ProductListItemView.swift b/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift similarity index 100% rename from demo-store-ios/features/main/recommendation/ProductListItemView.swift rename to demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift diff --git a/demo-store-ios/features/main/recommendation/ShortRecommendationListView.swift b/demo-store-ios/features/mainTab/recommendation/ShortRecommendationListView.swift similarity index 100% rename from demo-store-ios/features/main/recommendation/ShortRecommendationListView.swift rename to demo-store-ios/features/mainTab/recommendation/ShortRecommendationListView.swift diff --git a/demo-store-ios/features/main/stories/MainStoriesContainerView.swift b/demo-store-ios/features/mainTab/stories/MainStoriesContainerView.swift similarity index 100% rename from demo-store-ios/features/main/stories/MainStoriesContainerView.swift rename to demo-store-ios/features/mainTab/stories/MainStoriesContainerView.swift diff --git a/demo-store-ios/features/main/stories/controller/StoriesViewController.swift b/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift similarity index 100% rename from demo-store-ios/features/main/stories/controller/StoriesViewController.swift rename to demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift diff --git a/demo-store-ios/features/settings/SettingsErrroScreenView.swift b/demo-store-ios/features/settingsTab/SettingsErrroScreenView.swift similarity index 100% rename from demo-store-ios/features/settings/SettingsErrroScreenView.swift rename to demo-store-ios/features/settingsTab/SettingsErrroScreenView.swift diff --git a/demo-store-ios/features/settings/SettingsInputCodeView.swift b/demo-store-ios/features/settingsTab/SettingsInputCodeView.swift similarity index 100% rename from demo-store-ios/features/settings/SettingsInputCodeView.swift rename to demo-store-ios/features/settingsTab/SettingsInputCodeView.swift diff --git a/demo-store-ios/features/settings/SettingsScreenView.swift b/demo-store-ios/features/settingsTab/SettingsScreenView.swift similarity index 100% rename from demo-store-ios/features/settings/SettingsScreenView.swift rename to demo-store-ios/features/settingsTab/SettingsScreenView.swift From 9aa2f0e87ccb029440e1db80c24d4623750193e6 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 11 Jul 2024 21:40:55 +0200 Subject: [PATCH 29/85] feat: Add catalog image points view --- Podfile | 14 +- Podfile.lock | 15 +- Pods/Manifest.lock | 15 +- Pods/Pods.xcodeproj/project.pbxproj | 2398 ++++++++++++----- ...store-iosUITests-acknowledgements.markdown | 47 + ...mo-store-iosUITests-acknowledgements.plist | 59 + ...ts-frameworks-Debug-input-files.xcfilelist | 4 +- ...s-frameworks-Debug-output-files.xcfilelist | 4 +- ...-frameworks-Release-input-files.xcfilelist | 4 +- ...frameworks-Release-output-files.xcfilelist | 4 +- ...re-ios-demo-store-iosUITests-frameworks.sh | 4 + ...e-ios-demo-store-iosUITests.debug.xcconfig | 6 +- ...ios-demo-store-iosUITests.release.xcconfig | 6 +- ...s-demo-store-ios-acknowledgements.markdown | 47 + ...Pods-demo-store-ios-acknowledgements.plist | 59 + ...os-frameworks-Debug-input-files.xcfilelist | 4 +- ...s-frameworks-Debug-output-files.xcfilelist | 4 +- ...-frameworks-Release-input-files.xcfilelist | 4 +- ...frameworks-Release-output-files.xcfilelist | 4 +- .../Pods-demo-store-ios-frameworks.sh | 4 + .../Pods-demo-store-ios.debug.xcconfig | 6 +- .../Pods-demo-store-ios.release.xcconfig | 6 +- .../Pods-demo-store-iosTests.debug.xcconfig | 6 +- .../Pods-demo-store-iosTests.release.xcconfig | 6 +- demo-store-ios.xcodeproj/project.pbxproj | 6 +- .../xcschemes/xcschememanagement.plist | 2 +- .../catalogTab/CatalogScreenView.swift | 65 +- .../mainTab/discover/MainDiscoverView.swift | 4 +- .../recommendation/ProductListItemView.swift | 12 + demo-store-ios/viewModel/SdkViewModel.swift | 5 +- resources/Localizable.xcstrings | 28 +- 31 files changed, 2197 insertions(+), 655 deletions(-) diff --git a/Podfile b/Podfile index 8de313e..625387c 100644 --- a/Podfile +++ b/Podfile @@ -1,10 +1,10 @@ -platform :ios, '12.0' +platform :ios, '13.0' target 'demo-store-ios' do use_frameworks! pod 'REES46', :git => 'https://github.com/rees46/ios-sdk.git', :branch => 'master', :tag => '3.6.19' -# pod 'Swinject', '~> 2.8' + pod 'SDWebImageSwiftUI' target 'demo-store-iosTests' do inherit! :search_paths @@ -18,7 +18,13 @@ target 'demo-store-ios' do end post_install do |installer| - installer.pods_project.build_configurations.each do |config| - config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + xcconfig_path = config.base_configuration_reference.real_path + xcconfig = File.read(xcconfig_path) + xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR") + File.open(xcconfig_path, "w") { |file| file << xcconfig_mod } + end end end diff --git a/Podfile.lock b/Podfile.lock index e5e2492..220eaee 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,8 +1,19 @@ PODS: - REES46 (3.6.19) + - SDWebImage (5.19.4): + - SDWebImage/Core (= 5.19.4) + - SDWebImage/Core (5.19.4) + - SDWebImageSwiftUI (2.2.7): + - SDWebImage (~> 5.10) DEPENDENCIES: - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) + - SDWebImageSwiftUI + +SPEC REPOS: + trunk: + - SDWebImage + - SDWebImageSwiftUI EXTERNAL SOURCES: REES46: @@ -18,7 +29,9 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb + SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d + SDWebImageSwiftUI: 65a2c8b4b0d9577f2e11556cb163cc4613b9ee54 -PODFILE CHECKSUM: 904ef94ca4cc9c5fb28bf31df73479a3e0a72263 +PODFILE CHECKSUM: 4d55473ee53d2bc58b313538de6caff4ba97b096 COCOAPODS: 1.15.2 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index e5e2492..220eaee 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,8 +1,19 @@ PODS: - REES46 (3.6.19) + - SDWebImage (5.19.4): + - SDWebImage/Core (= 5.19.4) + - SDWebImage/Core (5.19.4) + - SDWebImageSwiftUI (2.2.7): + - SDWebImage (~> 5.10) DEPENDENCIES: - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) + - SDWebImageSwiftUI + +SPEC REPOS: + trunk: + - SDWebImage + - SDWebImageSwiftUI EXTERNAL SOURCES: REES46: @@ -18,7 +29,9 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb + SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d + SDWebImageSwiftUI: 65a2c8b4b0d9577f2e11556cb163cc4613b9ee54 -PODFILE CHECKSUM: 904ef94ca4cc9c5fb28bf31df73479a3e0a72263 +PODFILE CHECKSUM: 4d55473ee53d2bc58b313538de6caff4ba97b096 COCOAPODS: 1.15.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 986522b..d9e1b9c 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,374 +7,774 @@ objects = { /* Begin PBXBuildFile section */ - 000B92572AB3BA2EF78F29FC06720F72 /* FontFamily.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */; }; - 00E4A44ED57BE79A80742EFB71221A8F /* Coverable+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */; }; - 0334759C415B8CF146E61AB99FE69227 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */; }; - 03FFFE029584CC21DD2FDC4369224B1E /* NotificationHandlingServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */; }; - 05438BA0424A6EACD940A12BADEA800A /* UIFont+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */; }; - 05921ED246B06FE8677425ED82B6C032 /* TBTextConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */; }; - 077CADF6F924345A3E25E7D7003BBD5E /* URLSessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */; }; - 091DF2ED562F9F9107EF807638E22662 /* SearchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */; }; - 0CFFB84337D831CA8EF3617D7DB3772E /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A791B748A86BE064FA80C12134F8E728 /* Loader.swift */; }; - 0F50D04988DAEFAB5D74706EE6591588 /* StoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */; }; - 1016ABA1F6A6BFBDE0EA9FC87B86A858 /* ViewConfigService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */; }; - 13EAE9F36834227AC6603F76D54DD1D4 /* SlideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */; }; - 14242A0D3156633A69FB084B10C60EDB /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */; }; - 14D4D1A202CB5C785E18D2ED9A93F81D /* StoriesSlideReloadIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */; }; - 155C4149B624787E4BAAA07B1D4EBD39 /* REES46-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */; }; - 18BA7C889427497D1A009D85662C46CE /* SdkGlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */; }; - 1905EBF3E70183BFC8580F3819F692CC /* NotificationHandlingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */; }; - 19FF735430577E28E963D72D58DF655C /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFC11AC8252C36F4B476D4E56652E41 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1B6FDB2F5513BFAA3FB1BB1B851B236F /* SdkImageReloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */; }; - 1C778D789F4B0897A6037CB978826072 /* RecommendResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */; }; - 1D0FCF6225378C95A3246107F648C538 /* TexBlockConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */; }; - 1DABF66E97AD95FCF260BA3176E86685 /* TrackingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */; }; - 1E35871E2E937C15DD42093DF742998B /* RecommendationsWidgetViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */; }; - 1F215B81847B4CD4B36342CE793CF473 /* RegisterNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */; }; - 20AED63279F202C3174FE802C696B9A1 /* VideoDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */; }; - 20FBF01A41A066522B5DEDF65AE31666 /* SearchWidgetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */; }; - 210280AA598517CF989A582413B25FCB /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */; }; - 216F659702FE03B7987F7AE153DC0185 /* ColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */; }; - 217043CCF240C170FBA603D1CD39C65A /* TrackServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */; }; - 21A6687D0BA31E63C8800D2C9F20CC70 /* ImageLoaderError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */; }; - 246ABC711084B7E4CC7B4A27989AB69E /* PushTokenNotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */; }; - 24A6C06C7F607033FE51591F7D66A682 /* SdkStyleCustomColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */; }; - 2868EA3EDB5D52CB4B54C1C280421595 /* StoriesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */; }; - 289E24AFFFBE57287ADD4AB22F17A4B9 /* SdkDynamicFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */; }; - 28F8EF2658BA628CA99983594C415D09 /* RecommendationsWidgetConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */; }; - 2A3ACC61257E4E88DE782C3CD1BC0CCE /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C82152B76290FC32122F96E2333F17 /* Assets.swift */; }; - 2D32B1BFDFC57E7BAFF6B73C30F42DFC /* NetworkStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */; }; + 000B92572AB3BA2EF78F29FC06720F72 /* FontFamily.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3608D39B06183B948806E8EF8CC4845 /* FontFamily.swift */; }; + 00E4A44ED57BE79A80742EFB71221A8F /* Coverable+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE7BB19A4817A68FC4C4F6FD47397D4 /* Coverable+UIKit.swift */; }; + 0170EE86BA8B1D7872B62745E0C01BBE /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A4C76575F957CF7FF3972130D58A634 /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 023934AA4CE4DC87CF03A03C73ECA714 /* SDDisplayLink.m in Sources */ = {isa = PBXBuildFile; fileRef = B9D73BB06718EE0ED3AA135424012A3E /* SDDisplayLink.m */; }; + 0334759C415B8CF146E61AB99FE69227 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5CD261183F527F9CCEE033F6D042CCB3 /* Assets.xcassets */; }; + 03FE09B9F7504CA3AE5116F1AA698DD7 /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = A7CCF7778104AADB2758AF4CEBDA340C /* SDWebImageError.m */; }; + 03FFFE029584CC21DD2FDC4369224B1E /* NotificationHandlingServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3A4DBF13FAB22ACF605B960D791CCDB /* NotificationHandlingServiceImpl.swift */; }; + 04FE5E229D14053DDD6AC83FC3D9AFC6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; + 0529F5E309FEF38A1C578FBC56EE042E /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 609A44AA239B50B276698311810DF46C /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 05438BA0424A6EACD940A12BADEA800A /* UIFont+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6882D4A05CE1AEF7EBD19E019E3D1D9 /* UIFont+FontInjector.swift */; }; + 05921ED246B06FE8677425ED82B6C032 /* TBTextConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2158DADDE006E15A6B82206F7E1E5A /* TBTextConfiguration.swift */; }; + 06DEC5667C8AD8AD090B5B3817193625 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = D557FCA56AFC2021F32B40BC6AE7328F /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 077CADF6F924345A3E25E7D7003BBD5E /* URLSessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E55C9080F6947D033E6CE6E6A43847C /* URLSessionQueue.swift */; }; + 07863507770757C4059FD22123EB757D /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 81A7464CC9CCCD0F6CEAB02954C74B71 /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 08A9406F1F5800998D7CD7C1C4DF870E /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = D60D48DCE60F43070C743D0563F167BC /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 091DF2ED562F9F9107EF807638E22662 /* SearchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C0EEC89204EC719332D585D5E222E61 /* SearchResponse.swift */; }; + 09BDBBF0B88B52D2ACBB454BDBA94CAB /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = 65C49FAC640F96CEADE5484866E0FC4E /* UIImage+MemoryCacheCost.m */; }; + 0A1E121A8F4DAFDFBA2C6551AED0B082 /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFA328C3A9F9D9DA68AF6E8DC309DDB4 /* SDImageCachesManager.m */; }; + 0A45B5FE1BE72B7672F5B52CD2DD67FB /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B8531EA1CC88039F9D35056BBDB103A7 /* PrivacyInfo.xcprivacy */; }; + 0C24DB1B347FCDCDA9B579CBEA896B7F /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E9CD98B980FB05A787A2A69CFBF17D /* SDWebImageTransition.m */; }; + 0CFFB84337D831CA8EF3617D7DB3772E /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31C677B04BBC412F101723A7541968AE /* Loader.swift */; }; + 0DDBFF7516C2F40018EB5DEDADAA268E /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B38071E71CDBC65FB0D4D71CF0F240A7 /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0E3E4B48C26FF73290F17C1EFE6026DA /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CC320234FBEEEB88843D7C10B8E7556D /* SDAnimatedImageView+WebCache.m */; }; + 0F2C8EDFFA5ADD894DC8D59811AB5B95 /* StateObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F374469A65E69F71CF1A960B8DE8DAE /* StateObject.swift */; }; + 0F50D04988DAEFAB5D74706EE6591588 /* StoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78AC9897341C6AD6139546E65E3C671B /* StoryViewController.swift */; }; + 0FC5A479554857FC38A3C8753351191E /* SDWebImage-SDWebImage in Resources */ = {isa = PBXBuildFile; fileRef = CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */; }; + 1016ABA1F6A6BFBDE0EA9FC87B86A858 /* ViewConfigService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42AB298A5E3CB9C3744EEB483D776066 /* ViewConfigService.swift */; }; + 107828081DC817509AEA4BC0755995CF /* Transition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D89D1669ADB46DF58317A31AA0D920 /* Transition.swift */; }; + 10DED49C2B45A5EA8FA6968F1AE7D28E /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E3BECA1A98E38D6A4281546005B73B48 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 116875A435A6C285919C97C0AE6DCA28 /* SDImageAWebPCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 913A2C2605A42A57859DA310AC8C704F /* SDImageAWebPCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 13EAE9F36834227AC6603F76D54DD1D4 /* SlideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A684C681F875FE1D6779FA17B5C84369 /* SlideViewController.swift */; }; + 14242A0D3156633A69FB084B10C60EDB /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 482071A65FE0E3F977402AE06FA26155 /* ImageLoader.swift */; }; + 142E1D597048C8800BFA18FD4A9DD701 /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = E557D339D8D4F28B0349B09C6C53DFCC /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 145165256BC172DDCDC0575DC1D6D3F3 /* SDAnimatedImagePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = F27900774BD5451523048BE1D45BA68C /* SDAnimatedImagePlayer.m */; }; + 149FDD80A26F399AFBD57325998EFDF6 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 77DA9FAF14BC95865EB72E3778D3DD5E /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14CD7E5A556FE8ED2CD06E81839F3B0E /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C823347DAB1A2B3C3EAEAFACF196622 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14D4D1A202CB5C785E18D2ED9A93F81D /* StoriesSlideReloadIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2441B4F7FE69F4332827D34054B38A /* StoriesSlideReloadIndicator.swift */; }; + 1501440AF1C85CB575F269E26BCEC459 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BA06266BAF144C3649CAA2E2C46C9386 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 155C4149B624787E4BAAA07B1D4EBD39 /* REES46-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A95D2D8B4A55B4954DFF4C2BE59121C /* REES46-dummy.m */; }; + 16E7B447883B3E6CD5DA0C0F799AEE09 /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 12FBF0A87753C1C15550A9EDE725073D /* SDImageCodersManager.m */; }; + 18BA7C889427497D1A009D85662C46CE /* SdkGlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1313A8AE0C4379298D7EF36BE6AA65F4 /* SdkGlobalHelper.swift */; }; + 1905EBF3E70183BFC8580F3819F692CC /* NotificationHandlingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5FB4BE9DAD06FEA5F98A303DCDA7ECA /* NotificationHandlingService.swift */; }; + 19EF8FDECF0A3B0DDF44ED4B7393C865 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C4114AD9CA9739A7AFF00200C9E5FF /* Indicator.swift */; }; + 1AC07A8630B73493200FD547678823F9 /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 72BAC27599E684B921A906800DBB9B3E /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 1B6FDB2F5513BFAA3FB1BB1B851B236F /* SdkImageReloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0CB1CDEA4C5E4895994FB47085D4E3 /* SdkImageReloader.swift */; }; + 1C778D789F4B0897A6037CB978826072 /* RecommendResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9917CE73936AE2F6F9845457B644BFDB /* RecommendResponse.swift */; }; + 1D0FCF6225378C95A3246107F648C538 /* TexBlockConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505853D80AB9D71C6B962F6B106CA899 /* TexBlockConfiguration.swift */; }; + 1D361EE4E09C00F9148CE67CCD306D29 /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DD3508B88FE26F6A3F11E3592EABE76 /* SDWebImageCacheKeyFilter.m */; }; + 1DABF66E97AD95FCF260BA3176E86685 /* TrackingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F8EDA1E36291EC7D5833D2F1347675F /* TrackingService.swift */; }; + 1E35871E2E937C15DD42093DF742998B /* RecommendationsWidgetViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8530AFBFB841B3BC722B46A2526C34AA /* RecommendationsWidgetViewCell.swift */; }; + 1EADA61A88A52EBF1F841282FB177F9D /* SDCallbackQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = F7F41EC0C09AF0533629C82C319871A2 /* SDCallbackQueue.m */; }; + 1EC1EB5F3B98D4BCB6A057344815682C /* SDWebImageTransitionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 50CE6E565037959B2AC4CEB87052B390 /* SDWebImageTransitionInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 1F215B81847B4CD4B36342CE793CF473 /* RegisterNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE2DC5138E439FCCEC29C8B4AD17B2D /* RegisterNotification.swift */; }; + 20AED63279F202C3174FE802C696B9A1 /* VideoDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACC7F80B4FA266A86011287DD80262CC /* VideoDownloadManager.swift */; }; + 20FBF01A41A066522B5DEDF65AE31666 /* SearchWidgetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 884C25BFA10C3C4A63320C3A5B7797EE /* SearchWidgetExtension.swift */; }; + 210280AA598517CF989A582413B25FCB /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEF1E5F2C7F33C39B10991E4C2386C7E /* NotificationService.swift */; }; + 216F659702FE03B7987F7AE153DC0185 /* ColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D18ACE031C79021DEEF21AB4FA0A05 /* ColorExtensions.swift */; }; + 217043CCF240C170FBA603D1CD39C65A /* TrackServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCAB701B1958806B999110D217BE4269 /* TrackServiceImpl.swift */; }; + 2177290E4AC6DAFDD746C8BA7EEF8B45 /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B0B4109307136D655FFB5991A75A5DC /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21A6687D0BA31E63C8800D2C9F20CC70 /* ImageLoaderError.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABC60206222E6A71DE4443E593C4CBD1 /* ImageLoaderError.swift */; }; + 2420216F493F3D0E2038DDF1E8E8C7C6 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 65AE02622EA56AB3A84F2D7776259B6F /* UIImageView+WebCache.m */; }; + 246ABC711084B7E4CC7B4A27989AB69E /* PushTokenNotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EB8ED5238870DEA90CCE8D421113FC2 /* PushTokenNotificationService.swift */; }; + 24A6C06C7F607033FE51591F7D66A682 /* SdkStyleCustomColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AFB98DB5CEBD45082FDCFAE8E610335 /* SdkStyleCustomColorSchemeAwareViewController.swift */; }; + 25476F441F2CCC8C9608477DE5A0A44A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C58E5652FE52EBEEC8CFECDDAB7690EA /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */; }; + 267E6BB583A54AA6BB91C1AAA9109BC2 /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C410EC9FA1D242644C94FD5BB0DCC7F /* SDAnimatedImageView.m */; }; + 2868EA3EDB5D52CB4B54C1C280421595 /* StoriesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD12F79A7009CE1C816858354BB28B16 /* StoriesView.swift */; }; + 289E24AFFFBE57287ADD4AB22F17A4B9 /* SdkDynamicFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4145512C78F59C07A8ADA786E0C0D0AE /* SdkDynamicFont.swift */; }; + 28F8EF2658BA628CA99983594C415D09 /* RecommendationsWidgetConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = A918F55072B1534B417AA4F202B62150 /* RecommendationsWidgetConstants.swift */; }; + 2953DE694482D1C43BBCDE5F4B7492C1 /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB1FB349361E086596E4A2F0DB86B38 /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2A3ACC61257E4E88DE782C3CD1BC0CCE /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = E212E372E7728F282D004A4FE04E8399 /* Assets.swift */; }; + 2A72F0DC1AF8897A89626C3E81B611F5 /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 65A52C786ED0456F2DD0D7E95F90F8B8 /* NSImage+Compatibility.m */; }; + 2D32B1BFDFC57E7BAFF6B73C30F42DFC /* NetworkStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC6D190307998671654651402F1CE476 /* NetworkStatus.swift */; }; + 2D521703994D252F0E6D24F7D5D53F2E /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 029A00422820699B153B476831592226 /* SDWebImage-dummy.m */; }; 2ED0D7AE2F2531563EBC0135C853AE8E /* Pods-demo-store-iosTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FB9E93A5A045ADF557378B54D551DDE /* Pods-demo-store-iosTests-dummy.m */; }; - 34EF675DD2AB530F8C16D96F7D198E33 /* RecommendationsWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */; }; - 3726922467DD0501527002C0C31278E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - 3728D15DC1AE882F703003FDF14D52F0 /* SdkStyleColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */; }; - 38AFD9246E6995657D1EDE99EBC6CEE5 /* RWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */; }; - 39AE9A2AD1B349F39699B3578E56BF00 /* SdkStyleCustomColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */; }; - 3C0BFC786BED0FA23523678B73728154 /* RWebViewController_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */; }; - 41822CFDBD9C86FB87B351EBFEC58073 /* ProductsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */; }; - 41CC97B0C6B55C160191247F4CF2D8ED /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C58E5652FE52EBEEC8CFECDDAB7690EA /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */; }; - 42C4319E1A92EB4B2BB51E51D1E14D1F /* SdkQueryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */; }; - 44D5997FBA69F54DF6D3B0D068C7953D /* ImageLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */; }; - 44E68CF722456B675ABF6D715C514AC6 /* SdkStyleCustomFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */; }; - 45EB33BB9930BD56B2C0E09F8F7598DE /* VideoDownloadObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */; }; - 469C92E04B9D2D4F8392EE02C7A39C69 /* Pods-demo-store-ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C72C00B34C83096ED3147E8AAAD8EAE /* Pods-demo-store-ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 46DCEDA235C161852B926A0EF943EACC /* Data+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */; }; - 473ABA01905DAFFF8D07DEB476A9D75D /* SdkStyleCustomFontSizeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */; }; - 48A2019E7B6882B3B0C6BFF5A49E2C24 /* StoryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */; }; - 49DEB29E8A22D8F5F67907D19A906F18 /* SearchWidgetTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */; }; - 4CBB873363589E883524864FFBFE17D2 /* CarouselConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */; }; - 4DF1CC4FC7EAEB5C38F32AA1C39C5A07 /* PushTokenHandlerImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */; }; - 53758A7E257766681ECCDFEE4288C35D /* UIFontDescriptorUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */; }; - 53FD279BE6D27EC46BF71734B84F51A8 /* SearchWidgetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */; }; - 56369E2C8C8213D51A72552106A9C264 /* ImageData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */; }; - 56B8E8C41883E4FC7F171F62949E04BD /* SdkStyleCustomColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */; }; - 5A234484C926A75BA80099AEC8CC4611 /* SearchWidgetObjectification.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */; }; - 5DCEC664244099368ABFA62172F815C6 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */; }; - 5E8FB1E21260A9D830B33A759E4627F6 /* UIViewController+PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */; }; - 6447E67AD574E06A2B69690B0B29BC89 /* SdkActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */; }; - 66724EBA9152FA748810F92BAF9F80DC /* SubscriptionServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */; }; - 681A5A71427454B12747295ECDD0D24C /* NetworkRadioType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */; }; - 6DEFEFA0016D535ADBAD7B823B156E7D /* SdkFontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */; }; - 6E6B81FC768C9444F194B10B259FA696 /* SdkStyleUIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */; }; - 71A9026CA64F36A0A121DD4060BB5BB9 /* PushTokenNotificationServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */; }; - 71CDDF6B42C2D0D1CC5A94AB0BE99E23 /* UIBezierPath+Circle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */; }; - 72A17042882104723E9CA92A14D80CC1 /* URLLiteralConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */; }; - 73BBCA8BA8E0D143006C01813759AC18 /* SdkStyleColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */; }; - 78AF773DEA2008B6FE70C40246E48D18 /* TBAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */; }; - 79D2610CEAF017AD0332D7F90672483A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - 7B10C150677B6261882D5C0C1297F00F /* StoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */; }; - 7CA7335FA31F5B8BF6A8FFA433CEE3AE /* CGSize+Min.swift in Sources */ = {isa = PBXBuildFile; fileRef = F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */; }; - 7EB26E79BA128D1E2F994D902036286C /* SearchWidgetListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */; }; - 81091327D041DE2EDC26B207E3584D0E /* UIBezierPath+ImagePlaceholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */; }; - 835A6430B8B241FF5E042D4415103DDD /* RView_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */; }; - 8AE54E966BB7B8583BF5B5BD952BDF0A /* UIImageView+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */; }; - 8B15040F27C854C43BE632FB8D86B683 /* TextBlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */; }; - 8BACD88871220B13AB285BC476A7F194 /* StoryCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */; }; - 8C1057083C31FF842CEEEF864911D1A4 /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */; }; - 8CE4BF9FB621CF956CB6262F53B07C83 /* NetworkStatusObserverUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */; }; - 8D05D7544E96EB065022900C06BD8BDA /* ReloadButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */; }; - 8D50E5745C533C21E8EAE239F4E59FC3 /* PromoCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */; }; - 90547932EA32076C22D800BDAD445A1F /* SearchWidgetCategoriesButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */; }; - 92E5F181D61E15ACB5931E80F5DDBBDB /* Stories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */; }; - 93C9B6D59CF164493225BB90330ED9CB /* SubscriptionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */; }; - 9550440BCB953E622CC97EFB797E3C07 /* StoriesImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */; }; - 9653EFA6AC3DDF7D0F90B549C485C9F9 /* RequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */; }; - 96F98929440C537CC83107C3747D6480 /* CarouselCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */; }; - 9997384531CF394E13FCDB94F6354C9A /* SessionDataTaskProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */; }; - 99B5996FC38567CF3ED494041F3E3BF1 /* Operative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */; }; - 9D19EE689D681F8493419C2CA1FB6D5E /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */; }; + 2F0830F8256C8DC58F0919A5D5C07C06 /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93852F96F75724CE63ED467E5C544270 /* SDAsyncBlockOperation.m */; }; + 2FA9B480039C913FD3352BFF4DDCAEFC /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 7180342E0BEDD11728D7A13F83122F1A /* SDWebImageDownloader.m */; }; + 31454EEA78669CAFA2CFD0E18609F80D /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 94A8EBE7ECE2DEB427F6FEE4AFAFCA25 /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 317A2085CE162CFE3EC3ED9FB3514201 /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = C2480646E98913D695E05C0FD776B508 /* SDImageHEICCoder.m */; }; + 31C998E878D5A0F686B187864A236183 /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = B8DAA896D2C34C91B3625C9591FA0310 /* SDWebImageCacheSerializer.m */; }; + 34EF675DD2AB530F8C16D96F7D198E33 /* RecommendationsWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A872CADF5D680724A3A6EFB82C356231 /* RecommendationsWidgetView.swift */; }; + 3728D15DC1AE882F703003FDF14D52F0 /* SdkStyleColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1161FDAF59CC1A383B889BA00AA0DB /* SdkStyleColorSchemeAwareViewController.swift */; }; + 387C8094E1C055C789587185E97E18E4 /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C03EC13E1567E28D939C4CB1E36878E5 /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 38AFD9246E6995657D1EDE99EBC6CEE5 /* RWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A24CFBF01D0409EB666BB081480520E /* RWebViewController.swift */; }; + 38E10CECD2C6C59C0CCCEB0A78D40CC1 /* SDFileAttributeHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = CBD844A1FA21892ABF089EC57D9B69A0 /* SDFileAttributeHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 39AE9A2AD1B349F39699B3578E56BF00 /* SdkStyleCustomColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EA0880546F5C765AE10ECC6D442C87E /* SdkStyleCustomColorScheme.swift */; }; + 39B39F80D3373C1F6C7BAB344310A1C9 /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = A18B7AA27C00B2187B45D6ED87A6451F /* UIView+WebCache.m */; }; + 3C0BFC786BED0FA23523678B73728154 /* RWebViewController_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 249102CF81952267B123A666190DF430 /* RWebViewController_Extensions.swift */; }; + 3DC4D729B8A196329EA5A3DE5EFA370F /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 39D601084E48E12065CB0FB34E2814BF /* SDImageCache.m */; }; + 4146EC26D7DDF32ECAE445B119479D30 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = C4975126590177D7FBC347D4110732AB /* SDWebImageError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 41822CFDBD9C86FB87B351EBFEC58073 /* ProductsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5A6FA54151953B32A9EE306274468A /* ProductsButton.swift */; }; + 41FF38113D3DE2C65D63D29AD0055EA1 /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E5615848B998FCBF7B3C601180F6533 /* SDImageGraphics.m */; }; + 42089E46D48B162B0AC3566F846764BE /* NSBezierPath+SDRoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = 828C3606A950C4AAE88974C9EEB6B09E /* NSBezierPath+SDRoundedCorners.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 421344238409756CF07372155FC3421C /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 05D020DF7555623CE56D7342B92089D6 /* SDImageFrame.m */; }; + 4262A44B8089903161C54AD186379ABA /* SDDisplayLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D6FDAFF796C99AED706D3F44F4A7B8F /* SDDisplayLink.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 42962685B499575129CDFF254E8FEE4F /* SDAnimatedImagePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = BB5652D277DB8F8932201F454562E551 /* SDAnimatedImagePlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 42C4319E1A92EB4B2BB51E51D1E14D1F /* SdkQueryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17D8267AF1AFF8A10E7F8F01C219FBE /* SdkQueryBuilder.swift */; }; + 43DA4C5AD87FBD2334FEED50DD133D4F /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5120A81E18A4375BE2C935A99E02B5 /* UIView+WebCacheOperation.m */; }; + 43F93ED54EC176295EF366A740E01172 /* SDDeviceHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E6864BAD54FAD2C378EF2E1230E626AD /* SDDeviceHelper.m */; }; + 449F6DDFDA01061F0B001BCB31ED4455 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 119A30548ED1F294262DAA76E2314B8F /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 44D5997FBA69F54DF6D3B0D068C7953D /* ImageLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72B32CD662708347A951F5E371409877 /* ImageLoading.swift */; }; + 44E68CF722456B675ABF6D715C514AC6 /* SdkStyleCustomFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3973838B69DCC92B65F9C777E03C51 /* SdkStyleCustomFonts.swift */; }; + 45C47D2E7DC2AC0332CDD2323355F483 /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0BDF6EBE4794388029C368DD323927 /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 45EB33BB9930BD56B2C0E09F8F7598DE /* VideoDownloadObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 677CA2D06DDE5144350FEB4B400D5B12 /* VideoDownloadObject.swift */; }; + 4624831E1C1A912E31BA028AD4C1FA7C /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BAFD4926F5BEF0E7D2592ACDAEA47F3 /* SDWebImageDownloaderConfig.m */; }; + 46DCEDA235C161852B926A0EF943EACC /* Data+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 343136082AD2F8FDA2DECD6015D2A952 /* Data+ImageLoader.swift */; }; + 473ABA01905DAFFF8D07DEB476A9D75D /* SdkStyleCustomFontSizeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99BAC905278C2BD1A35C579C966CB859 /* SdkStyleCustomFontSizeAwareViewController.swift */; }; + 480C90679D30599E736F886A01D5EC27 /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C625FCC124326FD82C5D1D495462CBA /* SDImageLoadersManager.m */; }; + 480EB117CA823BBA38F531F048DC5D9B /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = EE16E01FB33A81A9861F1386657A95E2 /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 48A2019E7B6882B3B0C6BFF5A49E2C24 /* StoryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9895A84C8FC7A836604C935D35C99AC6 /* StoryCollectionViewCell.swift */; }; + 48F66F6D3C7386E5595633DE1311F129 /* UIImage+ExtendedCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = E8576C6FF926E093E1A16B8080253AED /* UIImage+ExtendedCacheData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 49DEB29E8A22D8F5F67907D19A906F18 /* SearchWidgetTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2819399D5A22E8D3E3D2E88DF6D2FE /* SearchWidgetTextField.swift */; }; + 49F80B73F8E31BDC1CD2986181817AD5 /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EC2D0B5064579CD0BF56EAFC0792E9A5 /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A1C144BA28F389620F8656FF5DA412A /* SDWebImageSwiftUI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5ABAC2D6EBFC4451BB54CDBAB40DADA3 /* SDWebImageSwiftUI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A88FAAE5AFA7650E7A2E1F1C31B4E0E /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E21105E533FF43048ACF1009CF05F4F /* SDWebImageIndicator.m */; }; + 4BC4C53C7CA74C73E4841FC2CD3E32C0 /* ActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BBD8F1415E27C7782213FF9A17A0355 /* ActivityIndicator.swift */; }; + 4C4F24464D027DE21E5FB02DEB40D8C0 /* ProgressIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01E4D39E9A3693888369174B21333E5A /* ProgressIndicator.swift */; }; + 4CAA295F8BB967445E2273FB5A53769E /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = CA91031AD1B1A421B1E129492D976C39 /* SDImageLoader.m */; }; + 4CBB873363589E883524864FFBFE17D2 /* CarouselConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD4ACEF0B3F4E25B59359F4A0C563E1 /* CarouselConstants.swift */; }; + 4DF1CC4FC7EAEB5C38F32AA1C39C5A07 /* PushTokenHandlerImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3BF456C51A01CDF0D5F36F822566AC /* PushTokenHandlerImpl.swift */; }; + 4DFCB3D9623FCA43D3E1BFDA528EB587 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C0B64B639FD80A20B3EEBE805B0C5B2 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4EC633971567BFD6384859B76E1276F1 /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C1D8A05C1E4B2166E04A020BADD37E6F /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4ED0BD508A169B5BD2FC92A540597F0F /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFC11AC8252C36F4B476D4E56652E41 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 50856AC35DAB64C96C34BC588BB0F7FE /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 01949FADB1DF51BC47166556FEBFE773 /* SDAnimatedImage.m */; }; + 51F93BB4A8A45852EB003139085145C4 /* UIView+WebCacheState.m in Sources */ = {isa = PBXBuildFile; fileRef = 50E032345F0385B49508C224E5FAB205 /* UIView+WebCacheState.m */; }; + 52304420361292CCFC74D707D76A89E6 /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0950384B82209DB75A156574D201B451 /* SDDiskCache.m */; }; + 53758A7E257766681ECCDFEE4288C35D /* UIFontDescriptorUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D34EFF0527DB3EBA71D8FB52A3425C9 /* UIFontDescriptorUsage.swift */; }; + 53FD279BE6D27EC46BF71734B84F51A8 /* SearchWidgetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 200E09C6F7210CD35EC2DFC6CDB47964 /* SearchWidgetViewController.swift */; }; + 56369E2C8C8213D51A72552106A9C264 /* ImageData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E25B0169BDF269969E4586C420B6160 /* ImageData.swift */; }; + 56B8E8C41883E4FC7F171F62949E04BD /* SdkStyleCustomColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9183AB97B95E41B7E371EC4DE2A2DF30 /* SdkStyleCustomColorSchemeAwareView.swift */; }; + 56ED612030120A0397156D40650605F1 /* UIImage+ExtendedCacheData.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C7BE26FDD9A42E5961777E59579165F /* UIImage+ExtendedCacheData.m */; }; + 59C42C2827C8752D9488E217C5DDD820 /* SDWebImageDownloaderDecryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = CD162A74396D56FCB345484D359792F2 /* SDWebImageDownloaderDecryptor.m */; }; + 5A234484C926A75BA80099AEC8CC4611 /* SearchWidgetObjectification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017C9D4AD83B9F48EC84C7462F77C1C2 /* SearchWidgetObjectification.swift */; }; + 5D9A37A8D628C6BB9FCA2EF74E352C9C /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 721D6D167B5F76DE3399711D8B8F1980 /* SDWebImageDefine.m */; }; + 5DCEC664244099368ABFA62172F815C6 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DBCC89758D18BE019ACCF9F4FB1DA29 /* UIColor+Extension.swift */; }; + 5E8FB1E21260A9D830B33A759E4627F6 /* UIViewController+PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26642982FB2133E4B543A2C337BA2E9D /* UIViewController+PromocodeBanner.swift */; }; + 5EC172A3A600E629AF4AD75C304DA2C9 /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E75A98569DB590F251712101F570DDF /* SDImageIOCoder.m */; }; + 61BF5909F8FFEC516CA898FDBD838959 /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = A7ABCAC767B04BBD3402CDF2E10D7BA2 /* SDImageCachesManagerOperation.m */; }; + 62796BA9266A3343CDB31913D051B1F2 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 967A3684F3A19FB31E7EEDBCEE8E376D /* SDWebImageCompat.m */; }; + 62B9FB2BAB0F70C3705B33D50FEEFBD2 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AD885D3D57E81A6E96E0E72504B6C8 /* ImageIO.framework */; }; + 63266AB53E590025F95E8472A2A75E66 /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 385D24232663F9F21F5D0C0F0DA7A763 /* SDImageCoderHelper.m */; }; + 6447E67AD574E06A2B69690B0B29BC89 /* SdkActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 742684B14C7933490E61EE78305318F0 /* SdkActivityIndicator.swift */; }; + 65550AE399A68358D1031A676C06A364 /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 48F8626ED92FAA27298CB92425BE0288 /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6581039AAD4BF84784812194E353F279 /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E183E61E8F24778ED0F299E9CDF7098 /* SDInternalMacros.m */; }; + 66724EBA9152FA748810F92BAF9F80DC /* SubscriptionServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF5C7C77DE2A108B989B598603A71255 /* SubscriptionServiceImpl.swift */; }; + 67752F2EB4D3E1F9BC130046FB76BCE4 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DA2EDB38D52E3A594FD04DDF1FC4DD8 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 67EAF96CF5371E0EDF2F1976BA0A8DA4 /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = BA7C2D0D5068F1BBBF48D4DECAD5B3F9 /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 681A5A71427454B12747295ECDD0D24C /* NetworkRadioType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CA7AD6F6144B1897DD6FED6EF086315 /* NetworkRadioType.swift */; }; + 688EBC4BD1F3F76ECA4C72FEC494D84D /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B17F5BDD1F69B5C7C4A70BF44675BE /* NSData+ImageContentType.m */; }; + 6B2576EF432DFDD2422B66193CED0582 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 89E336EB6E5CA8CBA413FD162AC5E781 /* SDWeakProxy.m */; }; + 6D117033384F7B7E733B92455725CFA0 /* ImageViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBDC88DD3BCA0C8036016944005827F /* ImageViewWrapper.swift */; }; + 6D98092F5BB4629EA76E90BB0D5A3A1E /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 95A5032C5249239170C6C56B8BEC1620 /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6DEFEFA0016D535ADBAD7B823B156E7D /* SdkFontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE98821C5B55540B75A1E35C0113ED01 /* SdkFontInjector.swift */; }; + 6E6B81FC768C9444F194B10B259FA696 /* SdkStyleUIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A915682692C4576BD1B3382EDD4A31 /* SdkStyleUIApplication.swift */; }; + 6E8F67D76FD92D5C1136F15A50BF9EB5 /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B3CD2DB27E7FF6985AF2F043DFBA34BF /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 702044FE1045183AEA5C6DD23E0741A4 /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 63BAD4815E80530574567C6C941B7D35 /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 71A9026CA64F36A0A121DD4060BB5BB9 /* PushTokenNotificationServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0452D8A6588B9906902D3781A81B7E02 /* PushTokenNotificationServiceImpl.swift */; }; + 71CDDF6B42C2D0D1CC5A94AB0BE99E23 /* UIBezierPath+Circle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D29315E37F8FAAC6F6BA17562D6B51 /* UIBezierPath+Circle.swift */; }; + 72A17042882104723E9CA92A14D80CC1 /* URLLiteralConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA90567D2B0F1D5538610C5715BF9684 /* URLLiteralConvertible.swift */; }; + 73BBCA8BA8E0D143006C01813759AC18 /* SdkStyleColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9686077291842E1BE3E92A4CBB2D01D5 /* SdkStyleColorScheme.swift */; }; + 78AF773DEA2008B6FE70C40246E48D18 /* TBAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8EA8AFF4FC1C0B82EF0EC412051B3A /* TBAppearanceConfiguration.swift */; }; + 78DB4B4F958566E37A72D04F973FEBED /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = DA1EBEE93335802768CDDA7AEF9A60AA /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 79D2610CEAF017AD0332D7F90672483A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; + 7A5E9FDF0D7B71DDA61A79F171D0DBDE /* SwiftUICompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A8808B6DC1E046BFF8C17824E0A56D3 /* SwiftUICompatibility.swift */; }; + 7ACAFB8878D787E4FB3D716750C91E8C /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 36F5D2A790ECA81D45F8B61225A715D5 /* UIImage+MultiFormat.m */; }; + 7B10C150677B6261882D5C0C1297F00F /* StoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C54D76765D76345DEE85C2577A0BE71C /* StoryButton.swift */; }; + 7B48B4E11B3E9E10BDD274DC84A27DE5 /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CFA6F80E28B127534C67C258F67330D /* SDDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7B6078F9AEBF848D77F519AF8FBC77E2 /* SDGraphicsImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EF2C06F474A7E1365D101FD38EDD192 /* SDGraphicsImageRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7CA7335FA31F5B8BF6A8FFA433CEE3AE /* CGSize+Min.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9192461900ECBFD6FCBF2CD9D32503F /* CGSize+Min.swift */; }; + 7EB26E79BA128D1E2F994D902036286C /* SearchWidgetListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3698F76D18FEE0AB0114FA9A9D14C380 /* SearchWidgetListView.swift */; }; + 81091327D041DE2EDC26B207E3584D0E /* UIBezierPath+ImagePlaceholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAB1F97077878093D8E2B46380CF317E /* UIBezierPath+ImagePlaceholder.swift */; }; + 8150F3F396A29D249217B5B1BEF13E50 /* SDImageAWebPCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BF55A80D900FC0E395B74E5440155DA /* SDImageAWebPCoder.m */; }; + 81D05C82B68E50B5E348E31B16402F53 /* SDAssociatedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = E57F4AF8733A55E946FD8FB15751E71A /* SDAssociatedObject.m */; }; + 82239DAE4AFBA4142974FBD8EB4620BF /* SDWebImageSwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146D16A186D47FCB0B2ABB8F0506282D /* SDWebImageSwiftUI.swift */; }; + 835A6430B8B241FF5E042D4415103DDD /* RView_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BDF4C10853BB55579BDCA649F2DE846 /* RView_Extensions.swift */; }; + 85F13CDCA1FADE0ACF2BE361CAB99E0C /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = D45C11F2FD76BEC707586E6425FF78E0 /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 86AA5A87E46FE0919A0A19BA722F4AAC /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 085AEFC7C28A15F206741200F820F38B /* SDWebImageOperation.m */; }; + 8A626CEC7CBA9E3859A3FD8B147ECB90 /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 779D3AACB3FFC5D21447E5995A7D8169 /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8AE54E966BB7B8583BF5B5BD952BDF0A /* UIImageView+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 243098A6435E355225C685FEBB0EA576 /* UIImageView+ImageLoader.swift */; }; + 8B15040F27C854C43BE632FB8D86B683 /* TextBlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2F28C758806CA9B47233D61569AC4AE /* TextBlockView.swift */; }; + 8BACD88871220B13AB285BC476A7F194 /* StoryCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8E029187C788F90556669DD25F177EB0 /* StoryCollectionViewCell.xib */; }; + 8BFA637561CFFFD755077574D42FD312 /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = CB360C271FF5A9ACB1881BD995CD3EA9 /* SDWebImageDownloaderRequestModifier.m */; }; + 8C1057083C31FF842CEEEF864911D1A4 /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0563BCB9D5C982E10E671FD25E79729B /* UserSettings.swift */; }; + 8CE4BF9FB621CF956CB6262F53B07C83 /* NetworkStatusObserverUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7327B126F904459685ACAB5BB188BA92 /* NetworkStatusObserverUI.swift */; }; + 8D05D7544E96EB065022900C06BD8BDA /* ReloadButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 166CAE72B58135935C298B971F0E810A /* ReloadButton.swift */; }; + 8D05ED41A2FF6C70B78706F15F6098FE /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7640F97184806A9AE6D038E779EA1B9B /* Image.swift */; }; + 8D50E5745C533C21E8EAE239F4E59FC3 /* PromoCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE90C578EE2F80BD131A4785E590A767 /* PromoCodeView.swift */; }; + 8D739A0E851C00DBE71DB9A2667D4588 /* SDImageFramePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 66FC775DB87F1F5E3A252D7C0DB818ED /* SDImageFramePool.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 90547932EA32076C22D800BDAD445A1F /* SearchWidgetCategoriesButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3739778E07523A3175EF42603E6D8CD /* SearchWidgetCategoriesButton.swift */; }; + 90E9C7C7189370C95BEE1EB205BB4CDB /* WebImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51DD1AEB1ED0805DAE2DB69242F0495A /* WebImage.swift */; }; + 91218968238F58BBB3E84DC5C8A25854 /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 693D0696C64D9BB4F4BCC7D548564FB8 /* SDImageLoader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92A408FEDAA401A41A7A235717062F82 /* SDWebImageSwiftUI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 19D828BE41B227FC99AB956B45805E0D /* SDWebImageSwiftUI-dummy.m */; }; + 92E5F181D61E15ACB5931E80F5DDBBDB /* Stories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C45D4459990807F360105B4C2BD6B5B /* Stories.swift */; }; + 937D6966FD44A9A799ED6574EC78CC4F /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = B7144CB0515E7DD6254EBD33FB925996 /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 93C9B6D59CF164493225BB90330ED9CB /* SubscriptionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A5C1DEACE9944682E1C538D1E696FE /* SubscriptionService.swift */; }; + 9550440BCB953E622CC97EFB797E3C07 /* StoriesImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 182B458C0DB3AF459F99260B902F1E3B /* StoriesImageLoader.swift */; }; + 959F820757DC746FDF7A3CD739523627 /* OnChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16A84119C929C7999C74B194789C2339 /* OnChange.swift */; }; + 95D0B99765E4BDDF38FF3BAFE1B1395E /* Pods-demo-store-ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C72C00B34C83096ED3147E8AAAD8EAE /* Pods-demo-store-ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9653EFA6AC3DDF7D0F90B549C485C9F9 /* RequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4726050844C07463EDF54E7B9C36FD61 /* RequestOperation.swift */; }; + 96A5AC180E6F93402E7E57E2F592A3E8 /* ImageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2860E468BFF18CAD7EED73F4C53D8 /* ImageManager.swift */; }; + 96F98929440C537CC83107C3747D6480 /* CarouselCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C131B5AD1AE17B1E7669FF4AD7F634F2 /* CarouselCollectionView.swift */; }; + 978A73763500D7A9A4A0F878716CAC12 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; + 9997384531CF394E13FCDB94F6354C9A /* SessionDataTaskProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4839081A2EE7970A91843BDFB777B4F /* SessionDataTaskProtocol.swift */; }; + 99B5996FC38567CF3ED494041F3E3BF1 /* Operative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9560E66C017A7924466F9F2ED43805A9 /* Operative.swift */; }; + 9A19F8AF4CE027DF5271D2DAF670014C /* ImagePlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E474B6985E4834A59099E70AE48070CD /* ImagePlayer.swift */; }; + 9AF09A8AF1301B3B97DA1E5B76A19645 /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = FED305701BEF72D8FA302970F6C0F799 /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9D19EE689D681F8493419C2CA1FB6D5E /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9B08A53140D0BE71718A5F3E03BE881 /* UserDefaultsExtension.swift */; }; + 9E1DDCCA92AF0B9F1D1C6A670877FF59 /* AnimatedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43C26A9ABBBD30D24AAC918843657EC /* AnimatedImage.swift */; }; 9E2500E6DDD2ADAF4D773649B7A360C9 /* Pods-demo-store-iosTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E23C6A0C21CCDEEED0DAC1168FC8DE30 /* Pods-demo-store-iosTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A09249CC7461C9EC873C4AB82C16124B /* SdkFontInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */; }; - A150E969EA20BF59B3CF070A4240F180 /* HashStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */; }; - A1BE35C271D2217C0B4232D0AB0C8DA3 /* StoriesCollectionViewPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */; }; - A20FF0BB2984AC66216074B1EFBE8F98 /* RawRepresentable+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */; }; - A2D682E7527D83413A35CA870AF7B766 /* SdkApperanceViewScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */; }; - A5234B6659FC63CB96F6BC93C9D05DB7 /* SimplePersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */; }; - A84F0846ABE5B8D3E87FB73531F706A4 /* LoadingPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */; }; - A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A969E1ACC2EEF44464751BAB8DEB684E /* InitResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */; }; - ABCFB3FD321DE180968A5A0B2BB86A62 /* StoriesCollectionViewPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */; }; - AC146C49CFAC1C9EBDB2BAAF57FDD984 /* SettingsManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */; }; - AE87C2623409B5C7F73B12649F5B26E5 /* UIImage+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */; }; - AEB0C53C27CB087C3215538B6F476A33 /* CartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */; }; - B08BD0363F34B4423E46FDBAB017A26C /* VideoFileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */; }; - B14B39DD5BE9A500B163EE27C544AA2B /* CAPropertyAnimation+Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */; }; - B1FF3AA160C3354557A6B38A48756E98 /* Pods-demo-store-ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 37529AFAE21E524BB5CF8528DBDBFF62 /* Pods-demo-store-ios-dummy.m */; }; - B29CDD67B86238DFC22CB13179C4DAAA /* PersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */; }; - B2C4ADFF7916C0CA794767779FCF79D6 /* CGRect+Center.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */; }; - B3768606656AAEE8FE776B7A823030B1 /* Coverable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */; }; - B3C75BB3596FA47232F49322F2851860 /* SearchWidgetDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */; }; - B4C27A1D9F4EC266C766251289AA689E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - B56C23C1C826628465D0881A71FC3346 /* SearchWidgetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */; }; - B886B2522D2C093BBCE9844BBC2A84AE /* ViewConfigPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */; }; - BA66BD722D1029DB90B91889AE435938 /* SdkStyleColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */; }; - BBCDC6622412DD3C491775830A55FE4D /* RecommendationsStarsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */; }; - BD49D731800904B988C8A771E0C1A9CC /* SdkStyleCustomFontSizeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */; }; - BF0485F5C192F225E4B519B7F2793DFC /* NetworkConnectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */; }; - BFC831FD30B89FC45404A6CBC78D2BEA /* NetworkConnectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */; }; - BFD7143593CAF751E9C8344B20488F31 /* UISdkWrapLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */; }; - C204C6976B8B9ACE9797F222AA6ECCA5 /* GenericDataTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */; }; - C3B214337422238B6F16DDD4D83FE86A /* SearchWidgetMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */; }; - C800B58B3331444C8BB27C4F89D2CE44 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */; }; - C88C545BF7521C369D2602C552A551A8 /* TextBlockConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */; }; - C9042F117FB2359CFFAE2A484BCAD759 /* SearchWidgetHistoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */; }; - CEDD87245EDA33E6EED478D04CFF3863 /* SdkConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */; }; - D0925D984A33493CBD8748EF9A3B91D3 /* Option.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */; }; - D0A994B97078D246BFD4805C729AC6FC /* SearchWidgetListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */; }; - D0D410CA575CE4E459381557FDEFA3A5 /* StoryBlockImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */; }; - D9B862FA4640C84B16DF0E2AF96459D3 /* TBFontConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */; }; - DA38244A91BEB77E42BD4F150B807505 /* ManagedViewConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */; }; - DEB27EE51D09D55258D69927B56120DB /* InitService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */; }; - E0B0ED3036DA4A0A5A0CA0FD17D1B9DF /* SessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */; }; - E0D9CD065B64C0D661B5FD42FEB79918 /* SdkStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */; }; - E385668DBCD81215689D1543C955E46A /* SdkPopupAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */; }; - E49668B0B739D147E3414D17D4A0BA0E /* SearchWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */; }; - E761A05087F0E09F0DC407500FEE98E2 /* ProductsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */; }; - E7E128BBA990CA16D6C7D2E12C7451B3 /* CGImageSource+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */; }; - E9CC56086B144A2A4193EF27C59F6FB1 /* CarouselCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */; }; - ED9F4F1DEDFDBEFCD5E129DA9755A705 /* PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */; }; - F38F22B4A2A822E5BC40C664C5943FB9 /* Disk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */; }; - F5AB8C4608DCCA8557A248A0EF9D3571 /* NetworkStatusObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */; }; - F685A237C47426370D2AC2956285C3E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - F6DEE3FA2EF0113730454100EEE86756 /* StoriesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */; }; - F83B27F3BA95658EAD242D8EC0FF4C91 /* SlideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */; }; - FA8B5D62D1F65F6083B7FF811EB32EBB /* SearchWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */; }; - FF76EE2CCAF3321D9F471F7D3BC05971 /* SessionOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */; }; + 9EB6CDD8F5E5570798DE4D2C6D9EEAAA /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = DDADBA9A1CB5524DE20EC11A40E0AD62 /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9EF20C969A3D26AFF74A35A376270C62 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BC56B47FC5C9CC44C3585CA3C9561D9 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9F9BC40A239CEA83F849DDC2C4F375A7 /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = B9453C5A02D3E773A8845189A2EF3E5B /* UIImage+Metadata.m */; }; + A02EEFC96DF92AB78F933CBC0CBAFD92 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 19CB0A67BA30881F8E68E3431B761F02 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A09249CC7461C9EC873C4AB82C16124B /* SdkFontInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2238B2DE53D04D375D323CDE28F19A0F /* SdkFontInstaller.swift */; }; + A150E969EA20BF59B3CF070A4240F180 /* HashStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6F7531755893C43B30BF9E19D560519 /* HashStorage.swift */; }; + A1623A8868E9AC8BBEAAB9BC0421F463 /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = CF3EEBF138E337F258E50A3999B2C0D4 /* SDImageCacheDefine.m */; }; + A1BE35C271D2217C0B4232D0AB0C8DA3 /* StoriesCollectionViewPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2B921ED7BF87B51971BDCC684F43C49 /* StoriesCollectionViewPreviewCell.swift */; }; + A20FF0BB2984AC66216074B1EFBE8F98 /* RawRepresentable+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC97720D830D4D8C05B9307B8708AF6C /* RawRepresentable+FontInjector.swift */; }; + A2D682E7527D83413A35CA870AF7B766 /* SdkApperanceViewScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CF07AF8F15177CC07ABE9749506EBE /* SdkApperanceViewScheme.swift */; }; + A2DCD1D36D93DFF9EBA04C27FD6523E8 /* SDAssociatedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 79161E2AE3EBB7A8C5037E3821873380 /* SDAssociatedObject.h */; settings = {ATTRIBUTES = (Private, ); }; }; + A4A3E992003457010F66F3D6BCC2A5C3 /* SDWebImageDownloaderResponseModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 446B5D79A9B5EFBF90DDBEC5B0006A76 /* SDWebImageDownloaderResponseModifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A4E7010E8D87921AE6F9D645B7CDA53A /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 24783625BE78E3C757479BA61BFAC0A6 /* SDImageAssetManager.m */; }; + A5234B6659FC63CB96F6BC93C9D05DB7 /* SimplePersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2391013284B0804D94D42F1224978E1 /* SimplePersonalizationSDK.swift */; }; + A5BBB698DF1D4480FD47F982C5252205 /* SDCallbackQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 66892A39AD576FB00A0E72D743C5B5F4 /* SDCallbackQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A84F0846ABE5B8D3E87FB73531F706A4 /* LoadingPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AB3A266BBA953A7F6B46B26085D6C56 /* LoadingPlaceholderView.swift */; }; + A8A9DA6C580EAE3E50B590CEDF0A45CC /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 791F99A8CC2762A65CBEF72F99CBB292 /* UIImageView+HighlightedWebCache.m */; }; + A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 768349C5A7EF0A50AC2FEACF23C4EFD5 /* REES46-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A969E1ACC2EEF44464751BAB8DEB684E /* InitResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB269F7C83AFFDDCF8E8834DA023EEF5 /* InitResponse.swift */; }; + ABCFB3FD321DE180968A5A0B2BB86A62 /* StoriesCollectionViewPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9BF3DE04FA1C4CA5110A837D4B2A26F5 /* StoriesCollectionViewPreviewCell.xib */; }; + AC146C49CFAC1C9EBDB2BAAF57FDD984 /* SettingsManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F269AE423D51077DA2EC0CD40577E5BF /* SettingsManageable.swift */; }; + AC32A22FA700A7C519DA105353C169C9 /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D093835AC080A50072C58F9D8F4E0A9B /* SDImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ACD7FED5646A645F3EDA3F2521156451 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F9E8DB46CE03201B31155CD1C20A209 /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ADDD26B99A6D54C00956C6BE7349D77E /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 054F9EA00DA4E6B7B90CA2D91C46007C /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AE7A9D612B96E5CADA59EFE4591DDB83 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DECD257A7D9712BFEF049E58533DD45 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AE87C2623409B5C7F73B12649F5B26E5 /* UIImage+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DE906CE80C33B4E27DCFC2A3F937122 /* UIImage+ImageLoader.swift */; }; + AEAA0FB549FD88F595F943D8CD4317DF /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 5AE0E2DC679FA76AFCBE4F10C002B5E8 /* SDWebImagePrefetcher.m */; }; + AEB0C53C27CB087C3215538B6F476A33 /* CartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D5B8E3E17032CC03AC3DA26F631C0A9 /* CartItem.swift */; }; + AF42AB272E74275D08F989B9111E045A /* SDGraphicsImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 05CB137A80B79559FF8A751F6E3C15B7 /* SDGraphicsImageRenderer.m */; }; + B08BD0363F34B4423E46FDBAB017A26C /* VideoFileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24AAE5386CBFCCFEDA6C8E44F6E48C3D /* VideoFileUtils.swift */; }; + B14B39DD5BE9A500B163EE27C544AA2B /* CAPropertyAnimation+Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC55D6A899A85EB0F0868B73A6F51F6 /* CAPropertyAnimation+Key.swift */; }; + B29CDD67B86238DFC22CB13179C4DAAA /* PersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3945BB4F984C8941E625264678DEC70C /* PersonalizationSDK.swift */; }; + B2C4ADFF7916C0CA794767779FCF79D6 /* CGRect+Center.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7E9A5DEA0D84EB96ABDCE752E5FE97 /* CGRect+Center.swift */; }; + B311644D4FB2B084755B97F9E62D0517 /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BA638D7683BDDA60DC86AD84777743A4 /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3768606656AAEE8FE776B7A823030B1 /* Coverable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 245CD06BD01C6A94F1C8153D1F912FCC /* Coverable.swift */; }; + B3C75BB3596FA47232F49322F2851860 /* SearchWidgetDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 567F0CCECCB2EFE5CF5E90BD862FC225 /* SearchWidgetDelegate.swift */; }; + B435123EA0DFB080DDF204A68B76B649 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FD013C1407EF41F0DB420AF3709D869 /* SDWebImageDownloaderOperation.m */; }; + B56C23C1C826628465D0881A71FC3346 /* SearchWidgetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7861E34249B83262CAAC89AE6B545E /* SearchWidgetModel.swift */; }; + B71EF2A111D54884A8BA6AA0E502B5C3 /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = ADC7B43237FE86C4ED670AA6A7264CB9 /* SDmetamacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; + B726740C01CEC8A342988863B3C6666D /* NSBezierPath+SDRoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = 58F71D4BD9974824651245DBC500E711 /* NSBezierPath+SDRoundedCorners.m */; }; + B7B3F548D939A885B87BC38F24AC9118 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = CE44DD5CCECDDF5CE93F504C6A95D0C4 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B80FCEF5ABC014B09963F4E65BDE3C41 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 156E069BEAD7BB288F1EAB97FDDD68F4 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B886B2522D2C093BBCE9844BBC2A84AE /* ViewConfigPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB6821FE781E61F57C7ABBEE79CD491 /* ViewConfigPlain.swift */; }; + BA66BD722D1029DB90B91889AE435938 /* SdkStyleColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E928DA9D56257D7E66B7FD04D4FBB6A /* SdkStyleColorSchemeAwareView.swift */; }; + BB31CC54186DDAAD89F139C89B93CA7C /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C4AC7B7715AD884E51877A463095BF1 /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BBCDC6622412DD3C491775830A55FE4D /* RecommendationsStarsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 784409CEDE904360420A93E233B1448E /* RecommendationsStarsView.swift */; }; + BCF0F618DE852A99D0E09482FE1AD6DB /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F054392BF6A08C9DBF6FB98AE4A633F3 /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD49D731800904B988C8A771E0C1A9CC /* SdkStyleCustomFontSizeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AD6725039854C49B298640ED0545CE6 /* SdkStyleCustomFontSizeAwareView.swift */; }; + BDDD8451EC24E029EE5394AD6B29E479 /* UIColor+SDHexString.m in Sources */ = {isa = PBXBuildFile; fileRef = D33604BF63E7A1EEFE13AA897DC73B16 /* UIColor+SDHexString.m */; }; + BF0485F5C192F225E4B519B7F2793DFC /* NetworkConnectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6AE3B6A7C454F39D7DC1A21465B15CD /* NetworkConnectionType.swift */; }; + BF67904B4E6C8359A5540C1516DC35DD /* SDFileAttributeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 302A8EC471B54D588E44D73F09C36F82 /* SDFileAttributeHelper.m */; }; + BFC831FD30B89FC45404A6CBC78D2BEA /* NetworkConnectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38246598EB440279D380C257FCBCCA52 /* NetworkConnectionStatus.swift */; }; + BFD7143593CAF751E9C8344B20488F31 /* UISdkWrapLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A89615CA3748B4B574FF3BF0D984A51 /* UISdkWrapLabel.swift */; }; + C118334CFB7C43F8EFE615B0C66C1078 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 51BFD59F8F32B660DCC66F98EFD1A6CE /* UIImage+GIF.m */; }; + C204C6976B8B9ACE9797F222AA6ECCA5 /* GenericDataTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A3B19D8F5A4D74B59E5858C18A89C7 /* GenericDataTask.swift */; }; + C2B0B7C3409DC4089F347C18C2C5218A /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = E7C26425398E790B8A16DE4A3A0F5B6F /* SDAnimatedImageRep.m */; }; + C35EED1B7854674B923283BF02AE95DC /* Pods-demo-store-ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 37529AFAE21E524BB5CF8528DBDBFF62 /* Pods-demo-store-ios-dummy.m */; }; + C3B214337422238B6F16DDD4D83FE86A /* SearchWidgetMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F180D6C6E0768F6A5BC4E1257E5AD297 /* SearchWidgetMainView.swift */; }; + C4F6E2A79BD3990086848911AC8B7F89 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E9C09EE96235DC612E7FDB70D8EB98 /* SDImageAPNGCoder.m */; }; + C56A825525BCBE955CFE58C7C747B754 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F1B596D47CB175EBED6915E6C02D2ED /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C737716F0120D6554E508ACD1ACA45C0 /* Overlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D5C931E8B3C42904FF08B0AA8E499A /* Overlay.swift */; }; + C77923E363A3C9D4829376BE0EB08DFC /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = C70EF61B85CB5E0C32E22E64A24C5419 /* SDWebImageOptionsProcessor.m */; }; + C800B58B3331444C8BB27C4F89D2CE44 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59F75F6EA505E9D0CB9B0B15D958665 /* Navigation.swift */; }; + C88C545BF7521C369D2602C552A551A8 /* TextBlockConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B13A2564427A5D3271A22CC081B485 /* TextBlockConstants.swift */; }; + C8A9EB5DED9F08B5FCD153955FC14E93 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C5299BDBCFF31D3A149189632F841108 /* UIButton+WebCache.m */; }; + C9042F117FB2359CFFAE2A484BCAD759 /* SearchWidgetHistoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A037FFEC91A5918877DAF898310E6F /* SearchWidgetHistoryButton.swift */; }; + CBBF4F7A773A62DC87CF698A4CC9F272 /* UIView+WebCacheState.h in Headers */ = {isa = PBXBuildFile; fileRef = E9C5B9C0B9AC8F9C02C59534F887327F /* UIView+WebCacheState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CBE2CD6C13ED59FC6DCA9AF08D1E2406 /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = FDF8837D160CBDE98E1A5352392752A4 /* SDImageCoder.m */; }; + CEDD87245EDA33E6EED478D04CFF3863 /* SdkConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CF075E9AF0C9F42704B25D11A12D16F /* SdkConfiguration.swift */; }; + CFD8696312B3334FF17C0412FB20CED6 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = AAC6B9F7A35D8F631BD99CED340CCC92 /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0925D984A33493CBD8748EF9A3B91D3 /* Option.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD5541895541D62F5397A02BB8F31386 /* Option.swift */; }; + D0A994B97078D246BFD4805C729AC6FC /* SearchWidgetListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA1970B7E000CD93CD5ABDD9C90EF69D /* SearchWidgetListViewCell.swift */; }; + D0D410CA575CE4E459381557FDEFA3A5 /* StoryBlockImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C7FCEF6B42BE8D00A3F1BACC9822867 /* StoryBlockImageCache.swift */; }; + D0DBC5DD0A2D887A2940BA0329217484 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F6F6267F550D1B9B7ACD345C3E0668 /* NSButton+WebCache.m */; }; + D4316084185FD6513BC83544B2A45E82 /* SDDeviceHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C8C91A282536A9AD77BFAB844A8F376 /* SDDeviceHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; + D439144D48C9FE1BA35022F0A6A736C8 /* SDWebImageDownloaderDecryptor.h in Headers */ = {isa = PBXBuildFile; fileRef = D6079445C8FAC7E4FF570DA98DBD49E4 /* SDWebImageDownloaderDecryptor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D531DD839DFEF7D21041913C6B1BF95E /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DF5621E59EA431F7D24B338AF41DAF1 /* UIImage+Transform.m */; }; + D67C939C3709BFCC9711E3DAD0854801 /* SDWebImageDownloaderResponseModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = E74B0A47D66512282E1FA639A6693404 /* SDWebImageDownloaderResponseModifier.m */; }; + D727D42D3C6D75079100C9E2CDE45C59 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 31A27027A1324B45B2F6F5C9BFA7EE29 /* UIImage+ForceDecode.m */; }; + D9B862FA4640C84B16DF0E2AF96459D3 /* TBFontConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A25CA20AE6CA0E7F3C0889BC83B80448 /* TBFontConfiguration.swift */; }; + DA0591ACC058D6673CFC94A664BDD51B /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B7A6F0159639AD7880D2D68CF10C375F /* SDMemoryCache.m */; }; + DA1C286C34DC7C7148BFD027A80C9605 /* SDWebImageSwiftUI.h in Headers */ = {isa = PBXBuildFile; fileRef = FAA2A1D8B3E0092C5A2D6AACF916118C /* SDWebImageSwiftUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA38244A91BEB77E42BD4F150B807505 /* ManagedViewConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1501C7067A26F553918FA75C59C74AD1 /* ManagedViewConfig.swift */; }; + DB558A40B5AACA3DF4BDD7167C48CE71 /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9342870F1B17CE6B55C0E506E939EB84 /* SDImageGIFCoder.m */; }; + DD4972517202F35B26B7B659B095D40B /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = D7DD9C8AB753B4EE55CBE39498167210 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DEB27EE51D09D55258D69927B56120DB /* InitService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A0926E6B50E9D5ABA0EF2C4D5E88642 /* InitService.swift */; }; + DF480FFE4BD46226C855A72CD81E50E8 /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC817825B6B9D79C94B440B657997769 /* Backport.swift */; }; + E0B0ED3036DA4A0A5A0CA0FD17D1B9DF /* SessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ACDB23A88E6462C13BAA8CF2F5388C6 /* SessionQueue.swift */; }; + E0D4D74CF9A15AAB4D8EBA35D68449C0 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 0747F2B66D5854265EBF7A4B9CDCA0EC /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E0D9CD065B64C0D661B5FD42FEB79918 /* SdkStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F7D9DCF90BD5C51C99013B92EAE9DB /* SdkStyle.swift */; }; + E35A96AD62BB29B7ABA3779606A3DB2B /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 14B77A4BA58A9F1E17C8E687B03430D5 /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + E377EFE16FB8C700C69171DD7AE4FFA9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; + E385668DBCD81215689D1543C955E46A /* SdkPopupAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C3468CC76B2C7BB10CED3DE5EFCA58 /* SdkPopupAlertView.swift */; }; + E49668B0B739D147E3414D17D4A0BA0E /* SearchWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05955F66D9A388DB5300C283B9ED82E5 /* SearchWidgetView.swift */; }; + E501E0E956F164F9E90453CC10766DFA /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 965F1DCE80D5E47223972A8914CF7D2E /* SDImageIOAnimatedCoder.m */; }; + E5E9A039F53F6FD7F998A44451EFD9AF /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E7CAF23E69EC6B7DB7D7CDEFC96C5C6 /* SDWebImageManager.m */; }; + E761A05087F0E09F0DC407500FEE98E2 /* ProductsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCCC47E503FC830A95DAD71006D4257 /* ProductsResponse.swift */; }; + E77CB069D70FF4125B9E064B49C001D0 /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 79E8E12D344406C699B8AB3CC0B36E2C /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7E128BBA990CA16D6C7D2E12C7451B3 /* CGImageSource+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 906C31FFD1D1B75E909C241295F4C0A2 /* CGImageSource+ImageLoader.swift */; }; + E9CC56086B144A2A4193EF27C59F6FB1 /* CarouselCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC5479EE341C9CAE3AAC92B34E3BD4F /* CarouselCollectionViewCell.swift */; }; + EABA337CA83C9ED09E2DA7F54F501750 /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = B6DCA8DE902167DD220E0157EB047FD9 /* SDImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ED9F4F1DEDFDBEFCD5E129DA9755A705 /* PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 718751286835CE61DAC86CF985BEB152 /* PromocodeBanner.swift */; }; + F0171E13E25FD40D6B6F869966ED8B08 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FE7246FC198AE307DAD3891ADC5FE80 /* SDImageCacheConfig.m */; }; + F1F06EEE1B902B10F5D0CFD6F7A80DA1 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = EB8CA267F48ED012779151542F11CD03 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F2ACB8606ABB790DD64FE3D1C2A99AD7 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 153B813592BB94FAFB1B69B37EB2DED1 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F33A3ECCE1CA579C4ED9F9A2B3B90044 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EFEBEB2D698CB52B18D32D8A44CB117C /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F38F22B4A2A822E5BC40C664C5943FB9 /* Disk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025A544F19BC6987E72A6A0A9B1726CA /* Disk.swift */; }; + F4ADCF115B337B7C483F9C0064646182 /* SDImageFramePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 764CCAEDDE803665E562352946EBBFA8 /* SDImageFramePool.m */; }; + F5AB8C4608DCCA8557A248A0EF9D3571 /* NetworkStatusObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 722820E2AECBDB9CE88DF1F28EDC4C2A /* NetworkStatusObserver.swift */; }; + F60F32E5C1B049086A5625B865FA75DF /* UIColor+SDHexString.h in Headers */ = {isa = PBXBuildFile; fileRef = 012F10698C136315708F93A29670131E /* UIColor+SDHexString.h */; settings = {ATTRIBUTES = (Private, ); }; }; + F685A237C47426370D2AC2956285C3E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; + F6B78FD74DB177217EB13A1C5F6E31E8 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C4A6E08625EBFD1238EB565499849E3 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F6DEE3FA2EF0113730454100EEE86756 /* StoriesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0886A006FB6D7A5B26FA5DD74922C871 /* StoriesView.xib */; }; + F83B27F3BA95658EAD242D8EC0FF4C91 /* SlideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16D28C22EDFBA5210E8F26B745E30C7F /* SlideView.swift */; }; + FA8B5D62D1F65F6083B7FF811EB32EBB /* SearchWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22DF9F8F7A569CC3F4DEB6EBC4102FE1 /* SearchWidget.swift */; }; + FACD362497B989F8C4445B5C7C340CDD /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BA417CE2D73128F66E80F6070CA08EE /* SDImageTransformer.m */; }; + FAE83A0A03CED37F7817A8B623A7734E /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 4546F55366F817C14243B677296A3BEB /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FF45293373DD3208E626AACA6EE03513 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; + FF76EE2CCAF3321D9F471F7D3BC05971 /* SessionOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8239B94A327381F223C720106BF41938 /* SessionOperation.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 40C2C9959393295F1B86C75B81551CC4 /* PBXContainerItemProxy */ = { + 2B029E60540F41DAED3EF429AB0F6B86 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 80CA65F514DD5B1DC5829F29295F6292; - remoteInfo = "Pods-demo-store-ios"; + remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; + remoteInfo = SDWebImage; + }; + 2C892BD4D849AC22F2605C37038732CF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 92EBFA3E7005B4C18A9C0B44324EB80F; + remoteInfo = SDWebImageSwiftUI; }; - 97FD9F25B8F6CE6ACEDF790C858E79E0 /* PBXContainerItemProxy */ = { + 40A7CB4B0A15AA26A286237C3DC95BE1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 0C03A6912D025B497528F2C7FFE2F1D5; remoteInfo = REES46; }; - DCDA243612AE8D7094728CC593FF8178 /* PBXContainerItemProxy */ = { + 542A9B83BEF9F0BD938799CC124BE455 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 0C03A6912D025B497528F2C7FFE2F1D5; remoteInfo = REES46; }; + 7097CE6E72D7582F22EAD3655DE54080 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 92EBFA3E7005B4C18A9C0B44324EB80F; + remoteInfo = SDWebImageSwiftUI; + }; + 8C40AB809AAB92156705FE0682FB8425 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; + remoteInfo = SDWebImage; + }; + A99F31A5E5D289319F21440CF2383E43 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 94CFBA7D633ECA58DF85C327B035E6A3; + remoteInfo = "SDWebImage-SDWebImage"; + }; + C11ED8B5E2E81E3D5DDCCC1AE1E2D4D4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; + remoteInfo = SDWebImage; + }; + F08BBAD3B89A5D7B7714C68348C87676 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 80CA65F514DD5B1DC5829F29295F6292; + remoteInfo = "Pods-demo-store-ios"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromoCodeView.swift; path = REES46/Classes/Button/PromoCodeView.swift; sourceTree = ""; }; - 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionServiceImpl.swift; path = REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift; sourceTree = ""; }; - 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInstaller.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift; sourceTree = ""; }; - 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLSessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift; sourceTree = ""; }; - 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigService.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift; sourceTree = ""; }; - 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkRadioType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift; sourceTree = ""; }; + 012F10698C136315708F93A29670131E /* UIColor+SDHexString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+SDHexString.h"; path = "SDWebImage/Private/UIColor+SDHexString.h"; sourceTree = ""; }; + 017C9D4AD83B9F48EC84C7462F77C1C2 /* SearchWidgetObjectification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetObjectification.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetObjectification.swift; sourceTree = ""; }; + 01949FADB1DF51BC47166556FEBFE773 /* SDAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImage.m; path = SDWebImage/Core/SDAnimatedImage.m; sourceTree = ""; }; + 01E4D39E9A3693888369174B21333E5A /* ProgressIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProgressIndicator.swift; path = SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift; sourceTree = ""; }; + 025A544F19BC6987E72A6A0A9B1726CA /* Disk.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disk.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift; sourceTree = ""; }; + 029A00422820699B153B476831592226 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; + 02BBB5AAB5F6B7B271D2A8880A71F724 /* ResourceBundle-SDWebImage-SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SDWebImage-SDWebImage-Info.plist"; sourceTree = ""; }; + 03F3E50CB0A6F2BD522C6FA9455BD747 /* REES46-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "REES46-Info.plist"; sourceTree = ""; }; + 0452D8A6588B9906902D3781A81B7E02 /* PushTokenNotificationServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationServiceImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift; sourceTree = ""; }; + 054F9EA00DA4E6B7B90CA2D91C46007C /* SDImageCacheDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheDefine.h; path = SDWebImage/Core/SDImageCacheDefine.h; sourceTree = ""; }; + 0563BCB9D5C982E10E671FD25E79729B /* UserSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserSettings.swift; path = REES46/Classes/Model/UserSettings.swift; sourceTree = ""; }; + 05955F66D9A388DB5300C283B9ED82E5 /* SearchWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift; sourceTree = ""; }; + 05CB137A80B79559FF8A751F6E3C15B7 /* SDGraphicsImageRenderer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDGraphicsImageRenderer.m; path = SDWebImage/Core/SDGraphicsImageRenderer.m; sourceTree = ""; }; + 05D020DF7555623CE56D7342B92089D6 /* SDImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFrame.m; path = SDWebImage/Core/SDImageFrame.m; sourceTree = ""; }; + 0747F2B66D5854265EBF7A4B9CDCA0EC /* SDWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImage.h; path = WebImage/SDWebImage.h; sourceTree = ""; }; + 085AEFC7C28A15F206741200F820F38B /* SDWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOperation.m; path = SDWebImage/Core/SDWebImageOperation.m; sourceTree = ""; }; + 0886A006FB6D7A5B26FA5DD74922C871 /* StoriesView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesView.xib; path = REES46/Classes/Resources/StoriesView.xib; sourceTree = ""; }; + 0950384B82209DB75A156574D201B451 /* SDDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDiskCache.m; path = SDWebImage/Core/SDDiskCache.m; sourceTree = ""; }; + 0ACDB23A88E6462C13BAA8CF2F5388C6 /* SessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/SessionQueue.swift; sourceTree = ""; }; + 0AE2DC5138E439FCCEC29C8B4AD17B2D /* RegisterNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegisterNotification.swift; path = REES46/Classes/services/notification/events/RegisterNotification.swift; sourceTree = ""; }; + 0BAFD4926F5BEF0E7D2592ACDAEA47F3 /* SDWebImageDownloaderConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderConfig.m; path = SDWebImage/Core/SDWebImageDownloaderConfig.m; sourceTree = ""; }; 0BB49B831AF796BFD54D280D4E950744 /* Pods-demo-store-iosTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-Info.plist"; sourceTree = ""; }; - 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadManager.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift; sourceTree = ""; }; - 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Option.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift; sourceTree = ""; }; - 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesImageLoader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift; sourceTree = ""; }; - 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageData.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift; sourceTree = ""; }; - 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesView.swift; path = REES46/Classes/Stories/StoriesView.swift; sourceTree = ""; }; - 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CartItem.swift; path = REES46/Classes/Model/CartItem.swift; sourceTree = ""; }; - 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadingPlaceholderView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift; sourceTree = ""; }; - 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenericDataTask.swift; path = REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift; sourceTree = ""; }; - 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromocodeBanner.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift; sourceTree = ""; }; - 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryBlockImageCache.swift; path = REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift; sourceTree = ""; }; - 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkDynamicFont.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift; sourceTree = ""; }; + 0D5B8E3E17032CC03AC3DA26F631C0A9 /* CartItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CartItem.swift; path = REES46/Classes/Model/CartItem.swift; sourceTree = ""; }; + 0E5615848B998FCBF7B3C601180F6533 /* SDImageGraphics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGraphics.m; path = SDWebImage/Core/SDImageGraphics.m; sourceTree = ""; }; + 0FB6821FE781E61F57C7ABBEE79CD491 /* ViewConfigPlain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigPlain.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift; sourceTree = ""; }; + 119A30548ED1F294262DAA76E2314B8F /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; + 12FBF0A87753C1C15550A9EDE725073D /* SDImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCodersManager.m; path = SDWebImage/Core/SDImageCodersManager.m; sourceTree = ""; }; + 1313A8AE0C4379298D7EF36BE6AA65F4 /* SdkGlobalHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkGlobalHelper.swift; path = REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift; sourceTree = ""; }; + 146D16A186D47FCB0B2ABB8F0506282D /* SDWebImageSwiftUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SDWebImageSwiftUI.swift; path = SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift; sourceTree = ""; }; + 14B77A4BA58A9F1E17C8E687B03430D5 /* SDImageIOAnimatedCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoderInternal.h; path = SDWebImage/Private/SDImageIOAnimatedCoderInternal.h; sourceTree = ""; }; + 1501C7067A26F553918FA75C59C74AD1 /* ManagedViewConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ManagedViewConfig.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift; sourceTree = ""; }; + 153B813592BB94FAFB1B69B37EB2DED1 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/Core/NSData+ImageContentType.h"; sourceTree = ""; }; + 156E069BEAD7BB288F1EAB97FDDD68F4 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/Core/UIImage+GIF.h"; sourceTree = ""; }; + 166CAE72B58135935C298B971F0E810A /* ReloadButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReloadButton.swift; path = REES46/Classes/Button/ReloadButton.swift; sourceTree = ""; }; + 16A84119C929C7999C74B194789C2339 /* OnChange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnChange.swift; path = SDWebImageSwiftUI/Classes/Backports/OnChange.swift; sourceTree = ""; }; + 16D28C22EDFBA5210E8F26B745E30C7F /* SlideView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideView.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift; sourceTree = ""; }; + 182B458C0DB3AF459F99260B902F1E3B /* StoriesImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesImageLoader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift; sourceTree = ""; }; + 19CB0A67BA30881F8E68E3431B761F02 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + 19D828BE41B227FC99AB956B45805E0D /* SDWebImageSwiftUI-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImageSwiftUI-dummy.m"; sourceTree = ""; }; + 1A24CFBF01D0409EB666BB081480520E /* RWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController.swift; path = REES46/Classes/Stories/WebKit/RWebViewController.swift; sourceTree = ""; }; 1B85BF16297242DA531FC69E93CF9CA5 /* Pods-demo-store-ios-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-Info.plist"; sourceTree = ""; }; + 1BBD8F1415E27C7782213FF9A17A0355 /* ActivityIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ActivityIndicator.swift; path = SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift; sourceTree = ""; }; + 1C0B64B639FD80A20B3EEBE805B0C5B2 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/Core/UIView+WebCacheOperation.h"; sourceTree = ""; }; 1C72C00B34C83096ED3147E8AAAD8EAE /* Pods-demo-store-ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-umbrella.h"; sourceTree = ""; }; - 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetMainView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift; sourceTree = ""; }; - 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockView.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockView.swift; sourceTree = ""; }; - 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFonts.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift; sourceTree = ""; }; - 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift; sourceTree = ""; }; - 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesSlideReloadIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift; sourceTree = ""; }; - 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitResponse.swift; path = REES46/Classes/Model/InitResponse.swift; sourceTree = ""; }; - 240A79C469C0F6595705D16927F498E9 /* REES46-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-prefix.pch"; sourceTree = ""; }; - 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleUIApplication.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift; sourceTree = ""; }; - 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SimplePersonalizationSDK.swift; path = REES46/Classes/SimplePersonalizationSDK.swift; sourceTree = ""; }; + 1D6FDAFF796C99AED706D3F44F4A7B8F /* SDDisplayLink.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDisplayLink.h; path = SDWebImage/Private/SDDisplayLink.h; sourceTree = ""; }; + 1E25B0169BDF269969E4586C420B6160 /* ImageData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageData.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift; sourceTree = ""; }; + 1E5120A81E18A4375BE2C935A99E02B5 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/Core/UIView+WebCacheOperation.m"; sourceTree = ""; }; + 200E09C6F7210CD35EC2DFC6CDB47964 /* SearchWidgetViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetViewController.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift; sourceTree = ""; }; + 2238B2DE53D04D375D323CDE28F19A0F /* SdkFontInstaller.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInstaller.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift; sourceTree = ""; }; + 22AD885D3D57E81A6E96E0E72504B6C8 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; + 22DF9F8F7A569CC3F4DEB6EBC4102FE1 /* SearchWidget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidget.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift; sourceTree = ""; }; + 22E9C09EE96235DC612E7FDB70D8EB98 /* SDImageAPNGCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAPNGCoder.m; path = SDWebImage/Core/SDImageAPNGCoder.m; sourceTree = ""; }; + 230186899B3D45050AC3C1511882C3B1 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; + 243098A6435E355225C685FEBB0EA576 /* UIImageView+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift"; sourceTree = ""; }; + 245CD06BD01C6A94F1C8153D1F912FCC /* Coverable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Coverable.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift; sourceTree = ""; }; + 24783625BE78E3C757479BA61BFAC0A6 /* SDImageAssetManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAssetManager.m; path = SDWebImage/Private/SDImageAssetManager.m; sourceTree = ""; }; + 249102CF81952267B123A666190DF430 /* RWebViewController_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController_Extensions.swift; path = REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift; sourceTree = ""; }; + 24A037FFEC91A5918877DAF898310E6F /* SearchWidgetHistoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetHistoryButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift; sourceTree = ""; }; + 24AAE5386CBFCCFEDA6C8E44F6E48C3D /* VideoFileUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoFileUtils.swift; path = REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift; sourceTree = ""; }; + 26642982FB2133E4B543A2C337BA2E9D /* UIViewController+PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+PromocodeBanner.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift"; sourceTree = ""; }; + 27C3468CC76B2C7BB10CED3DE5EFCA58 /* SdkPopupAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkPopupAlertView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift; sourceTree = ""; }; + 29D5B0FFB0FB808508AA9BDC2557AA03 /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = ""; }; + 2A368399C2160AC6329182F20B166F4E /* REES46.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.debug.xcconfig; sourceTree = ""; }; 2A71319F6A963531ACFFF30BCBC6DDB2 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; - 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Extension.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift"; sourceTree = ""; }; - 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetHistoryButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift; sourceTree = ""; }; - 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift; sourceTree = ""; }; - 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stories.swift; path = REES46/Classes/Model/Stories.swift; sourceTree = ""; }; + 2B0B4109307136D655FFB5991A75A5DC /* SDWebImageDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDefine.h; path = SDWebImage/Core/SDWebImageDefine.h; sourceTree = ""; }; + 2BA417CE2D73128F66E80F6070CA08EE /* SDImageTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageTransformer.m; path = SDWebImage/Core/SDImageTransformer.m; sourceTree = ""; }; + 2C823347DAB1A2B3C3EAEAFACF196622 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/Core/SDImageCacheConfig.h; sourceTree = ""; }; + 2DF5621E59EA431F7D24B338AF41DAF1 /* UIImage+Transform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Transform.m"; path = "SDWebImage/Core/UIImage+Transform.m"; sourceTree = ""; }; 2E74AC7CFF2C91899A037B82C869DB0A /* Pods-demo-store-ios-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-acknowledgements.markdown"; sourceTree = ""; }; - 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift; sourceTree = ""; }; - 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift; sourceTree = ""; }; - 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetConstants.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift; sourceTree = ""; }; - 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesView.xib; path = REES46/Classes/Resources/StoriesView.xib; sourceTree = ""; }; + 2E7CAF23E69EC6B7DB7D7CDEFC96C5C6 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/Core/SDWebImageManager.m; sourceTree = ""; }; + 2EC5479EE341C9CAE3AAC92B34E3BD4F /* CarouselCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift; sourceTree = ""; }; + 2F374469A65E69F71CF1A960B8DE8DAE /* StateObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StateObject.swift; path = SDWebImageSwiftUI/Classes/Backports/StateObject.swift; sourceTree = ""; }; 2FB9E93A5A045ADF557378B54D551DDE /* Pods-demo-store-iosTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-iosTests-dummy.m"; sourceTree = ""; }; - 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift"; sourceTree = ""; }; - 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/SessionQueue.swift; sourceTree = ""; }; - 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift; sourceTree = ""; }; - 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsButton.swift; path = REES46/Classes/Button/ProductsButton.swift; sourceTree = ""; }; + 2FE7246FC198AE307DAD3891ADC5FE80 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/Core/SDImageCacheConfig.m; sourceTree = ""; }; + 302A8EC471B54D588E44D73F09C36F82 /* SDFileAttributeHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDFileAttributeHelper.m; path = SDWebImage/Private/SDFileAttributeHelper.m; sourceTree = ""; }; + 31A27027A1324B45B2F6F5C9BFA7EE29 /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/Core/UIImage+ForceDecode.m"; sourceTree = ""; }; + 31C677B04BBC412F101723A7541968AE /* Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Loader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift; sourceTree = ""; }; + 343136082AD2F8FDA2DECD6015D2A952 /* Data+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift"; sourceTree = ""; }; 3433BC654811C432BEF5CB32AAF90EFB /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; - 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesCollectionViewPreviewCell.xib; path = REES46/Classes/Resources/StoriesCollectionViewPreviewCell.xib; sourceTree = ""; }; + 3462E4224B703F8B93A5EA4485EDB339 /* SDWebImageSwiftUI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImageSwiftUI.release.xcconfig; sourceTree = ""; }; + 34F6F6267F550D1B9B7ACD345C3E0668 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/Core/NSButton+WebCache.m"; sourceTree = ""; }; 3671B3C220D01E22000CF41146C2B4AB /* REES46 */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = REES46; path = REES46.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIFont+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift"; sourceTree = ""; }; + 3698F76D18FEE0AB0114FA9A9D14C380 /* SearchWidgetListView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift; sourceTree = ""; }; + 36F5D2A790ECA81D45F8B61225A715D5 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/Core/UIImage+MultiFormat.m"; sourceTree = ""; }; 37529AFAE21E524BB5CF8528DBDBFF62 /* Pods-demo-store-ios-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-dummy.m"; sourceTree = ""; }; - 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationService.swift; path = REES46/Classes/NotificationService.swift; sourceTree = ""; }; - 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserver.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift; sourceTree = ""; }; - 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReloadButton.swift; path = REES46/Classes/Button/ReloadButton.swift; sourceTree = ""; }; - 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift; sourceTree = ""; }; - 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkConfiguration.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift; sourceTree = ""; }; + 379137B02CA02704EDA9A2CF00E99A09 /* SDWebImageSwiftUI-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImageSwiftUI-Info.plist"; sourceTree = ""; }; + 37986DD58E8275EB765C4B9ED87C902C /* REES46-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-prefix.pch"; sourceTree = ""; }; + 37D29315E37F8FAAC6F6BA17562D6B51 /* UIBezierPath+Circle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+Circle.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift"; sourceTree = ""; }; + 38246598EB440279D380C257FCBCCA52 /* NetworkConnectionStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift; sourceTree = ""; }; + 385D24232663F9F21F5D0C0F0DA7A763 /* SDImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoderHelper.m; path = SDWebImage/Core/SDImageCoderHelper.m; sourceTree = ""; }; + 3945BB4F984C8941E625264678DEC70C /* PersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PersonalizationSDK.swift; path = REES46/Classes/PersonalizationSDK.swift; sourceTree = ""; }; + 39D601084E48E12065CB0FB34E2814BF /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/Core/SDImageCache.m; sourceTree = ""; }; + 3A0926E6B50E9D5ABA0EF2C4D5E88642 /* InitService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitService.swift; path = REES46/Classes/Extensions/InitService.swift; sourceTree = ""; }; + 3BDF4C10853BB55579BDCA649F2DE846 /* RView_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RView_Extensions.swift; path = REES46/Classes/Stories/WebKit/RView_Extensions.swift; sourceTree = ""; }; + 3C0CB1CDEA4C5E4895994FB47085D4E3 /* SdkImageReloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkImageReloader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift; sourceTree = ""; }; + 3C410EC9FA1D242644C94FD5BB0DCC7F /* SDAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageView.m; path = SDWebImage/Core/SDAnimatedImageView.m; sourceTree = ""; }; + 3C4A6E08625EBFD1238EB565499849E3 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = ""; }; + 3C7FCEF6B42BE8D00A3F1BACC9822867 /* StoryBlockImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryBlockImageCache.swift; path = REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift; sourceTree = ""; }; + 3D0BDF6EBE4794388029C368DD323927 /* SDImageCachesManagerOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManagerOperation.h; path = SDWebImage/Private/SDImageCachesManagerOperation.h; sourceTree = ""; }; + 3DA2EDB38D52E3A594FD04DDF1FC4DD8 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/Core/SDWebImageDownloader.h; sourceTree = ""; }; + 3E928DA9D56257D7E66B7FD04D4FBB6A /* SdkStyleColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift; sourceTree = ""; }; + 3EF2C06F474A7E1365D101FD38EDD192 /* SDGraphicsImageRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDGraphicsImageRenderer.h; path = SDWebImage/Core/SDGraphicsImageRenderer.h; sourceTree = ""; }; + 3F1B596D47CB175EBED6915E6C02D2ED /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/Core/SDImageCache.h; sourceTree = ""; }; + 4145512C78F59C07A8ADA786E0C0D0AE /* SdkDynamicFont.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkDynamicFont.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift; sourceTree = ""; }; + 42AB298A5E3CB9C3744EEB483D776066 /* ViewConfigService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigService.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift; sourceTree = ""; }; + 42C4114AD9CA9739A7AFF00200C9E5FF /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = SDWebImageSwiftUI/Classes/Indicator/Indicator.swift; sourceTree = ""; }; + 43D18ACE031C79021DEEF21AB4FA0A05 /* ColorExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ColorExtensions.swift; path = REES46/Classes/Shared/ColorExtensions.swift; sourceTree = ""; }; + 43D5C931E8B3C42904FF08B0AA8E499A /* Overlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Overlay.swift; path = SDWebImageSwiftUI/Classes/Backports/Overlay.swift; sourceTree = ""; }; + 446B5D79A9B5EFBF90DDBEC5B0006A76 /* SDWebImageDownloaderResponseModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderResponseModifier.h; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.h; sourceTree = ""; }; + 4546F55366F817C14243B677296A3BEB /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/Core/SDWebImageTransition.h; sourceTree = ""; }; 4566A7EDA1E302A996738A3E6923BB76 /* Pods-demo-store-ios-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-acknowledgements.plist"; sourceTree = ""; }; + 45B788F69BB6D1B384380230A35F4A85 /* SDWebImageSwiftUI.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImageSwiftUI.modulemap; sourceTree = ""; }; + 4726050844C07463EDF54E7B9C36FD61 /* RequestOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestOperation.swift; path = REES46/Classes/Extensions/SessionQueue/RequestOperation.swift; sourceTree = ""; }; + 482071A65FE0E3F977402AE06FA26155 /* ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoader.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift; sourceTree = ""; }; 48D43AAA52FE567ADF7FABD5AD0D1218 /* Pods-demo-store-iosTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-iosTests.modulemap"; sourceTree = ""; }; - 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBFontConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift; sourceTree = ""; }; - 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidget.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift; sourceTree = ""; }; - 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingService.swift; path = REES46/Classes/ServiceProtocols/NotificationHandlingService.swift; sourceTree = ""; }; - 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disk.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift; sourceTree = ""; }; - 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RView_Extensions.swift; path = REES46/Classes/Stories/WebKit/RView_Extensions.swift; sourceTree = ""; }; + 48F8626ED92FAA27298CB92425BE0288 /* SDWebImageCacheSerializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheSerializer.h; path = SDWebImage/Core/SDWebImageCacheSerializer.h; sourceTree = ""; }; + 4A89615CA3748B4B574FF3BF0D984A51 /* UISdkWrapLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UISdkWrapLabel.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift; sourceTree = ""; }; + 4AD6725039854C49B298640ED0545CE6 /* SdkStyleCustomFontSizeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift; sourceTree = ""; }; + 4AFB98DB5CEBD45082FDCFAE8E610335 /* SdkStyleCustomColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift; sourceTree = ""; }; + 4C45D4459990807F360105B4C2BD6B5B /* Stories.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stories.swift; path = REES46/Classes/Model/Stories.swift; sourceTree = ""; }; 4DF8AECAEC072703693B3E3E2C4B83C5 /* Pods-demo-store-ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios.modulemap"; sourceTree = ""; }; - 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoading.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift; sourceTree = ""; }; - 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkImageReloader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift; sourceTree = ""; }; - 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInjector.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift; sourceTree = ""; }; - 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackingService.swift; path = REES46/Classes/ServiceProtocols/TrackingService.swift; sourceTree = ""; }; + 4F8EDA1E36291EC7D5833D2F1347675F /* TrackingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackingService.swift; path = REES46/Classes/ServiceProtocols/TrackingService.swift; sourceTree = ""; }; + 505853D80AB9D71C6B962F6B106CA899 /* TexBlockConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TexBlockConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift; sourceTree = ""; }; + 50A915682692C4576BD1B3382EDD4A31 /* SdkStyleUIApplication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleUIApplication.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift; sourceTree = ""; }; + 50CE6E565037959B2AC4CEB87052B390 /* SDWebImageTransitionInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransitionInternal.h; path = SDWebImage/Private/SDWebImageTransitionInternal.h; sourceTree = ""; }; + 50E032345F0385B49508C224E5FAB205 /* UIView+WebCacheState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheState.m"; path = "SDWebImage/Core/UIView+WebCacheState.m"; sourceTree = ""; }; + 51BFD59F8F32B660DCC66F98EFD1A6CE /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/Core/UIImage+GIF.m"; sourceTree = ""; }; + 51DD1AEB1ED0805DAE2DB69242F0495A /* WebImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebImage.swift; path = SDWebImageSwiftUI/Classes/WebImage.swift; sourceTree = ""; }; 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-iosTests"; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIFontDescriptorUsage.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift; sourceTree = ""; }; - 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetViewController.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift; sourceTree = ""; }; - 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TexBlockConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift; sourceTree = ""; }; - 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Coverable+UIKit.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift"; sourceTree = ""; }; - 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift; sourceTree = ""; }; - 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBAppearanceConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift; sourceTree = ""; }; - 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationService.swift; path = REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift; sourceTree = ""; }; - 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegisterNotification.swift; path = REES46/Classes/services/notification/events/RegisterNotification.swift; sourceTree = ""; }; - 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetModel.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetModel.swift; sourceTree = ""; }; - 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitService.swift; path = REES46/Classes/Extensions/InitService.swift; sourceTree = ""; }; - 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserDefaultsExtension.swift; path = REES46/Classes/Extensions/UserDefaultsExtension.swift; sourceTree = ""; }; - 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoryCollectionViewCell.xib; path = REES46/Classes/Resources/StoryCollectionViewCell.xib; sourceTree = ""; }; - 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationServiceImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift; sourceTree = ""; }; - 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionOperation.swift; path = REES46/Classes/Extensions/SessionQueue/SessionOperation.swift; sourceTree = ""; }; - 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift; sourceTree = ""; }; - 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetViewCell.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift; sourceTree = ""; }; + 567F0CCECCB2EFE5CF5E90BD862FC225 /* SearchWidgetDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetDelegate.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift; sourceTree = ""; }; + 56D89D1669ADB46DF58317A31AA0D920 /* Transition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transition.swift; path = SDWebImageSwiftUI/Classes/Transition/Transition.swift; sourceTree = ""; }; + 58F71D4BD9974824651245DBC500E711 /* NSBezierPath+SDRoundedCorners.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBezierPath+SDRoundedCorners.m"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.m"; sourceTree = ""; }; + 5ABAC2D6EBFC4451BB54CDBAB40DADA3 /* SDWebImageSwiftUI-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImageSwiftUI-umbrella.h"; sourceTree = ""; }; + 5AE0E2DC679FA76AFCBE4F10C002B5E8 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/Core/SDWebImagePrefetcher.m; sourceTree = ""; }; + 5BAAE14027868DA9525921C209B08C76 /* SDWebImageSwiftUI-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImageSwiftUI-prefix.pch"; sourceTree = ""; }; + 5BC56B47FC5C9CC44C3585CA3C9561D9 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/Core/UIImage+ForceDecode.h"; sourceTree = ""; }; + 5C7BE26FDD9A42E5961777E59579165F /* UIImage+ExtendedCacheData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ExtendedCacheData.m"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.m"; sourceTree = ""; }; + 5C8C91A282536A9AD77BFAB844A8F376 /* SDDeviceHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDeviceHelper.h; path = SDWebImage/Private/SDDeviceHelper.h; sourceTree = ""; }; + 5CCCC47E503FC830A95DAD71006D4257 /* ProductsResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsResponse.swift; path = REES46/Classes/Model/ProductsResponse.swift; sourceTree = ""; }; + 5CD261183F527F9CCEE033F6D042CCB3 /* Assets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = REES46/Classes/Resources/Assets.xcassets; sourceTree = ""; }; + 5DE906CE80C33B4E27DCFC2A3F937122 /* UIImage+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift"; sourceTree = ""; }; + 5FD013C1407EF41F0DB420AF3709D869 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/Core/SDWebImageDownloaderOperation.m; sourceTree = ""; }; + 609A44AA239B50B276698311810DF46C /* SDImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOCoder.h; path = SDWebImage/Core/SDImageIOCoder.h; sourceTree = ""; }; + 63BAD4815E80530574567C6C941B7D35 /* SDImageIOAnimatedCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoder.h; path = SDWebImage/Core/SDImageIOAnimatedCoder.h; sourceTree = ""; }; + 6598F6A79503239ABC5FF1D30AD713A5 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; + 65A52C786ED0456F2DD0D7E95F90F8B8 /* NSImage+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+Compatibility.m"; path = "SDWebImage/Core/NSImage+Compatibility.m"; sourceTree = ""; }; + 65AE02622EA56AB3A84F2D7776259B6F /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/Core/UIImageView+WebCache.m"; sourceTree = ""; }; + 65C49FAC640F96CEADE5484866E0FC4E /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.m"; sourceTree = ""; }; + 66892A39AD576FB00A0E72D743C5B5F4 /* SDCallbackQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDCallbackQueue.h; path = SDWebImage/Core/SDCallbackQueue.h; sourceTree = ""; }; + 66FC775DB87F1F5E3A252D7C0DB818ED /* SDImageFramePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFramePool.h; path = SDWebImage/Private/SDImageFramePool.h; sourceTree = ""; }; + 677CA2D06DDE5144350FEB4B400D5B12 /* VideoDownloadObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadObject.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift; sourceTree = ""; }; + 693D0696C64D9BB4F4BCC7D548564FB8 /* SDImageLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoader.h; path = SDWebImage/Core/SDImageLoader.h; sourceTree = ""; }; + 6A95D2D8B4A55B4954DFF4C2BE59121C /* REES46-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "REES46-dummy.m"; sourceTree = ""; }; + 6B1B10F952F684F6767E6903C2F5E816 /* SDWebImageSwiftUI */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImageSwiftUI; path = SDWebImageSwiftUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6CDC6391E3063232D20F2FFE1617B4AA /* 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; }; + 6CF075E9AF0C9F42704B25D11A12D16F /* SdkConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkConfiguration.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift; sourceTree = ""; }; + 6CFA6F80E28B127534C67C258F67330D /* SDDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDiskCache.h; path = SDWebImage/Core/SDDiskCache.h; sourceTree = ""; }; + 6D34EFF0527DB3EBA71D8FB52A3425C9 /* UIFontDescriptorUsage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIFontDescriptorUsage.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift; sourceTree = ""; }; + 6F7861E34249B83262CAAC89AE6B545E /* SearchWidgetModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetModel.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetModel.swift; sourceTree = ""; }; + 6F8EA8AFF4FC1C0B82EF0EC412051B3A /* TBAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBAppearanceConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift; sourceTree = ""; }; 6FEE741AF14146505421E6B9B790997B /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; - 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+Circle.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift"; sourceTree = ""; }; - 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListViewCell.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift; sourceTree = ""; }; - 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkApperanceViewScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift; sourceTree = ""; }; - 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackServiceImpl.swift; path = REES46/Classes/ServicesImplementation/TrackServiceImpl.swift; sourceTree = ""; }; - 73010CC983E3809BECEE5348DA1BB8C6 /* 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; }; - 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift; sourceTree = ""; }; + 7180342E0BEDD11728D7A13F83122F1A /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/Core/SDWebImageDownloader.m; sourceTree = ""; }; + 718751286835CE61DAC86CF985BEB152 /* PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromocodeBanner.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift; sourceTree = ""; }; + 721D6D167B5F76DE3399711D8B8F1980 /* SDWebImageDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDefine.m; path = SDWebImage/Core/SDWebImageDefine.m; sourceTree = ""; }; + 722820E2AECBDB9CE88DF1F28EDC4C2A /* NetworkStatusObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserver.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift; sourceTree = ""; }; + 72B32CD662708347A951F5E371409877 /* ImageLoading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoading.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift; sourceTree = ""; }; + 72BAC27599E684B921A906800DBB9B3E /* SDAsyncBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAsyncBlockOperation.h; path = SDWebImage/Private/SDAsyncBlockOperation.h; sourceTree = ""; }; + 7327B126F904459685ACAB5BB188BA92 /* NetworkStatusObserverUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserverUI.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift; sourceTree = ""; }; + 742684B14C7933490E61EE78305318F0 /* SdkActivityIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkActivityIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift; sourceTree = ""; }; + 7640F97184806A9AE6D038E779EA1B9B /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = SDWebImageSwiftUI/Classes/Image.swift; sourceTree = ""; }; + 764CCAEDDE803665E562352946EBBFA8 /* SDImageFramePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFramePool.m; path = SDWebImage/Private/SDImageFramePool.m; sourceTree = ""; }; + 768349C5A7EF0A50AC2FEACF23C4EFD5 /* REES46-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-umbrella.h"; sourceTree = ""; }; 76DEAE9E95F151F7D441B0550C8E10B5 /* Pods-demo-store-ios-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-store-ios-frameworks.sh"; sourceTree = ""; }; 774742885C515AA49BD28EF3648BA370 /* Pods-demo-store-iosTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-acknowledgements.plist"; sourceTree = ""; }; - 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingServiceImpl.swift; path = REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift; sourceTree = ""; }; - 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift"; sourceTree = ""; }; - 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryViewController.swift; path = REES46/Classes/Stories/StoryViewController/StoryViewController.swift; sourceTree = ""; }; - 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkGlobalHelper.swift; path = REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift; sourceTree = ""; }; - 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift; sourceTree = ""; }; - 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockConstants.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift; sourceTree = ""; }; - 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselConstants.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift; sourceTree = ""; }; - 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController.swift; path = REES46/Classes/Stories/WebKit/RWebViewController.swift; sourceTree = ""; }; - 7EED3A4B574EFEBB9FC4A320FC64352D /* REES46.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = REES46.modulemap; sourceTree = ""; }; - 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigPlain.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift; sourceTree = ""; }; - 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operative.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift; sourceTree = ""; }; - 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Navigation.swift; path = REES46/Classes/Extensions/NetworkStatus/Navigation.swift; sourceTree = ""; }; + 779D3AACB3FFC5D21447E5995A7D8169 /* SDWebImageIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageIndicator.h; path = SDWebImage/Core/SDWebImageIndicator.h; sourceTree = ""; }; + 77DA9FAF14BC95865EB72E3778D3DD5E /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/Core/SDWebImagePrefetcher.h; sourceTree = ""; }; + 784409CEDE904360420A93E233B1448E /* RecommendationsStarsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsStarsView.swift; path = REES46/Classes/Extensions/SdkConfiguration/RecommendationsStars/RecommendationsStarsView.swift; sourceTree = ""; }; + 78AC9897341C6AD6139546E65E3C671B /* StoryViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryViewController.swift; path = REES46/Classes/Stories/StoryViewController/StoryViewController.swift; sourceTree = ""; }; + 79161E2AE3EBB7A8C5037E3821873380 /* SDAssociatedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAssociatedObject.h; path = SDWebImage/Private/SDAssociatedObject.h; sourceTree = ""; }; + 791F99A8CC2762A65CBEF72F99CBB292 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + 79E8E12D344406C699B8AB3CC0B36E2C /* SDWebImageDownloaderRequestModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderRequestModifier.h; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.h; sourceTree = ""; }; + 7C0EEC89204EC719332D585D5E222E61 /* SearchResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchResponse.swift; path = REES46/Classes/Model/SearchResponse.swift; sourceTree = ""; }; + 7C3BF456C51A01CDF0D5F36F822566AC /* PushTokenHandlerImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenHandlerImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift; sourceTree = ""; }; + 7DBCC89758D18BE019ACCF9F4FB1DA29 /* UIColor+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Extension.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift"; sourceTree = ""; }; + 7E183E61E8F24778ED0F299E9CDF7098 /* SDInternalMacros.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDInternalMacros.m; path = SDWebImage/Private/SDInternalMacros.m; sourceTree = ""; }; + 81A7464CC9CCCD0F6CEAB02954C74B71 /* SDImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoderHelper.h; path = SDWebImage/Core/SDImageCoderHelper.h; sourceTree = ""; }; + 8239B94A327381F223C720106BF41938 /* SessionOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionOperation.swift; path = REES46/Classes/Extensions/SessionQueue/SessionOperation.swift; sourceTree = ""; }; + 828C3606A950C4AAE88974C9EEB6B09E /* NSBezierPath+SDRoundedCorners.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBezierPath+SDRoundedCorners.h"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.h"; sourceTree = ""; }; + 82A5C1DEACE9944682E1C538D1E696FE /* SubscriptionService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionService.swift; path = REES46/Classes/ServiceProtocols/SubscriptionService.swift; sourceTree = ""; }; + 8530AFBFB841B3BC722B46A2526C34AA /* RecommendationsWidgetViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetViewCell.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift; sourceTree = ""; }; 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios-demo-store-iosUITests"; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsManageable.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift; sourceTree = ""; }; - 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchResponse.swift; path = REES46/Classes/Model/SearchResponse.swift; sourceTree = ""; }; + 884C25BFA10C3C4A63320C3A5B7797EE /* SearchWidgetExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetExtension.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift; sourceTree = ""; }; + 89E336EB6E5CA8CBA413FD162AC5E781 /* SDWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWeakProxy.m; path = SDWebImage/Private/SDWeakProxy.m; sourceTree = ""; }; + 8A8808B6DC1E046BFF8C17824E0A56D3 /* SwiftUICompatibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftUICompatibility.swift; path = SDWebImageSwiftUI/Classes/SwiftUICompatibility.swift; sourceTree = ""; }; + 8C625FCC124326FD82C5D1D495462CBA /* SDImageLoadersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoadersManager.m; path = SDWebImage/Core/SDImageLoadersManager.m; sourceTree = ""; }; + 8CA7AD6F6144B1897DD6FED6EF086315 /* NetworkRadioType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkRadioType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift; sourceTree = ""; }; + 8DECD257A7D9712BFEF049E58533DD45 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/Core/UIView+WebCache.h"; sourceTree = ""; }; + 8E029187C788F90556669DD25F177EB0 /* StoryCollectionViewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoryCollectionViewCell.xib; path = REES46/Classes/Resources/StoryCollectionViewCell.xib; sourceTree = ""; }; + 8E21105E533FF43048ACF1009CF05F4F /* SDWebImageIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageIndicator.m; path = SDWebImage/Core/SDWebImageIndicator.m; sourceTree = ""; }; + 8E55C9080F6947D033E6CE6E6A43847C /* URLSessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLSessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift; sourceTree = ""; }; + 8EA0880546F5C765AE10ECC6D442C87E /* SdkStyleCustomColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift; sourceTree = ""; }; + 8EB8ED5238870DEA90CCE8D421113FC2 /* PushTokenNotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationService.swift; path = REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift; sourceTree = ""; }; 8FFC11AC8252C36F4B476D4E56652E41 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-demo-store-iosUITests-umbrella.h"; sourceTree = ""; }; - 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift; sourceTree = ""; }; - 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-umbrella.h"; sourceTree = ""; }; - 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoaderError.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift; sourceTree = ""; }; - 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryButton.swift; path = REES46/Classes/Button/StoryButton.swift; sourceTree = ""; }; - 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserSettings.swift; path = REES46/Classes/Model/UserSettings.swift; sourceTree = ""; }; + 906C31FFD1D1B75E909C241295F4C0A2 /* CGImageSource+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGImageSource+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift"; sourceTree = ""; }; + 913A2C2605A42A57859DA310AC8C704F /* SDImageAWebPCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAWebPCoder.h; path = SDWebImage/Core/SDImageAWebPCoder.h; sourceTree = ""; }; + 9183AB97B95E41B7E371EC4DE2A2DF30 /* SdkStyleCustomColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift; sourceTree = ""; }; + 9342870F1B17CE6B55C0E506E939EB84 /* SDImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGIFCoder.m; path = SDWebImage/Core/SDImageGIFCoder.m; sourceTree = ""; }; + 93852F96F75724CE63ED467E5C544270 /* SDAsyncBlockOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAsyncBlockOperation.m; path = SDWebImage/Private/SDAsyncBlockOperation.m; sourceTree = ""; }; + 94A8EBE7ECE2DEB427F6FEE4AFAFCA25 /* SDMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDMemoryCache.h; path = SDWebImage/Core/SDMemoryCache.h; sourceTree = ""; }; + 9560E66C017A7924466F9F2ED43805A9 /* Operative.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operative.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift; sourceTree = ""; }; + 95A5032C5249239170C6C56B8BEC1620 /* SDImageCachesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManager.h; path = SDWebImage/Core/SDImageCachesManager.h; sourceTree = ""; }; + 965F1DCE80D5E47223972A8914CF7D2E /* SDImageIOAnimatedCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOAnimatedCoder.m; path = SDWebImage/Core/SDImageIOAnimatedCoder.m; sourceTree = ""; }; + 967A3684F3A19FB31E7EEDBCEE8E376D /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/Core/SDWebImageCompat.m; sourceTree = ""; }; + 9686077291842E1BE3E92A4CBB2D01D5 /* SdkStyleColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift; sourceTree = ""; }; + 9895A84C8FC7A836604C935D35C99AC6 /* StoryCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift; sourceTree = ""; }; + 9917CE73936AE2F6F9845457B644BFDB /* RecommendResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendResponse.swift; path = REES46/Classes/Model/RecommendResponse.swift; sourceTree = ""; }; + 99BAC905278C2BD1A35C579C966CB859 /* SdkStyleCustomFontSizeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift; sourceTree = ""; }; + 9A2441B4F7FE69F4332827D34054B38A /* StoriesSlideReloadIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesSlideReloadIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift; sourceTree = ""; }; + 9A4C76575F957CF7FF3972130D58A634 /* SDImageGraphics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGraphics.h; path = SDWebImage/Core/SDImageGraphics.h; sourceTree = ""; }; + 9AB3A266BBA953A7F6B46B26085D6C56 /* LoadingPlaceholderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadingPlaceholderView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift; sourceTree = ""; }; + 9BF3DE04FA1C4CA5110A837D4B2A26F5 /* StoriesCollectionViewPreviewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesCollectionViewPreviewCell.xib; path = REES46/Classes/Resources/StoriesCollectionViewPreviewCell.xib; sourceTree = ""; }; + 9BF55A80D900FC0E395B74E5440155DA /* SDImageAWebPCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAWebPCoder.m; path = SDWebImage/Core/SDImageAWebPCoder.m; sourceTree = ""; }; + 9C2819399D5A22E8D3E3D2E88DF6D2FE /* SearchWidgetTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetTextField.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift; sourceTree = ""; }; + 9C4AC7B7715AD884E51877A463095BF1 /* UIImage+Metadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Metadata.h"; path = "SDWebImage/Core/UIImage+Metadata.h"; 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; }; - 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBTextConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift; sourceTree = ""; }; - 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsResponse.swift; path = REES46/Classes/Model/ProductsResponse.swift; sourceTree = ""; }; + 9DD3508B88FE26F6A3F11E3592EABE76 /* SDWebImageCacheKeyFilter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheKeyFilter.m; path = SDWebImage/Core/SDWebImageCacheKeyFilter.m; sourceTree = ""; }; + 9E75A98569DB590F251712101F570DDF /* SDImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOCoder.m; path = SDWebImage/Core/SDImageIOCoder.m; sourceTree = ""; }; + 9F9E8DB46CE03201B31155CD1C20A209 /* SDWebImageOptionsProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOptionsProcessor.h; path = SDWebImage/Core/SDWebImageOptionsProcessor.h; sourceTree = ""; }; A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios"; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideViewController.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift; sourceTree = ""; }; - A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift; sourceTree = ""; }; - A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoFileUtils.swift; path = REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift; sourceTree = ""; }; - A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.release.xcconfig; sourceTree = ""; }; - A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGImageSource+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift"; sourceTree = ""; }; - A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CAPropertyAnimation+Key.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift"; sourceTree = ""; }; + A18B7AA27C00B2187B45D6ED87A6451F /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/Core/UIView+WebCache.m"; sourceTree = ""; }; + A1FF8B59E306A9AFBE9135DF6A50DEF0 /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = ""; }; + A21051CBF115DB2382ACC62E5753C6D1 /* SDWebImageSwiftUI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImageSwiftUI.debug.xcconfig; sourceTree = ""; }; + A25CA20AE6CA0E7F3C0889BC83B80448 /* TBFontConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBFontConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift; sourceTree = ""; }; + A684C681F875FE1D6779FA17B5C84369 /* SlideViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideViewController.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift; sourceTree = ""; }; + A6C3DF1CDD3FE376A3F15467BFBE0C34 /* REES46.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = REES46.modulemap; sourceTree = ""; }; A6EB5D5955124BD96D5764A18024EBC9 /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; - A791B748A86BE064FA80C12134F8E728 /* Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Loader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift; sourceTree = ""; }; - A9C82152B76290FC32122F96E2333F17 /* Assets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Assets.swift; path = REES46/Classes/Resources/Assets.swift; sourceTree = ""; }; - AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendResponse.swift; path = REES46/Classes/Model/RecommendResponse.swift; sourceTree = ""; }; - ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyle.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift; sourceTree = ""; }; + A7ABCAC767B04BBD3402CDF2E10D7BA2 /* SDImageCachesManagerOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManagerOperation.m; path = SDWebImage/Private/SDImageCachesManagerOperation.m; sourceTree = ""; }; + A7CCF7778104AADB2758AF4CEBDA340C /* SDWebImageError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageError.m; path = SDWebImage/Core/SDWebImageError.m; sourceTree = ""; }; + A7CF07AF8F15177CC07ABE9749506EBE /* SdkApperanceViewScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkApperanceViewScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift; sourceTree = ""; }; + A872CADF5D680724A3A6EFB82C356231 /* RecommendationsWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift; sourceTree = ""; }; + A918F55072B1534B417AA4F202B62150 /* RecommendationsWidgetConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetConstants.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift; sourceTree = ""; }; + A9B08A53140D0BE71718A5F3E03BE881 /* UserDefaultsExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserDefaultsExtension.swift; path = REES46/Classes/Extensions/UserDefaultsExtension.swift; sourceTree = ""; }; + A9E9CD98B980FB05A787A2A69CFBF17D /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/Core/SDWebImageTransition.m; sourceTree = ""; }; + AAB1F97077878093D8E2B46380CF317E /* UIBezierPath+ImagePlaceholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+ImagePlaceholder.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift"; sourceTree = ""; }; + AAC6B9F7A35D8F631BD99CED340CCC92 /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.h"; sourceTree = ""; }; + AB269F7C83AFFDDCF8E8834DA023EEF5 /* InitResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitResponse.swift; path = REES46/Classes/Model/InitResponse.swift; sourceTree = ""; }; + ABC60206222E6A71DE4443E593C4CBD1 /* ImageLoaderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoaderError.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift; sourceTree = ""; }; + AC97720D830D4D8C05B9307B8708AF6C /* RawRepresentable+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RawRepresentable+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift"; sourceTree = ""; }; + ACC7F80B4FA266A86011287DD80262CC /* VideoDownloadManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadManager.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift; sourceTree = ""; }; + ADC7B43237FE86C4ED670AA6A7264CB9 /* SDmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDmetamacros.h; path = SDWebImage/Private/SDmetamacros.h; sourceTree = ""; }; + AE1161FDAF59CC1A383B889BA00AA0DB /* SdkStyleColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift; sourceTree = ""; }; + AE2158DADDE006E15A6B82206F7E1E5A /* TBTextConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBTextConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift; sourceTree = ""; }; + B0B214D775196BA7CA8E17E53048A493 /* SDWebImage */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B17D8267AF1AFF8A10E7F8F01C219FBE /* SdkQueryBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkQueryBuilder.swift; path = REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift; sourceTree = ""; }; + B2B17F5BDD1F69B5C7C4A70BF44675BE /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/Core/NSData+ImageContentType.m"; sourceTree = ""; }; + B2B921ED7BF87B51971BDCC684F43C49 /* StoriesCollectionViewPreviewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesCollectionViewPreviewCell.swift; path = REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift; sourceTree = ""; }; + B38071E71CDBC65FB0D4D71CF0F240A7 /* SDImageLoadersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoadersManager.h; path = SDWebImage/Core/SDImageLoadersManager.h; sourceTree = ""; }; + B3CD2DB27E7FF6985AF2F043DFBA34BF /* SDImageAPNGCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAPNGCoder.h; path = SDWebImage/Core/SDImageAPNGCoder.h; sourceTree = ""; }; B41372352EEE4B1588AE589803A39DAD /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; - B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+ImagePlaceholder.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift"; sourceTree = ""; }; - B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetExtension.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift; sourceTree = ""; }; + B4839081A2EE7970A91843BDFB777B4F /* SessionDataTaskProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTaskProtocol.swift; path = REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift; sourceTree = ""; }; B603BAB61730E8452D4CEE95A702E9E6 /* Pods-demo-store-iosTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-iosTests-acknowledgements.markdown"; sourceTree = ""; }; - B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+PromocodeBanner.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift"; sourceTree = ""; }; - BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenHandlerImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift; sourceTree = ""; }; + B6DCA8DE902167DD220E0157EB047FD9 /* SDImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFrame.h; path = SDWebImage/Core/SDImageFrame.h; sourceTree = ""; }; + B7144CB0515E7DD6254EBD33FB925996 /* UIImage+Transform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Transform.h"; path = "SDWebImage/Core/UIImage+Transform.h"; sourceTree = ""; }; + B799A41A144BDE98B056E872D41934CC /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = ""; }; + B7A6F0159639AD7880D2D68CF10C375F /* SDMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDMemoryCache.m; path = SDWebImage/Core/SDMemoryCache.m; sourceTree = ""; }; + B8531EA1CC88039F9D35056BBDB103A7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = WebImage/PrivacyInfo.xcprivacy; sourceTree = ""; }; + B8DAA896D2C34C91B3625C9591FA0310 /* SDWebImageCacheSerializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheSerializer.m; path = SDWebImage/Core/SDWebImageCacheSerializer.m; sourceTree = ""; }; + B9453C5A02D3E773A8845189A2EF3E5B /* UIImage+Metadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Metadata.m"; path = "SDWebImage/Core/UIImage+Metadata.m"; sourceTree = ""; }; + B9D73BB06718EE0ED3AA135424012A3E /* SDDisplayLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDisplayLink.m; path = SDWebImage/Private/SDDisplayLink.m; sourceTree = ""; }; + BA06266BAF144C3649CAA2E2C46C9386 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/Core/UIImageView+WebCache.h"; sourceTree = ""; }; + BA638D7683BDDA60DC86AD84777743A4 /* SDAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageView.h; path = SDWebImage/Core/SDAnimatedImageView.h; sourceTree = ""; }; + BA7C2D0D5068F1BBBF48D4DECAD5B3F9 /* SDWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWeakProxy.h; path = SDWebImage/Private/SDWeakProxy.h; sourceTree = ""; }; + BA90567D2B0F1D5538610C5715BF9684 /* URLLiteralConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLLiteralConvertible.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift; sourceTree = ""; }; + BB5652D277DB8F8932201F454562E551 /* SDAnimatedImagePlayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImagePlayer.h; path = SDWebImage/Core/SDAnimatedImagePlayer.h; sourceTree = ""; }; + BD12F79A7009CE1C816858354BB28B16 /* StoriesView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesView.swift; path = REES46/Classes/Stories/StoriesView.swift; sourceTree = ""; }; + BD7E9A5DEA0D84EB96ABDCE752E5FE97 /* CGRect+Center.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Center.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift"; sourceTree = ""; }; BDBCFAB7B704ABF80789FF3A7F6F3A0B /* Pods-demo-store-ios-demo-store-iosUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; sourceTree = ""; }; + BE98821C5B55540B75A1E35C0113ED01 /* SdkFontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInjector.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift; sourceTree = ""; }; + C03EC13E1567E28D939C4CB1E36878E5 /* SDImageAssetManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAssetManager.h; path = SDWebImage/Private/SDImageAssetManager.h; sourceTree = ""; }; C0A7C4F93426C9E1F538C7A9D7D26A38 /* Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh"; sourceTree = ""; }; - C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionService.swift; path = REES46/Classes/ServiceProtocols/SubscriptionService.swift; sourceTree = ""; }; - C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.debug.xcconfig; sourceTree = ""; }; + C0B13A2564427A5D3271A22CC081B485 /* TextBlockConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockConstants.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift; sourceTree = ""; }; + C131B5AD1AE17B1E7669FF4AD7F634F2 /* CarouselCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionView.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift; sourceTree = ""; }; + C1D8A05C1E4B2166E04A020BADD37E6F /* SDWebImageCacheKeyFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheKeyFilter.h; path = SDWebImage/Core/SDWebImageCacheKeyFilter.h; sourceTree = ""; }; + C2391013284B0804D94D42F1224978E1 /* SimplePersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SimplePersonalizationSDK.swift; path = REES46/Classes/SimplePersonalizationSDK.swift; sourceTree = ""; }; + C2480646E98913D695E05C0FD776B508 /* SDImageHEICCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageHEICCoder.m; path = SDWebImage/Core/SDImageHEICCoder.m; sourceTree = ""; }; + C4975126590177D7FBC347D4110732AB /* SDWebImageError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageError.h; path = SDWebImage/Core/SDWebImageError.h; sourceTree = ""; }; + C5299BDBCFF31D3A149189632F841108 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/Core/UIButton+WebCache.m"; sourceTree = ""; }; + C54D76765D76345DEE85C2577A0BE71C /* StoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryButton.swift; path = REES46/Classes/Button/StoryButton.swift; sourceTree = ""; }; C58E5652FE52EBEEC8CFECDDAB7690EA /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-demo-store-iosUITests-dummy.m"; sourceTree = ""; }; - CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift; sourceTree = ""; }; - CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserverUI.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift; sourceTree = ""; }; - CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideView.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift; sourceTree = ""; }; - CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController_Extensions.swift; path = REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift; sourceTree = ""; }; + C5FB4BE9DAD06FEA5F98A303DCDA7ECA /* NotificationHandlingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingService.swift; path = REES46/Classes/ServiceProtocols/NotificationHandlingService.swift; sourceTree = ""; }; + C6AE3B6A7C454F39D7DC1A21465B15CD /* NetworkConnectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift; sourceTree = ""; }; + C70EF61B85CB5E0C32E22E64A24C5419 /* SDWebImageOptionsProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOptionsProcessor.m; path = SDWebImage/Core/SDWebImageOptionsProcessor.m; sourceTree = ""; }; + C9A3B19D8F5A4D74B59E5858C18A89C7 /* GenericDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenericDataTask.swift; path = REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift; sourceTree = ""; }; + CA1970B7E000CD93CD5ABDD9C90EF69D /* SearchWidgetListViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListViewCell.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift; sourceTree = ""; }; + CA91031AD1B1A421B1E129492D976C39 /* SDImageLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoader.m; path = SDWebImage/Core/SDImageLoader.m; sourceTree = ""; }; + CB360C271FF5A9ACB1881BD995CD3EA9 /* SDWebImageDownloaderRequestModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderRequestModifier.m; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.m; sourceTree = ""; }; + CBD844A1FA21892ABF089EC57D9B69A0 /* SDFileAttributeHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDFileAttributeHelper.h; path = SDWebImage/Private/SDFileAttributeHelper.h; sourceTree = ""; }; + CC320234FBEEEB88843D7C10B8E7556D /* SDAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SDAnimatedImageView+WebCache.m"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.m"; sourceTree = ""; }; + CC817825B6B9D79C94B440B657997769 /* Backport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Backport.swift; path = SDWebImageSwiftUI/Classes/Backports/Backport.swift; sourceTree = ""; }; + CD162A74396D56FCB345484D359792F2 /* SDWebImageDownloaderDecryptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderDecryptor.m; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.m; sourceTree = ""; }; + CE44DD5CCECDDF5CE93F504C6A95D0C4 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/Core/SDWebImageCompat.h; sourceTree = ""; }; + CEBDC88DD3BCA0C8036016944005827F /* ImageViewWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageViewWrapper.swift; path = SDWebImageSwiftUI/Classes/ImageViewWrapper.swift; sourceTree = ""; }; + CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "SDWebImage-SDWebImage"; path = SDWebImage.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + CF3EEBF138E337F258E50A3999B2C0D4 /* SDImageCacheDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheDefine.m; path = SDWebImage/Core/SDImageCacheDefine.m; sourceTree = ""; }; CFA4DC5C53C70119E18B12E39210BCF1 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist"; sourceTree = ""; }; - D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetCategoriesButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift; sourceTree = ""; }; - D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsStarsView.swift; path = REES46/Classes/Extensions/SdkConfiguration/RecommendationsStars/RecommendationsStarsView.swift; sourceTree = ""; }; - D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HashStorage.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift; sourceTree = ""; }; + D093835AC080A50072C58F9D8F4E0A9B /* SDImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoder.h; path = SDWebImage/Core/SDImageCoder.h; sourceTree = ""; }; + D2F7D9DCF90BD5C51C99013B92EAE9DB /* SdkStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyle.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift; sourceTree = ""; }; + D33604BF63E7A1EEFE13AA897DC73B16 /* UIColor+SDHexString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+SDHexString.m"; path = "SDWebImage/Private/UIColor+SDHexString.m"; sourceTree = ""; }; + D3608D39B06183B948806E8EF8CC4845 /* FontFamily.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FontFamily.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift; sourceTree = ""; }; + D45C11F2FD76BEC707586E6425FF78E0 /* SDAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImage.h; path = SDWebImage/Core/SDAnimatedImage.h; sourceTree = ""; }; + D557FCA56AFC2021F32B40BC6AE7328F /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/Core/UIImage+MultiFormat.h"; sourceTree = ""; }; + D59F75F6EA505E9D0CB9B0B15D958665 /* Navigation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Navigation.swift; path = REES46/Classes/Extensions/NetworkStatus/Navigation.swift; sourceTree = ""; }; D5AC60A10479B2D353EC371DC8B83A57 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; - D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTaskProtocol.swift; path = REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift; sourceTree = ""; }; - D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetObjectification.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetObjectification.swift; sourceTree = ""; }; - DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoader.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift; sourceTree = ""; }; - DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = REES46/Classes/Resources/Assets.xcassets; sourceTree = ""; }; - DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkActivityIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift; sourceTree = ""; }; - DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetDelegate.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift; sourceTree = ""; }; - DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift; sourceTree = ""; }; - DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "REES46-dummy.m"; sourceTree = ""; }; + D6079445C8FAC7E4FF570DA98DBD49E4 /* SDWebImageDownloaderDecryptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderDecryptor.h; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.h; sourceTree = ""; }; + D60D48DCE60F43070C743D0563F167BC /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/Core/SDAnimatedImageRep.h; sourceTree = ""; }; + D6F7531755893C43B30BF9E19D560519 /* HashStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HashStorage.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift; sourceTree = ""; }; + D7DD9C8AB753B4EE55CBE39498167210 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/Core/SDWebImageOperation.h; sourceTree = ""; }; + D9192461900ECBFD6FCBF2CD9D32503F /* CGSize+Min.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGSize+Min.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift"; sourceTree = ""; }; + DA1EBEE93335802768CDDA7AEF9A60AA /* NSImage+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+Compatibility.h"; path = "SDWebImage/Core/NSImage+Compatibility.h"; sourceTree = ""; }; + DAC2860E468BFF18CAD7EED73F4C53D8 /* ImageManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageManager.swift; path = SDWebImageSwiftUI/Classes/ImageManager.swift; sourceTree = ""; }; + DBB1FB349361E086596E4A2F0DB86B38 /* SDAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SDAnimatedImageView+WebCache.h"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.h"; sourceTree = ""; }; + DBC37411E3FBDB55CA1205401E6D3AE2 /* REES46.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.release.xcconfig; sourceTree = ""; }; + DC3973838B69DCC92B65F9C777E03C51 /* SdkStyleCustomFonts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFonts.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift; sourceTree = ""; }; + DC5A6FA54151953B32A9EE306274468A /* ProductsButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsButton.swift; path = REES46/Classes/Button/ProductsButton.swift; sourceTree = ""; }; + DCAB701B1958806B999110D217BE4269 /* TrackServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackServiceImpl.swift; path = REES46/Classes/ServicesImplementation/TrackServiceImpl.swift; sourceTree = ""; }; + DD5541895541D62F5397A02BB8F31386 /* Option.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Option.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift; sourceTree = ""; }; + DDADBA9A1CB5524DE20EC11A40E0AD62 /* SDImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGIFCoder.h; path = SDWebImage/Core/SDImageGIFCoder.h; sourceTree = ""; }; + DE90C578EE2F80BD131A4785E590A767 /* PromoCodeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromoCodeView.swift; path = REES46/Classes/Button/PromoCodeView.swift; sourceTree = ""; }; + E212E372E7728F282D004A4FE04E8399 /* Assets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Assets.swift; path = REES46/Classes/Resources/Assets.swift; sourceTree = ""; }; E23C6A0C21CCDEEED0DAC1168FC8DE30 /* Pods-demo-store-iosTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-iosTests-umbrella.h"; sourceTree = ""; }; + E3A4DBF13FAB22ACF605B960D791CCDB /* NotificationHandlingServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingServiceImpl.swift; path = REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift; sourceTree = ""; }; + E3BECA1A98E38D6A4281546005B73B48 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/Core/UIButton+WebCache.h"; sourceTree = ""; }; + E43C26A9ABBBD30D24AAC918843657EC /* AnimatedImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedImage.swift; path = SDWebImageSwiftUI/Classes/AnimatedImage.swift; sourceTree = ""; }; + E474B6985E4834A59099E70AE48070CD /* ImagePlayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePlayer.swift; path = SDWebImageSwiftUI/Classes/ImagePlayer.swift; sourceTree = ""; }; E488745F10B20C3BE441DFD1B370AFD7 /* Pods-demo-store-ios-demo-store-iosUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios-demo-store-iosUITests.modulemap"; sourceTree = ""; }; - E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift"; sourceTree = ""; }; - E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionView.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift; sourceTree = ""; }; - E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkQueryBuilder.swift; path = REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift; sourceTree = ""; }; - E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ColorExtensions.swift; path = REES46/Classes/Shared/ColorExtensions.swift; sourceTree = ""; }; - EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Center.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift"; sourceTree = ""; }; - EFE1038B30DAB86B0B88A1A3AAC6E034 /* REES46-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "REES46-Info.plist"; sourceTree = ""; }; - F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkPopupAlertView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift; sourceTree = ""; }; - F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UISdkWrapLabel.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift; sourceTree = ""; }; - F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetTextField.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift; sourceTree = ""; }; - F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadObject.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift; sourceTree = ""; }; - F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PersonalizationSDK.swift; path = REES46/Classes/PersonalizationSDK.swift; sourceTree = ""; }; - F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLLiteralConvertible.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift; sourceTree = ""; }; - F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestOperation.swift; path = REES46/Classes/Extensions/SessionQueue/RequestOperation.swift; sourceTree = ""; }; - F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesCollectionViewPreviewCell.swift; path = REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift; sourceTree = ""; }; - F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGSize+Min.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift"; sourceTree = ""; }; - F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RawRepresentable+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift"; sourceTree = ""; }; + E557D339D8D4F28B0349B09C6C53DFCC /* SDWebImageDownloaderConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderConfig.h; path = SDWebImage/Core/SDWebImageDownloaderConfig.h; sourceTree = ""; }; + E57F4AF8733A55E946FD8FB15751E71A /* SDAssociatedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAssociatedObject.m; path = SDWebImage/Private/SDAssociatedObject.m; sourceTree = ""; }; + E6864BAD54FAD2C378EF2E1230E626AD /* SDDeviceHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDeviceHelper.m; path = SDWebImage/Private/SDDeviceHelper.m; sourceTree = ""; }; + E74B0A47D66512282E1FA639A6693404 /* SDWebImageDownloaderResponseModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderResponseModifier.m; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.m; sourceTree = ""; }; + E7C26425398E790B8A16DE4A3A0F5B6F /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/Core/SDAnimatedImageRep.m; sourceTree = ""; }; + E8576C6FF926E093E1A16B8080253AED /* UIImage+ExtendedCacheData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ExtendedCacheData.h"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.h"; sourceTree = ""; }; + E9C5B9C0B9AC8F9C02C59534F887327F /* UIView+WebCacheState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheState.h"; path = "SDWebImage/Core/UIView+WebCacheState.h"; sourceTree = ""; }; + EAC55D6A899A85EB0F0868B73A6F51F6 /* CAPropertyAnimation+Key.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CAPropertyAnimation+Key.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift"; sourceTree = ""; }; + EB8CA267F48ED012779151542F11CD03 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/Core/SDWebImageDownloaderOperation.h; sourceTree = ""; }; + EBE7BB19A4817A68FC4C4F6FD47397D4 /* Coverable+UIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Coverable+UIKit.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift"; sourceTree = ""; }; + EC2D0B5064579CD0BF56EAFC0792E9A5 /* SDImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCodersManager.h; path = SDWebImage/Core/SDImageCodersManager.h; sourceTree = ""; }; + EE16E01FB33A81A9861F1386657A95E2 /* SDInternalMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDInternalMacros.h; path = SDWebImage/Private/SDInternalMacros.h; sourceTree = ""; }; + EF5C7C77DE2A108B989B598603A71255 /* SubscriptionServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionServiceImpl.swift; path = REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift; sourceTree = ""; }; + EFEBEB2D698CB52B18D32D8A44CB117C /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/Core/SDWebImageManager.h; sourceTree = ""; }; + F054392BF6A08C9DBF6FB98AE4A633F3 /* SDImageHEICCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoder.h; path = SDWebImage/Core/SDImageHEICCoder.h; sourceTree = ""; }; + F180D6C6E0768F6A5BC4E1257E5AD297 /* SearchWidgetMainView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetMainView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift; sourceTree = ""; }; + F269AE423D51077DA2EC0CD40577E5BF /* SettingsManageable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsManageable.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift; sourceTree = ""; }; + F27900774BD5451523048BE1D45BA68C /* SDAnimatedImagePlayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImagePlayer.m; path = SDWebImage/Core/SDAnimatedImagePlayer.m; sourceTree = ""; }; + F2F28C758806CA9B47233D61569AC4AE /* TextBlockView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockView.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockView.swift; sourceTree = ""; }; + F3739778E07523A3175EF42603E6D8CD /* SearchWidgetCategoriesButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetCategoriesButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift; sourceTree = ""; }; + F6882D4A05CE1AEF7EBD19E019E3D1D9 /* UIFont+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIFont+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift"; sourceTree = ""; }; + F7F41EC0C09AF0533629C82C319871A2 /* SDCallbackQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDCallbackQueue.m; path = SDWebImage/Core/SDCallbackQueue.m; sourceTree = ""; }; FA03167D0E708CC82BFBCD6475749CE2 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown"; sourceTree = ""; }; - FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift; sourceTree = ""; }; - FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FontFamily.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift; sourceTree = ""; }; - FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Coverable.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift; sourceTree = ""; }; - FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift; sourceTree = ""; }; - FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ManagedViewConfig.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift; sourceTree = ""; }; + FAA2A1D8B3E0092C5A2D6AACF916118C /* SDWebImageSwiftUI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageSwiftUI.h; path = SDWebImageSwiftUI/Module/SDWebImageSwiftUI.h; sourceTree = ""; }; + FC6D190307998671654651402F1CE476 /* NetworkStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift; sourceTree = ""; }; + FDD4ACEF0B3F4E25B59359F4A0C563E1 /* CarouselConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselConstants.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift; sourceTree = ""; }; + FDF8837D160CBDE98E1A5352392752A4 /* SDImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoder.m; path = SDWebImage/Core/SDImageCoder.m; sourceTree = ""; }; + FED305701BEF72D8FA302970F6C0F799 /* SDImageTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageTransformer.h; path = SDWebImage/Core/SDImageTransformer.h; sourceTree = ""; }; + FEF1E5F2C7F33C39B10991E4C2386C7E /* NotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationService.swift; path = REES46/Classes/NotificationService.swift; sourceTree = ""; }; + FFA328C3A9F9D9DA68AF6E8DC309DDB4 /* SDImageCachesManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManager.m; path = SDWebImage/Core/SDImageCachesManager.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0F5AD16E4861F5A40FD3476C13069579 /* Frameworks */ = { + 182DE84121F07E8506C7C52B3CABFB61 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3726922467DD0501527002C0C31278E4 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -386,11 +786,36 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - D5E80841615FB620CED229E7885AC08F /* Frameworks */ = { + AFCF64B8D3CC9AD61C5688BD27333799 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B4C27A1D9F4EC266C766251289AA689E /* Foundation.framework in Frameworks */, + 04FE5E229D14053DDD6AC83FC3D9AFC6 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CAA97552934E1B65AD863436D8DAEC7D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FF45293373DD3208E626AACA6EE03513 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CD3FD375884976E99F234948F32A5A9E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E377EFE16FB8C700C69171DD7AE4FFA9 /* Foundation.framework in Frameworks */, + 62B9FB2BAB0F70C3705B33D50FEEFBD2 /* ImageIO.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DDE962E06D3E045B2C3E65379DB3E5DB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 978A73763500D7A9A4A0F878716CAC12 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -405,170 +830,200 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 05C54A4D55BA128EDFC7C91451A8BB11 /* Pods */ = { + 0F8FC3C2C0BD1A703540DB0EA1712A90 /* Pods */ = { isa = PBXGroup; children = ( - 2C90CD89B61815D5FE9D0AE6A9D21A2F /* REES46 */, + 735951A47824127AB7CB703C0F3ABD96 /* REES46 */, + 69D0F221889BE65CE17C10CAD336C263 /* SDWebImage */, + B57FC262D80A6FC3160E63A50D0375AD /* SDWebImageSwiftUI */, ); name = Pods; sourceTree = ""; }; - 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */ = { + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A2DAB88224A5C6E444F84116BC10553A /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 2480E569F42E6AAE728108B5024E7F49 /* Core */ = { + isa = PBXGroup; + children = ( + 828C3606A950C4AAE88974C9EEB6B09E /* NSBezierPath+SDRoundedCorners.h */, + 58F71D4BD9974824651245DBC500E711 /* NSBezierPath+SDRoundedCorners.m */, + 3C4A6E08625EBFD1238EB565499849E3 /* NSButton+WebCache.h */, + 34F6F6267F550D1B9B7ACD345C3E0668 /* NSButton+WebCache.m */, + 153B813592BB94FAFB1B69B37EB2DED1 /* NSData+ImageContentType.h */, + B2B17F5BDD1F69B5C7C4A70BF44675BE /* NSData+ImageContentType.m */, + DA1EBEE93335802768CDDA7AEF9A60AA /* NSImage+Compatibility.h */, + 65A52C786ED0456F2DD0D7E95F90F8B8 /* NSImage+Compatibility.m */, + D45C11F2FD76BEC707586E6425FF78E0 /* SDAnimatedImage.h */, + 01949FADB1DF51BC47166556FEBFE773 /* SDAnimatedImage.m */, + BB5652D277DB8F8932201F454562E551 /* SDAnimatedImagePlayer.h */, + F27900774BD5451523048BE1D45BA68C /* SDAnimatedImagePlayer.m */, + D60D48DCE60F43070C743D0563F167BC /* SDAnimatedImageRep.h */, + E7C26425398E790B8A16DE4A3A0F5B6F /* SDAnimatedImageRep.m */, + BA638D7683BDDA60DC86AD84777743A4 /* SDAnimatedImageView.h */, + 3C410EC9FA1D242644C94FD5BB0DCC7F /* SDAnimatedImageView.m */, + DBB1FB349361E086596E4A2F0DB86B38 /* SDAnimatedImageView+WebCache.h */, + CC320234FBEEEB88843D7C10B8E7556D /* SDAnimatedImageView+WebCache.m */, + 79161E2AE3EBB7A8C5037E3821873380 /* SDAssociatedObject.h */, + E57F4AF8733A55E946FD8FB15751E71A /* SDAssociatedObject.m */, + 72BAC27599E684B921A906800DBB9B3E /* SDAsyncBlockOperation.h */, + 93852F96F75724CE63ED467E5C544270 /* SDAsyncBlockOperation.m */, + 66892A39AD576FB00A0E72D743C5B5F4 /* SDCallbackQueue.h */, + F7F41EC0C09AF0533629C82C319871A2 /* SDCallbackQueue.m */, + 5C8C91A282536A9AD77BFAB844A8F376 /* SDDeviceHelper.h */, + E6864BAD54FAD2C378EF2E1230E626AD /* SDDeviceHelper.m */, + 6CFA6F80E28B127534C67C258F67330D /* SDDiskCache.h */, + 0950384B82209DB75A156574D201B451 /* SDDiskCache.m */, + 1D6FDAFF796C99AED706D3F44F4A7B8F /* SDDisplayLink.h */, + B9D73BB06718EE0ED3AA135424012A3E /* SDDisplayLink.m */, + CBD844A1FA21892ABF089EC57D9B69A0 /* SDFileAttributeHelper.h */, + 302A8EC471B54D588E44D73F09C36F82 /* SDFileAttributeHelper.m */, + 3EF2C06F474A7E1365D101FD38EDD192 /* SDGraphicsImageRenderer.h */, + 05CB137A80B79559FF8A751F6E3C15B7 /* SDGraphicsImageRenderer.m */, + B3CD2DB27E7FF6985AF2F043DFBA34BF /* SDImageAPNGCoder.h */, + 22E9C09EE96235DC612E7FDB70D8EB98 /* SDImageAPNGCoder.m */, + C03EC13E1567E28D939C4CB1E36878E5 /* SDImageAssetManager.h */, + 24783625BE78E3C757479BA61BFAC0A6 /* SDImageAssetManager.m */, + 913A2C2605A42A57859DA310AC8C704F /* SDImageAWebPCoder.h */, + 9BF55A80D900FC0E395B74E5440155DA /* SDImageAWebPCoder.m */, + 3F1B596D47CB175EBED6915E6C02D2ED /* SDImageCache.h */, + 39D601084E48E12065CB0FB34E2814BF /* SDImageCache.m */, + 2C823347DAB1A2B3C3EAEAFACF196622 /* SDImageCacheConfig.h */, + 2FE7246FC198AE307DAD3891ADC5FE80 /* SDImageCacheConfig.m */, + 054F9EA00DA4E6B7B90CA2D91C46007C /* SDImageCacheDefine.h */, + CF3EEBF138E337F258E50A3999B2C0D4 /* SDImageCacheDefine.m */, + 95A5032C5249239170C6C56B8BEC1620 /* SDImageCachesManager.h */, + FFA328C3A9F9D9DA68AF6E8DC309DDB4 /* SDImageCachesManager.m */, + 3D0BDF6EBE4794388029C368DD323927 /* SDImageCachesManagerOperation.h */, + A7ABCAC767B04BBD3402CDF2E10D7BA2 /* SDImageCachesManagerOperation.m */, + D093835AC080A50072C58F9D8F4E0A9B /* SDImageCoder.h */, + FDF8837D160CBDE98E1A5352392752A4 /* SDImageCoder.m */, + 81A7464CC9CCCD0F6CEAB02954C74B71 /* SDImageCoderHelper.h */, + 385D24232663F9F21F5D0C0F0DA7A763 /* SDImageCoderHelper.m */, + EC2D0B5064579CD0BF56EAFC0792E9A5 /* SDImageCodersManager.h */, + 12FBF0A87753C1C15550A9EDE725073D /* SDImageCodersManager.m */, + B6DCA8DE902167DD220E0157EB047FD9 /* SDImageFrame.h */, + 05D020DF7555623CE56D7342B92089D6 /* SDImageFrame.m */, + 66FC775DB87F1F5E3A252D7C0DB818ED /* SDImageFramePool.h */, + 764CCAEDDE803665E562352946EBBFA8 /* SDImageFramePool.m */, + DDADBA9A1CB5524DE20EC11A40E0AD62 /* SDImageGIFCoder.h */, + 9342870F1B17CE6B55C0E506E939EB84 /* SDImageGIFCoder.m */, + 9A4C76575F957CF7FF3972130D58A634 /* SDImageGraphics.h */, + 0E5615848B998FCBF7B3C601180F6533 /* SDImageGraphics.m */, + F054392BF6A08C9DBF6FB98AE4A633F3 /* SDImageHEICCoder.h */, + C2480646E98913D695E05C0FD776B508 /* SDImageHEICCoder.m */, + 63BAD4815E80530574567C6C941B7D35 /* SDImageIOAnimatedCoder.h */, + 965F1DCE80D5E47223972A8914CF7D2E /* SDImageIOAnimatedCoder.m */, + 14B77A4BA58A9F1E17C8E687B03430D5 /* SDImageIOAnimatedCoderInternal.h */, + 609A44AA239B50B276698311810DF46C /* SDImageIOCoder.h */, + 9E75A98569DB590F251712101F570DDF /* SDImageIOCoder.m */, + 693D0696C64D9BB4F4BCC7D548564FB8 /* SDImageLoader.h */, + CA91031AD1B1A421B1E129492D976C39 /* SDImageLoader.m */, + B38071E71CDBC65FB0D4D71CF0F240A7 /* SDImageLoadersManager.h */, + 8C625FCC124326FD82C5D1D495462CBA /* SDImageLoadersManager.m */, + FED305701BEF72D8FA302970F6C0F799 /* SDImageTransformer.h */, + 2BA417CE2D73128F66E80F6070CA08EE /* SDImageTransformer.m */, + EE16E01FB33A81A9861F1386657A95E2 /* SDInternalMacros.h */, + 7E183E61E8F24778ED0F299E9CDF7098 /* SDInternalMacros.m */, + 94A8EBE7ECE2DEB427F6FEE4AFAFCA25 /* SDMemoryCache.h */, + B7A6F0159639AD7880D2D68CF10C375F /* SDMemoryCache.m */, + ADC7B43237FE86C4ED670AA6A7264CB9 /* SDmetamacros.h */, + BA7C2D0D5068F1BBBF48D4DECAD5B3F9 /* SDWeakProxy.h */, + 89E336EB6E5CA8CBA413FD162AC5E781 /* SDWeakProxy.m */, + 0747F2B66D5854265EBF7A4B9CDCA0EC /* SDWebImage.h */, + C1D8A05C1E4B2166E04A020BADD37E6F /* SDWebImageCacheKeyFilter.h */, + 9DD3508B88FE26F6A3F11E3592EABE76 /* SDWebImageCacheKeyFilter.m */, + 48F8626ED92FAA27298CB92425BE0288 /* SDWebImageCacheSerializer.h */, + B8DAA896D2C34C91B3625C9591FA0310 /* SDWebImageCacheSerializer.m */, + CE44DD5CCECDDF5CE93F504C6A95D0C4 /* SDWebImageCompat.h */, + 967A3684F3A19FB31E7EEDBCEE8E376D /* SDWebImageCompat.m */, + 2B0B4109307136D655FFB5991A75A5DC /* SDWebImageDefine.h */, + 721D6D167B5F76DE3399711D8B8F1980 /* SDWebImageDefine.m */, + 3DA2EDB38D52E3A594FD04DDF1FC4DD8 /* SDWebImageDownloader.h */, + 7180342E0BEDD11728D7A13F83122F1A /* SDWebImageDownloader.m */, + E557D339D8D4F28B0349B09C6C53DFCC /* SDWebImageDownloaderConfig.h */, + 0BAFD4926F5BEF0E7D2592ACDAEA47F3 /* SDWebImageDownloaderConfig.m */, + D6079445C8FAC7E4FF570DA98DBD49E4 /* SDWebImageDownloaderDecryptor.h */, + CD162A74396D56FCB345484D359792F2 /* SDWebImageDownloaderDecryptor.m */, + EB8CA267F48ED012779151542F11CD03 /* SDWebImageDownloaderOperation.h */, + 5FD013C1407EF41F0DB420AF3709D869 /* SDWebImageDownloaderOperation.m */, + 79E8E12D344406C699B8AB3CC0B36E2C /* SDWebImageDownloaderRequestModifier.h */, + CB360C271FF5A9ACB1881BD995CD3EA9 /* SDWebImageDownloaderRequestModifier.m */, + 446B5D79A9B5EFBF90DDBEC5B0006A76 /* SDWebImageDownloaderResponseModifier.h */, + E74B0A47D66512282E1FA639A6693404 /* SDWebImageDownloaderResponseModifier.m */, + C4975126590177D7FBC347D4110732AB /* SDWebImageError.h */, + A7CCF7778104AADB2758AF4CEBDA340C /* SDWebImageError.m */, + 779D3AACB3FFC5D21447E5995A7D8169 /* SDWebImageIndicator.h */, + 8E21105E533FF43048ACF1009CF05F4F /* SDWebImageIndicator.m */, + EFEBEB2D698CB52B18D32D8A44CB117C /* SDWebImageManager.h */, + 2E7CAF23E69EC6B7DB7D7CDEFC96C5C6 /* SDWebImageManager.m */, + D7DD9C8AB753B4EE55CBE39498167210 /* SDWebImageOperation.h */, + 085AEFC7C28A15F206741200F820F38B /* SDWebImageOperation.m */, + 9F9E8DB46CE03201B31155CD1C20A209 /* SDWebImageOptionsProcessor.h */, + C70EF61B85CB5E0C32E22E64A24C5419 /* SDWebImageOptionsProcessor.m */, + 77DA9FAF14BC95865EB72E3778D3DD5E /* SDWebImagePrefetcher.h */, + 5AE0E2DC679FA76AFCBE4F10C002B5E8 /* SDWebImagePrefetcher.m */, + 4546F55366F817C14243B677296A3BEB /* SDWebImageTransition.h */, + A9E9CD98B980FB05A787A2A69CFBF17D /* SDWebImageTransition.m */, + 50CE6E565037959B2AC4CEB87052B390 /* SDWebImageTransitionInternal.h */, + E3BECA1A98E38D6A4281546005B73B48 /* UIButton+WebCache.h */, + C5299BDBCFF31D3A149189632F841108 /* UIButton+WebCache.m */, + 012F10698C136315708F93A29670131E /* UIColor+SDHexString.h */, + D33604BF63E7A1EEFE13AA897DC73B16 /* UIColor+SDHexString.m */, + E8576C6FF926E093E1A16B8080253AED /* UIImage+ExtendedCacheData.h */, + 5C7BE26FDD9A42E5961777E59579165F /* UIImage+ExtendedCacheData.m */, + 5BC56B47FC5C9CC44C3585CA3C9561D9 /* UIImage+ForceDecode.h */, + 31A27027A1324B45B2F6F5C9BFA7EE29 /* UIImage+ForceDecode.m */, + 156E069BEAD7BB288F1EAB97FDDD68F4 /* UIImage+GIF.h */, + 51BFD59F8F32B660DCC66F98EFD1A6CE /* UIImage+GIF.m */, + AAC6B9F7A35D8F631BD99CED340CCC92 /* UIImage+MemoryCacheCost.h */, + 65C49FAC640F96CEADE5484866E0FC4E /* UIImage+MemoryCacheCost.m */, + 9C4AC7B7715AD884E51877A463095BF1 /* UIImage+Metadata.h */, + B9453C5A02D3E773A8845189A2EF3E5B /* UIImage+Metadata.m */, + D557FCA56AFC2021F32B40BC6AE7328F /* UIImage+MultiFormat.h */, + 36F5D2A790ECA81D45F8B61225A715D5 /* UIImage+MultiFormat.m */, + B7144CB0515E7DD6254EBD33FB925996 /* UIImage+Transform.h */, + 2DF5621E59EA431F7D24B338AF41DAF1 /* UIImage+Transform.m */, + 19CB0A67BA30881F8E68E3431B761F02 /* UIImageView+HighlightedWebCache.h */, + 791F99A8CC2762A65CBEF72F99CBB292 /* UIImageView+HighlightedWebCache.m */, + BA06266BAF144C3649CAA2E2C46C9386 /* UIImageView+WebCache.h */, + 65AE02622EA56AB3A84F2D7776259B6F /* UIImageView+WebCache.m */, + 8DECD257A7D9712BFEF049E58533DD45 /* UIView+WebCache.h */, + A18B7AA27C00B2187B45D6ED87A6451F /* UIView+WebCache.m */, + 1C0B64B639FD80A20B3EEBE805B0C5B2 /* UIView+WebCacheOperation.h */, + 1E5120A81E18A4375BE2C935A99E02B5 /* UIView+WebCacheOperation.m */, + E9C5B9C0B9AC8F9C02C59534F887327F /* UIView+WebCacheState.h */, + 50E032345F0385B49508C224E5FAB205 /* UIView+WebCacheState.m */, + 25AF91774A1B2F3F43F600370BAB1A35 /* Resources */, + ); + name = Core; + sourceTree = ""; + }; + 25AF91774A1B2F3F43F600370BAB1A35 /* Resources */ = { isa = PBXGroup; children = ( - DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */, - 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */, - 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */, - 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */, + B8531EA1CC88039F9D35056BBDB103A7 /* PrivacyInfo.xcprivacy */, ); name = Resources; sourceTree = ""; }; - 2C90CD89B61815D5FE9D0AE6A9D21A2F /* REES46 */ = { + 39EF6A21DB94D022FD5AAD50C63F0C35 /* Products */ = { isa = PBXGroup; children = ( - A9C82152B76290FC32122F96E2333F17 /* Assets.swift */, - A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */, - E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */, - 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */, - 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */, - 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */, - A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */, - EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */, - F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */, - E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */, - FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */, - 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */, - 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */, - 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */, - FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */, - 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */, - D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */, - 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */, - DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */, - 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */, - 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */, - 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */, - 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */, - A791B748A86BE064FA80C12134F8E728 /* Loader.swift */, - 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */, - FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */, - 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */, - FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */, - 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */, - 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */, - 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */, - 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */, - CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */, - 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */, - 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */, - 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */, - 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */, - 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */, - F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */, - 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */, - 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */, - 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */, - 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */, - BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */, - 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */, - 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */, - F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */, - D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */, - 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */, - 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */, - 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */, - AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */, - 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */, - 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */, - F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */, - 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */, - 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */, - CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */, - DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */, - 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */, - 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */, - 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */, - 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */, - 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */, - 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */, - 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */, - F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */, - E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */, - ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */, - 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */, - 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */, - 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */, - DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */, - CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */, - 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */, - 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */, - 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */, - A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */, - 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */, - 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */, - 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */, - D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */, - DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */, - B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */, - 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */, - 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */, - 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */, - 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */, - 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */, - D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */, - F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */, - FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */, - 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */, - D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */, - 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */, - 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */, - 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */, - 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */, - CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */, - A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */, - 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */, - F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */, - 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */, - 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */, - 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */, - 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */, - 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */, - 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */, - 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */, - C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */, - 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */, - 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */, - 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */, - 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */, - 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */, - 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */, - 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */, - 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */, - 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */, - 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */, - B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */, - 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */, - 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */, - 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */, - 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */, - E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */, - F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */, - B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */, - F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */, - 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */, - 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */, - 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */, - 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */, - F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */, - A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */, - 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */, - 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */, - 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */, - A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */, + A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */, + 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */, + 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */, + 3671B3C220D01E22000CF41146C2B4AB /* REES46 */, + B0B214D775196BA7CA8E17E53048A493 /* SDWebImage */, + CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */, + 6B1B10F952F684F6767E6903C2F5E816 /* SDWebImageSwiftUI */, ); - name = REES46; - path = REES46; + name = Products; sourceTree = ""; }; 421E5C4F1CB4560D8EC4FCBE1120AE3E /* Pods-demo-store-iosTests */ = { @@ -621,14 +1076,6 @@ path = "Target Support Files/Pods-demo-store-ios"; sourceTree = ""; }; - 578452D2E740E91742655AC8F1636D1F /* iOS */ = { - isa = PBXGroup; - children = ( - 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, - ); - name = iOS; - sourceTree = ""; - }; 65D0B108902971FD545088B9D3A3C79A /* Targets Support Files */ = { isa = PBXGroup; children = ( @@ -639,54 +1086,353 @@ name = "Targets Support Files"; sourceTree = ""; }; - A12468668661804CACF886A903F1799F /* Products */ = { + 69D0F221889BE65CE17C10CAD336C263 /* SDWebImage */ = { isa = PBXGroup; children = ( - A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */, - 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */, - 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */, - 3671B3C220D01E22000CF41146C2B4AB /* REES46 */, + 2480E569F42E6AAE728108B5024E7F49 /* Core */, + ECC9B798C46647949C8056C4EF92E3D0 /* Support Files */, ); - name = Products; + name = SDWebImage; + path = SDWebImage; + sourceTree = ""; + }; + 735951A47824127AB7CB703C0F3ABD96 /* REES46 */ = { + isa = PBXGroup; + children = ( + E212E372E7728F282D004A4FE04E8399 /* Assets.swift */, + EAC55D6A899A85EB0F0868B73A6F51F6 /* CAPropertyAnimation+Key.swift */, + C131B5AD1AE17B1E7669FF4AD7F634F2 /* CarouselCollectionView.swift */, + 2EC5479EE341C9CAE3AAC92B34E3BD4F /* CarouselCollectionViewCell.swift */, + FDD4ACEF0B3F4E25B59359F4A0C563E1 /* CarouselConstants.swift */, + 0D5B8E3E17032CC03AC3DA26F631C0A9 /* CartItem.swift */, + 906C31FFD1D1B75E909C241295F4C0A2 /* CGImageSource+ImageLoader.swift */, + BD7E9A5DEA0D84EB96ABDCE752E5FE97 /* CGRect+Center.swift */, + D9192461900ECBFD6FCBF2CD9D32503F /* CGSize+Min.swift */, + 43D18ACE031C79021DEEF21AB4FA0A05 /* ColorExtensions.swift */, + 245CD06BD01C6A94F1C8153D1F912FCC /* Coverable.swift */, + EBE7BB19A4817A68FC4C4F6FD47397D4 /* Coverable+UIKit.swift */, + 343136082AD2F8FDA2DECD6015D2A952 /* Data+ImageLoader.swift */, + 025A544F19BC6987E72A6A0A9B1726CA /* Disk.swift */, + D3608D39B06183B948806E8EF8CC4845 /* FontFamily.swift */, + C9A3B19D8F5A4D74B59E5858C18A89C7 /* GenericDataTask.swift */, + D6F7531755893C43B30BF9E19D560519 /* HashStorage.swift */, + 1E25B0169BDF269969E4586C420B6160 /* ImageData.swift */, + 482071A65FE0E3F977402AE06FA26155 /* ImageLoader.swift */, + ABC60206222E6A71DE4443E593C4CBD1 /* ImageLoaderError.swift */, + 72B32CD662708347A951F5E371409877 /* ImageLoading.swift */, + AB269F7C83AFFDDCF8E8834DA023EEF5 /* InitResponse.swift */, + 3A0926E6B50E9D5ABA0EF2C4D5E88642 /* InitService.swift */, + 31C677B04BBC412F101723A7541968AE /* Loader.swift */, + 9AB3A266BBA953A7F6B46B26085D6C56 /* LoadingPlaceholderView.swift */, + 1501C7067A26F553918FA75C59C74AD1 /* ManagedViewConfig.swift */, + D59F75F6EA505E9D0CB9B0B15D958665 /* Navigation.swift */, + 38246598EB440279D380C257FCBCCA52 /* NetworkConnectionStatus.swift */, + C6AE3B6A7C454F39D7DC1A21465B15CD /* NetworkConnectionType.swift */, + 8CA7AD6F6144B1897DD6FED6EF086315 /* NetworkRadioType.swift */, + FC6D190307998671654651402F1CE476 /* NetworkStatus.swift */, + 722820E2AECBDB9CE88DF1F28EDC4C2A /* NetworkStatusObserver.swift */, + 7327B126F904459685ACAB5BB188BA92 /* NetworkStatusObserverUI.swift */, + C5FB4BE9DAD06FEA5F98A303DCDA7ECA /* NotificationHandlingService.swift */, + E3A4DBF13FAB22ACF605B960D791CCDB /* NotificationHandlingServiceImpl.swift */, + FEF1E5F2C7F33C39B10991E4C2386C7E /* NotificationService.swift */, + 9560E66C017A7924466F9F2ED43805A9 /* Operative.swift */, + DD5541895541D62F5397A02BB8F31386 /* Option.swift */, + 3945BB4F984C8941E625264678DEC70C /* PersonalizationSDK.swift */, + DC5A6FA54151953B32A9EE306274468A /* ProductsButton.swift */, + 5CCCC47E503FC830A95DAD71006D4257 /* ProductsResponse.swift */, + 718751286835CE61DAC86CF985BEB152 /* PromocodeBanner.swift */, + DE90C578EE2F80BD131A4785E590A767 /* PromoCodeView.swift */, + 7C3BF456C51A01CDF0D5F36F822566AC /* PushTokenHandlerImpl.swift */, + 8EB8ED5238870DEA90CCE8D421113FC2 /* PushTokenNotificationService.swift */, + 0452D8A6588B9906902D3781A81B7E02 /* PushTokenNotificationServiceImpl.swift */, + AC97720D830D4D8C05B9307B8708AF6C /* RawRepresentable+FontInjector.swift */, + 784409CEDE904360420A93E233B1448E /* RecommendationsStarsView.swift */, + A918F55072B1534B417AA4F202B62150 /* RecommendationsWidgetConstants.swift */, + A872CADF5D680724A3A6EFB82C356231 /* RecommendationsWidgetView.swift */, + 8530AFBFB841B3BC722B46A2526C34AA /* RecommendationsWidgetViewCell.swift */, + 9917CE73936AE2F6F9845457B644BFDB /* RecommendResponse.swift */, + 0AE2DC5138E439FCCEC29C8B4AD17B2D /* RegisterNotification.swift */, + 166CAE72B58135935C298B971F0E810A /* ReloadButton.swift */, + 4726050844C07463EDF54E7B9C36FD61 /* RequestOperation.swift */, + 3BDF4C10853BB55579BDCA649F2DE846 /* RView_Extensions.swift */, + 1A24CFBF01D0409EB666BB081480520E /* RWebViewController.swift */, + 249102CF81952267B123A666190DF430 /* RWebViewController_Extensions.swift */, + 742684B14C7933490E61EE78305318F0 /* SdkActivityIndicator.swift */, + A7CF07AF8F15177CC07ABE9749506EBE /* SdkApperanceViewScheme.swift */, + 6CF075E9AF0C9F42704B25D11A12D16F /* SdkConfiguration.swift */, + 4145512C78F59C07A8ADA786E0C0D0AE /* SdkDynamicFont.swift */, + BE98821C5B55540B75A1E35C0113ED01 /* SdkFontInjector.swift */, + 2238B2DE53D04D375D323CDE28F19A0F /* SdkFontInstaller.swift */, + 1313A8AE0C4379298D7EF36BE6AA65F4 /* SdkGlobalHelper.swift */, + 3C0CB1CDEA4C5E4895994FB47085D4E3 /* SdkImageReloader.swift */, + 27C3468CC76B2C7BB10CED3DE5EFCA58 /* SdkPopupAlertView.swift */, + B17D8267AF1AFF8A10E7F8F01C219FBE /* SdkQueryBuilder.swift */, + D2F7D9DCF90BD5C51C99013B92EAE9DB /* SdkStyle.swift */, + 9686077291842E1BE3E92A4CBB2D01D5 /* SdkStyleColorScheme.swift */, + 3E928DA9D56257D7E66B7FD04D4FBB6A /* SdkStyleColorSchemeAwareView.swift */, + AE1161FDAF59CC1A383B889BA00AA0DB /* SdkStyleColorSchemeAwareViewController.swift */, + 8EA0880546F5C765AE10ECC6D442C87E /* SdkStyleCustomColorScheme.swift */, + 9183AB97B95E41B7E371EC4DE2A2DF30 /* SdkStyleCustomColorSchemeAwareView.swift */, + 4AFB98DB5CEBD45082FDCFAE8E610335 /* SdkStyleCustomColorSchemeAwareViewController.swift */, + DC3973838B69DCC92B65F9C777E03C51 /* SdkStyleCustomFonts.swift */, + 4AD6725039854C49B298640ED0545CE6 /* SdkStyleCustomFontSizeAwareView.swift */, + 99BAC905278C2BD1A35C579C966CB859 /* SdkStyleCustomFontSizeAwareViewController.swift */, + 50A915682692C4576BD1B3382EDD4A31 /* SdkStyleUIApplication.swift */, + 7C0EEC89204EC719332D585D5E222E61 /* SearchResponse.swift */, + 22DF9F8F7A569CC3F4DEB6EBC4102FE1 /* SearchWidget.swift */, + F3739778E07523A3175EF42603E6D8CD /* SearchWidgetCategoriesButton.swift */, + 567F0CCECCB2EFE5CF5E90BD862FC225 /* SearchWidgetDelegate.swift */, + 884C25BFA10C3C4A63320C3A5B7797EE /* SearchWidgetExtension.swift */, + 24A037FFEC91A5918877DAF898310E6F /* SearchWidgetHistoryButton.swift */, + 3698F76D18FEE0AB0114FA9A9D14C380 /* SearchWidgetListView.swift */, + CA1970B7E000CD93CD5ABDD9C90EF69D /* SearchWidgetListViewCell.swift */, + F180D6C6E0768F6A5BC4E1257E5AD297 /* SearchWidgetMainView.swift */, + 6F7861E34249B83262CAAC89AE6B545E /* SearchWidgetModel.swift */, + 017C9D4AD83B9F48EC84C7462F77C1C2 /* SearchWidgetObjectification.swift */, + 9C2819399D5A22E8D3E3D2E88DF6D2FE /* SearchWidgetTextField.swift */, + 05955F66D9A388DB5300C283B9ED82E5 /* SearchWidgetView.swift */, + 200E09C6F7210CD35EC2DFC6CDB47964 /* SearchWidgetViewController.swift */, + B4839081A2EE7970A91843BDFB777B4F /* SessionDataTaskProtocol.swift */, + 8239B94A327381F223C720106BF41938 /* SessionOperation.swift */, + 0ACDB23A88E6462C13BAA8CF2F5388C6 /* SessionQueue.swift */, + F269AE423D51077DA2EC0CD40577E5BF /* SettingsManageable.swift */, + C2391013284B0804D94D42F1224978E1 /* SimplePersonalizationSDK.swift */, + 16D28C22EDFBA5210E8F26B745E30C7F /* SlideView.swift */, + A684C681F875FE1D6779FA17B5C84369 /* SlideViewController.swift */, + 4C45D4459990807F360105B4C2BD6B5B /* Stories.swift */, + B2B921ED7BF87B51971BDCC684F43C49 /* StoriesCollectionViewPreviewCell.swift */, + 182B458C0DB3AF459F99260B902F1E3B /* StoriesImageLoader.swift */, + 9A2441B4F7FE69F4332827D34054B38A /* StoriesSlideReloadIndicator.swift */, + BD12F79A7009CE1C816858354BB28B16 /* StoriesView.swift */, + 3C7FCEF6B42BE8D00A3F1BACC9822867 /* StoryBlockImageCache.swift */, + C54D76765D76345DEE85C2577A0BE71C /* StoryButton.swift */, + 9895A84C8FC7A836604C935D35C99AC6 /* StoryCollectionViewCell.swift */, + 78AC9897341C6AD6139546E65E3C671B /* StoryViewController.swift */, + 82A5C1DEACE9944682E1C538D1E696FE /* SubscriptionService.swift */, + EF5C7C77DE2A108B989B598603A71255 /* SubscriptionServiceImpl.swift */, + 6F8EA8AFF4FC1C0B82EF0EC412051B3A /* TBAppearanceConfiguration.swift */, + A25CA20AE6CA0E7F3C0889BC83B80448 /* TBFontConfiguration.swift */, + AE2158DADDE006E15A6B82206F7E1E5A /* TBTextConfiguration.swift */, + 505853D80AB9D71C6B962F6B106CA899 /* TexBlockConfiguration.swift */, + C0B13A2564427A5D3271A22CC081B485 /* TextBlockConstants.swift */, + F2F28C758806CA9B47233D61569AC4AE /* TextBlockView.swift */, + 4F8EDA1E36291EC7D5833D2F1347675F /* TrackingService.swift */, + DCAB701B1958806B999110D217BE4269 /* TrackServiceImpl.swift */, + 37D29315E37F8FAAC6F6BA17562D6B51 /* UIBezierPath+Circle.swift */, + AAB1F97077878093D8E2B46380CF317E /* UIBezierPath+ImagePlaceholder.swift */, + 7DBCC89758D18BE019ACCF9F4FB1DA29 /* UIColor+Extension.swift */, + F6882D4A05CE1AEF7EBD19E019E3D1D9 /* UIFont+FontInjector.swift */, + 6D34EFF0527DB3EBA71D8FB52A3425C9 /* UIFontDescriptorUsage.swift */, + 5DE906CE80C33B4E27DCFC2A3F937122 /* UIImage+ImageLoader.swift */, + 243098A6435E355225C685FEBB0EA576 /* UIImageView+ImageLoader.swift */, + 4A89615CA3748B4B574FF3BF0D984A51 /* UISdkWrapLabel.swift */, + 26642982FB2133E4B543A2C337BA2E9D /* UIViewController+PromocodeBanner.swift */, + BA90567D2B0F1D5538610C5715BF9684 /* URLLiteralConvertible.swift */, + 8E55C9080F6947D033E6CE6E6A43847C /* URLSessionQueue.swift */, + A9B08A53140D0BE71718A5F3E03BE881 /* UserDefaultsExtension.swift */, + 0563BCB9D5C982E10E671FD25E79729B /* UserSettings.swift */, + ACC7F80B4FA266A86011287DD80262CC /* VideoDownloadManager.swift */, + 677CA2D06DDE5144350FEB4B400D5B12 /* VideoDownloadObject.swift */, + 24AAE5386CBFCCFEDA6C8E44F6E48C3D /* VideoFileUtils.swift */, + 0FB6821FE781E61F57C7ABBEE79CD491 /* ViewConfigPlain.swift */, + 42AB298A5E3CB9C3744EEB483D776066 /* ViewConfigService.swift */, + FB0B6F8420A40ED41EFDF9C49B7A6EFE /* Resources */, + 73BF31FB138C5009151EE7C2ADD07510 /* Support Files */, + ); + name = REES46; + path = REES46; sourceTree = ""; }; - A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */ = { + 73BF31FB138C5009151EE7C2ADD07510 /* Support Files */ = { isa = PBXGroup; children = ( - 7EED3A4B574EFEBB9FC4A320FC64352D /* REES46.modulemap */, - DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */, - EFE1038B30DAB86B0B88A1A3AAC6E034 /* REES46-Info.plist */, - 240A79C469C0F6595705D16927F498E9 /* REES46-prefix.pch */, - 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */, - C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */, - A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */, + A6C3DF1CDD3FE376A3F15467BFBE0C34 /* REES46.modulemap */, + 6A95D2D8B4A55B4954DFF4C2BE59121C /* REES46-dummy.m */, + 03F3E50CB0A6F2BD522C6FA9455BD747 /* REES46-Info.plist */, + 37986DD58E8275EB765C4B9ED87C902C /* REES46-prefix.pch */, + 768349C5A7EF0A50AC2FEACF23C4EFD5 /* REES46-umbrella.h */, + 2A368399C2160AC6329182F20B166F4E /* REES46.debug.xcconfig */, + DBC37411E3FBDB55CA1205401E6D3AE2 /* REES46.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/REES46"; sourceTree = ""; }; + A2DAB88224A5C6E444F84116BC10553A /* iOS */ = { + isa = PBXGroup; + children = ( + 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */, + 22AD885D3D57E81A6E96E0E72504B6C8 /* ImageIO.framework */, + ); + name = iOS; + sourceTree = ""; + }; + A87A9D9B36D903CF3E3357704F8D56E7 /* Support Files */ = { + isa = PBXGroup; + children = ( + 45B788F69BB6D1B384380230A35F4A85 /* SDWebImageSwiftUI.modulemap */, + 19D828BE41B227FC99AB956B45805E0D /* SDWebImageSwiftUI-dummy.m */, + 379137B02CA02704EDA9A2CF00E99A09 /* SDWebImageSwiftUI-Info.plist */, + 5BAAE14027868DA9525921C209B08C76 /* SDWebImageSwiftUI-prefix.pch */, + 5ABAC2D6EBFC4451BB54CDBAB40DADA3 /* SDWebImageSwiftUI-umbrella.h */, + A21051CBF115DB2382ACC62E5753C6D1 /* SDWebImageSwiftUI.debug.xcconfig */, + 3462E4224B703F8B93A5EA4485EDB339 /* SDWebImageSwiftUI.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/SDWebImageSwiftUI"; + sourceTree = ""; + }; + B57FC262D80A6FC3160E63A50D0375AD /* SDWebImageSwiftUI */ = { + isa = PBXGroup; + children = ( + 1BBD8F1415E27C7782213FF9A17A0355 /* ActivityIndicator.swift */, + E43C26A9ABBBD30D24AAC918843657EC /* AnimatedImage.swift */, + CC817825B6B9D79C94B440B657997769 /* Backport.swift */, + 7640F97184806A9AE6D038E779EA1B9B /* Image.swift */, + DAC2860E468BFF18CAD7EED73F4C53D8 /* ImageManager.swift */, + E474B6985E4834A59099E70AE48070CD /* ImagePlayer.swift */, + CEBDC88DD3BCA0C8036016944005827F /* ImageViewWrapper.swift */, + 42C4114AD9CA9739A7AFF00200C9E5FF /* Indicator.swift */, + 16A84119C929C7999C74B194789C2339 /* OnChange.swift */, + 43D5C931E8B3C42904FF08B0AA8E499A /* Overlay.swift */, + 01E4D39E9A3693888369174B21333E5A /* ProgressIndicator.swift */, + FAA2A1D8B3E0092C5A2D6AACF916118C /* SDWebImageSwiftUI.h */, + 146D16A186D47FCB0B2ABB8F0506282D /* SDWebImageSwiftUI.swift */, + 2F374469A65E69F71CF1A960B8DE8DAE /* StateObject.swift */, + 8A8808B6DC1E046BFF8C17824E0A56D3 /* SwiftUICompatibility.swift */, + 56D89D1669ADB46DF58317A31AA0D920 /* Transition.swift */, + 51DD1AEB1ED0805DAE2DB69242F0495A /* WebImage.swift */, + A87A9D9B36D903CF3E3357704F8D56E7 /* Support Files */, + ); + name = SDWebImageSwiftUI; + path = SDWebImageSwiftUI; + sourceTree = ""; + }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, - 05C54A4D55BA128EDFC7C91451A8BB11 /* Pods */, - A12468668661804CACF886A903F1799F /* Products */, + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, + 0F8FC3C2C0BD1A703540DB0EA1712A90 /* Pods */, + 39EF6A21DB94D022FD5AAD50C63F0C35 /* Products */, 65D0B108902971FD545088B9D3A3C79A /* Targets Support Files */, ); sourceTree = ""; }; - D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { + ECC9B798C46647949C8056C4EF92E3D0 /* Support Files */ = { isa = PBXGroup; children = ( - 578452D2E740E91742655AC8F1636D1F /* iOS */, + 02BBB5AAB5F6B7B271D2A8880A71F724 /* ResourceBundle-SDWebImage-SDWebImage-Info.plist */, + 6598F6A79503239ABC5FF1D30AD713A5 /* SDWebImage.modulemap */, + 029A00422820699B153B476831592226 /* SDWebImage-dummy.m */, + A1FF8B59E306A9AFBE9135DF6A50DEF0 /* SDWebImage-Info.plist */, + 230186899B3D45050AC3C1511882C3B1 /* SDWebImage-prefix.pch */, + 119A30548ED1F294262DAA76E2314B8F /* SDWebImage-umbrella.h */, + 29D5B0FFB0FB808508AA9BDC2557AA03 /* SDWebImage.debug.xcconfig */, + B799A41A144BDE98B056E872D41934CC /* SDWebImage.release.xcconfig */, ); - name = Frameworks; + name = "Support Files"; + path = "../Target Support Files/SDWebImage"; + sourceTree = ""; + }; + FB0B6F8420A40ED41EFDF9C49B7A6EFE /* Resources */ = { + isa = PBXGroup; + children = ( + 5CD261183F527F9CCEE033F6D042CCB3 /* Assets.xcassets */, + 9BF3DE04FA1C4CA5110A837D4B2A26F5 /* StoriesCollectionViewPreviewCell.xib */, + 0886A006FB6D7A5B26FA5DD74922C871 /* StoriesView.xib */, + 8E029187C788F90556669DD25F177EB0 /* StoryCollectionViewCell.xib */, + ); + name = Resources; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 59872B0D9DD140E09189C4A22FED39AA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 42089E46D48B162B0AC3566F846764BE /* NSBezierPath+SDRoundedCorners.h in Headers */, + F6B78FD74DB177217EB13A1C5F6E31E8 /* NSButton+WebCache.h in Headers */, + F2ACB8606ABB790DD64FE3D1C2A99AD7 /* NSData+ImageContentType.h in Headers */, + 78DB4B4F958566E37A72D04F973FEBED /* NSImage+Compatibility.h in Headers */, + 85F13CDCA1FADE0ACF2BE361CAB99E0C /* SDAnimatedImage.h in Headers */, + 42962685B499575129CDFF254E8FEE4F /* SDAnimatedImagePlayer.h in Headers */, + 08A9406F1F5800998D7CD7C1C4DF870E /* SDAnimatedImageRep.h in Headers */, + B311644D4FB2B084755B97F9E62D0517 /* SDAnimatedImageView.h in Headers */, + 2953DE694482D1C43BBCDE5F4B7492C1 /* SDAnimatedImageView+WebCache.h in Headers */, + A2DCD1D36D93DFF9EBA04C27FD6523E8 /* SDAssociatedObject.h in Headers */, + 1AC07A8630B73493200FD547678823F9 /* SDAsyncBlockOperation.h in Headers */, + A5BBB698DF1D4480FD47F982C5252205 /* SDCallbackQueue.h in Headers */, + D4316084185FD6513BC83544B2A45E82 /* SDDeviceHelper.h in Headers */, + 7B48B4E11B3E9E10BDD274DC84A27DE5 /* SDDiskCache.h in Headers */, + 4262A44B8089903161C54AD186379ABA /* SDDisplayLink.h in Headers */, + 38E10CECD2C6C59C0CCCEB0A78D40CC1 /* SDFileAttributeHelper.h in Headers */, + 7B6078F9AEBF848D77F519AF8FBC77E2 /* SDGraphicsImageRenderer.h in Headers */, + 6E8F67D76FD92D5C1136F15A50BF9EB5 /* SDImageAPNGCoder.h in Headers */, + 387C8094E1C055C789587185E97E18E4 /* SDImageAssetManager.h in Headers */, + 116875A435A6C285919C97C0AE6DCA28 /* SDImageAWebPCoder.h in Headers */, + C56A825525BCBE955CFE58C7C747B754 /* SDImageCache.h in Headers */, + 14CD7E5A556FE8ED2CD06E81839F3B0E /* SDImageCacheConfig.h in Headers */, + ADDD26B99A6D54C00956C6BE7349D77E /* SDImageCacheDefine.h in Headers */, + 6D98092F5BB4629EA76E90BB0D5A3A1E /* SDImageCachesManager.h in Headers */, + 45C47D2E7DC2AC0332CDD2323355F483 /* SDImageCachesManagerOperation.h in Headers */, + AC32A22FA700A7C519DA105353C169C9 /* SDImageCoder.h in Headers */, + 07863507770757C4059FD22123EB757D /* SDImageCoderHelper.h in Headers */, + 49F80B73F8E31BDC1CD2986181817AD5 /* SDImageCodersManager.h in Headers */, + EABA337CA83C9ED09E2DA7F54F501750 /* SDImageFrame.h in Headers */, + 8D739A0E851C00DBE71DB9A2667D4588 /* SDImageFramePool.h in Headers */, + 9EB6CDD8F5E5570798DE4D2C6D9EEAAA /* SDImageGIFCoder.h in Headers */, + 0170EE86BA8B1D7872B62745E0C01BBE /* SDImageGraphics.h in Headers */, + BCF0F618DE852A99D0E09482FE1AD6DB /* SDImageHEICCoder.h in Headers */, + 702044FE1045183AEA5C6DD23E0741A4 /* SDImageIOAnimatedCoder.h in Headers */, + E35A96AD62BB29B7ABA3779606A3DB2B /* SDImageIOAnimatedCoderInternal.h in Headers */, + 0529F5E309FEF38A1C578FBC56EE042E /* SDImageIOCoder.h in Headers */, + 91218968238F58BBB3E84DC5C8A25854 /* SDImageLoader.h in Headers */, + 0DDBFF7516C2F40018EB5DEDADAA268E /* SDImageLoadersManager.h in Headers */, + 9AF09A8AF1301B3B97DA1E5B76A19645 /* SDImageTransformer.h in Headers */, + 480EB117CA823BBA38F531F048DC5D9B /* SDInternalMacros.h in Headers */, + 31454EEA78669CAFA2CFD0E18609F80D /* SDMemoryCache.h in Headers */, + B71EF2A111D54884A8BA6AA0E502B5C3 /* SDmetamacros.h in Headers */, + 67EAF96CF5371E0EDF2F1976BA0A8DA4 /* SDWeakProxy.h in Headers */, + E0D4D74CF9A15AAB4D8EBA35D68449C0 /* SDWebImage.h in Headers */, + 449F6DDFDA01061F0B001BCB31ED4455 /* SDWebImage-umbrella.h in Headers */, + 4EC633971567BFD6384859B76E1276F1 /* SDWebImageCacheKeyFilter.h in Headers */, + 65550AE399A68358D1031A676C06A364 /* SDWebImageCacheSerializer.h in Headers */, + B7B3F548D939A885B87BC38F24AC9118 /* SDWebImageCompat.h in Headers */, + 2177290E4AC6DAFDD746C8BA7EEF8B45 /* SDWebImageDefine.h in Headers */, + 67752F2EB4D3E1F9BC130046FB76BCE4 /* SDWebImageDownloader.h in Headers */, + 142E1D597048C8800BFA18FD4A9DD701 /* SDWebImageDownloaderConfig.h in Headers */, + D439144D48C9FE1BA35022F0A6A736C8 /* SDWebImageDownloaderDecryptor.h in Headers */, + F1F06EEE1B902B10F5D0CFD6F7A80DA1 /* SDWebImageDownloaderOperation.h in Headers */, + E77CB069D70FF4125B9E064B49C001D0 /* SDWebImageDownloaderRequestModifier.h in Headers */, + A4A3E992003457010F66F3D6BCC2A5C3 /* SDWebImageDownloaderResponseModifier.h in Headers */, + 4146EC26D7DDF32ECAE445B119479D30 /* SDWebImageError.h in Headers */, + 8A626CEC7CBA9E3859A3FD8B147ECB90 /* SDWebImageIndicator.h in Headers */, + F33A3ECCE1CA579C4ED9F9A2B3B90044 /* SDWebImageManager.h in Headers */, + DD4972517202F35B26B7B659B095D40B /* SDWebImageOperation.h in Headers */, + ACD7FED5646A645F3EDA3F2521156451 /* SDWebImageOptionsProcessor.h in Headers */, + 149FDD80A26F399AFBD57325998EFDF6 /* SDWebImagePrefetcher.h in Headers */, + FAE83A0A03CED37F7817A8B623A7734E /* SDWebImageTransition.h in Headers */, + 1EC1EB5F3B98D4BCB6A057344815682C /* SDWebImageTransitionInternal.h in Headers */, + 10DED49C2B45A5EA8FA6968F1AE7D28E /* UIButton+WebCache.h in Headers */, + F60F32E5C1B049086A5625B865FA75DF /* UIColor+SDHexString.h in Headers */, + 48F66F6D3C7386E5595633DE1311F129 /* UIImage+ExtendedCacheData.h in Headers */, + 9EF20C969A3D26AFF74A35A376270C62 /* UIImage+ForceDecode.h in Headers */, + B80FCEF5ABC014B09963F4E65BDE3C41 /* UIImage+GIF.h in Headers */, + CFD8696312B3334FF17C0412FB20CED6 /* UIImage+MemoryCacheCost.h in Headers */, + BB31CC54186DDAAD89F139C89B93CA7C /* UIImage+Metadata.h in Headers */, + 06DEC5667C8AD8AD090B5B3817193625 /* UIImage+MultiFormat.h in Headers */, + 937D6966FD44A9A799ED6574EC78CC4F /* UIImage+Transform.h in Headers */, + A02EEFC96DF92AB78F933CBC0CBAFD92 /* UIImageView+HighlightedWebCache.h in Headers */, + 1501440AF1C85CB575F269E26BCEC459 /* UIImageView+WebCache.h in Headers */, + AE7A9D612B96E5CADA59EFE4591DDB83 /* UIView+WebCache.h in Headers */, + 4DFCB3D9623FCA43D3E1BFDA528EB587 /* UIView+WebCacheOperation.h in Headers */, + CBBF4F7A773A62DC87CF698A4CC9F272 /* UIView+WebCacheState.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5D67C5954DA4997D536C56BA4873F67C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -695,19 +1441,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 7099F79CA33CF3C0CDECCA80F7A9C308 /* Headers */ = { + C00B24EC949AB45D2E5715F745D8FDD1 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 19FF735430577E28E963D72D58DF655C /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */, + DA1C286C34DC7C7148BFD027A80C9605 /* SDWebImageSwiftUI.h in Headers */, + 4A1C144BA28F389620F8656FF5DA412A /* SDWebImageSwiftUI-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A4F049A598956AF94033ADA695606EB1 /* Headers */ = { + DB24D5E87B87A73D3800526A46998EDB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 469C92E04B9D2D4F8392EE02C7A39C69 /* Pods-demo-store-ios-umbrella.h in Headers */, + 95D0B99765E4BDDF38FF3BAFE1B1395E /* Pods-demo-store-ios-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -719,6 +1466,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + F4ACFBD682D7B15F546B415979071681 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4ED0BD508A169B5BD2FC92A540597F0F /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ @@ -740,6 +1495,25 @@ productReference = 3671B3C220D01E22000CF41146C2B4AB /* REES46 */; productType = "com.apple.product-type.framework"; }; + 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */ = { + isa = PBXNativeTarget; + buildConfigurationList = 65F383B89BC176EDEB551DB2BFCAE26C /* Build configuration list for PBXNativeTarget "SDWebImage" */; + buildPhases = ( + 59872B0D9DD140E09189C4A22FED39AA /* Headers */, + 37D690C2794419F3601D98447F5BFC69 /* Sources */, + CD3FD375884976E99F234948F32A5A9E /* Frameworks */, + 4A227C6AFC46FF1943B041949377A06B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4AAF63A99B6A0D5ECFA6EBEEEA4F4CF9 /* PBXTargetDependency */, + ); + name = SDWebImage; + productName = SDWebImage; + productReference = B0B214D775196BA7CA8E17E53048A493 /* SDWebImage */; + productType = "com.apple.product-type.framework"; + }; 70C4579D73168EDE5BAEF9D0A675D6F0 /* Pods-demo-store-iosTests */ = { isa = PBXNativeTarget; buildConfigurationList = DDA0AEAEF33653027530506736479FDE /* Build configuration list for PBXNativeTarget "Pods-demo-store-iosTests" */; @@ -752,7 +1526,7 @@ buildRules = ( ); dependencies = ( - FAC7701D239872B8311C4054D9DB2831 /* PBXTargetDependency */, + BDD19974F6C9A3105CCA953F44D62A2D /* PBXTargetDependency */, ); name = "Pods-demo-store-iosTests"; productName = Pods_demo_store_iosTests; @@ -761,36 +1535,76 @@ }; 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */ = { isa = PBXNativeTarget; - buildConfigurationList = 055840A6FA6AAA9EF10FDACFBB00DB5C /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */; + buildConfigurationList = 84FF48163961B4CAB8D16B0E5E75CCD0 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */; buildPhases = ( - A4F049A598956AF94033ADA695606EB1 /* Headers */, - EB0148397D0D3BE3BDDD286B33CDA7DE /* Sources */, - 0F5AD16E4861F5A40FD3476C13069579 /* Frameworks */, - 6ED9D74DEB6F3EDA8219CEA42CF2E560 /* Resources */, + DB24D5E87B87A73D3800526A46998EDB /* Headers */, + DBC720CEC2491EE385D95F9C2C84766F /* Sources */, + DDE962E06D3E045B2C3E65379DB3E5DB /* Frameworks */, + 496E7A2BDFE067EDCEB1539DA40E20B2 /* Resources */, ); buildRules = ( ); dependencies = ( - 504A7F75DEBB11C4718A9166A011498E /* PBXTargetDependency */, + 438E91038E0BBFC70FDAD160E6B0234B /* PBXTargetDependency */, + F55303ADA6093A5D638E87257AFC271B /* PBXTargetDependency */, + B74B7BB4D4D8D02690801F2EBFBC3A24 /* PBXTargetDependency */, ); name = "Pods-demo-store-ios"; productName = Pods_demo_store_ios; productReference = A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */; productType = "com.apple.product-type.framework"; }; + 92EBFA3E7005B4C18A9C0B44324EB80F /* SDWebImageSwiftUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = A55791BDAB310B5F7CCCF664D1DFC367 /* Build configuration list for PBXNativeTarget "SDWebImageSwiftUI" */; + buildPhases = ( + C00B24EC949AB45D2E5715F745D8FDD1 /* Headers */, + AD4475E0BA3D83247D0815C868B78D0D /* Sources */, + AFCF64B8D3CC9AD61C5688BD27333799 /* Frameworks */, + 5AAD87F02E21080630DFACBA0E04DAE8 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + E1D43F48E69B1706A4D9B6B5EEB6B91B /* PBXTargetDependency */, + ); + name = SDWebImageSwiftUI; + productName = SDWebImageSwiftUI; + productReference = 6B1B10F952F684F6767E6903C2F5E816 /* SDWebImageSwiftUI */; + productType = "com.apple.product-type.framework"; + }; + 94CFBA7D633ECA58DF85C327B035E6A3 /* SDWebImage-SDWebImage */ = { + isa = PBXNativeTarget; + buildConfigurationList = A1EA36506852AF79BBAB619F1CD9B763 /* Build configuration list for PBXNativeTarget "SDWebImage-SDWebImage" */; + buildPhases = ( + A0BD1FC6FF7A1E6E2EC94DE4CDF1DA61 /* Sources */, + 182DE84121F07E8506C7C52B3CABFB61 /* Frameworks */, + B782947D608DC95EF7554B81CBDB07A2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SDWebImage-SDWebImage"; + productName = SDWebImage; + productReference = CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */; + productType = "com.apple.product-type.bundle"; + }; AC237AA952DF10555F917C17037E3C89 /* Pods-demo-store-ios-demo-store-iosUITests */ = { isa = PBXNativeTarget; - buildConfigurationList = FFFF784778B0D8536B0539C3A7ED3159 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */; + buildConfigurationList = 12F9C39CC5E96865A33F3F640ED54ADE /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */; buildPhases = ( - 7099F79CA33CF3C0CDECCA80F7A9C308 /* Headers */, - D73C4EB97843C82E030E491F2D212141 /* Sources */, - D5E80841615FB620CED229E7885AC08F /* Frameworks */, - 4D87E5A45DD4BE31359A94FEB978164D /* Resources */, + F4ACFBD682D7B15F546B415979071681 /* Headers */, + 0F2EC92DFB9EEEC68E5364578C82A889 /* Sources */, + CAA97552934E1B65AD863436D8DAEC7D /* Frameworks */, + 11555E1B5549D0EECBD48FAA867B7A28 /* Resources */, ); buildRules = ( ); dependencies = ( - E331C98E7CB8005A04A6364504C13DF3 /* PBXTargetDependency */, + 3BD1B5A0933BDF89AE8558F70FB52BE0 /* PBXTargetDependency */, + 1422FFBC3FAE6A8E66A59E9991FB1D3A /* PBXTargetDependency */, + CFA86728496B80A0F40BE4CE2B7303F5 /* PBXTargetDependency */, ); name = "Pods-demo-store-ios-demo-store-iosUITests"; productName = Pods_demo_store_ios_demo_store_iosUITests; @@ -815,7 +1629,7 @@ en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = A12468668661804CACF886A903F1799F /* Products */; + productRefGroup = 39EF6A21DB94D022FD5AAD50C63F0C35 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -823,19 +1637,37 @@ AC237AA952DF10555F917C17037E3C89 /* Pods-demo-store-ios-demo-store-iosUITests */, 70C4579D73168EDE5BAEF9D0A675D6F0 /* Pods-demo-store-iosTests */, 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */, + 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */, + 94CFBA7D633ECA58DF85C327B035E6A3 /* SDWebImage-SDWebImage */, + 92EBFA3E7005B4C18A9C0B44324EB80F /* SDWebImageSwiftUI */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 4D87E5A45DD4BE31359A94FEB978164D /* Resources */ = { + 11555E1B5549D0EECBD48FAA867B7A28 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 496E7A2BDFE067EDCEB1539DA40E20B2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4A227C6AFC46FF1943B041949377A06B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0FC5A479554857FC38A3C8753351191E /* SDWebImage-SDWebImage in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6ED9D74DEB6F3EDA8219CEA42CF2E560 /* Resources */ = { + 5AAD87F02E21080630DFACBA0E04DAE8 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -849,6 +1681,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + B782947D608DC95EF7554B81CBDB07A2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0A45B5FE1BE72B7672F5B52CD2DD67FB /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; F83C3BAEE5E889D5CC05754543D1EA43 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -863,6 +1703,101 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 0F2EC92DFB9EEEC68E5364578C82A889 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 25476F441F2CCC8C9608477DE5A0A44A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37D690C2794419F3601D98447F5BFC69 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B726740C01CEC8A342988863B3C6666D /* NSBezierPath+SDRoundedCorners.m in Sources */, + D0DBC5DD0A2D887A2940BA0329217484 /* NSButton+WebCache.m in Sources */, + 688EBC4BD1F3F76ECA4C72FEC494D84D /* NSData+ImageContentType.m in Sources */, + 2A72F0DC1AF8897A89626C3E81B611F5 /* NSImage+Compatibility.m in Sources */, + 50856AC35DAB64C96C34BC588BB0F7FE /* SDAnimatedImage.m in Sources */, + 145165256BC172DDCDC0575DC1D6D3F3 /* SDAnimatedImagePlayer.m in Sources */, + C2B0B7C3409DC4089F347C18C2C5218A /* SDAnimatedImageRep.m in Sources */, + 267E6BB583A54AA6BB91C1AAA9109BC2 /* SDAnimatedImageView.m in Sources */, + 0E3E4B48C26FF73290F17C1EFE6026DA /* SDAnimatedImageView+WebCache.m in Sources */, + 81D05C82B68E50B5E348E31B16402F53 /* SDAssociatedObject.m in Sources */, + 2F0830F8256C8DC58F0919A5D5C07C06 /* SDAsyncBlockOperation.m in Sources */, + 1EADA61A88A52EBF1F841282FB177F9D /* SDCallbackQueue.m in Sources */, + 43F93ED54EC176295EF366A740E01172 /* SDDeviceHelper.m in Sources */, + 52304420361292CCFC74D707D76A89E6 /* SDDiskCache.m in Sources */, + 023934AA4CE4DC87CF03A03C73ECA714 /* SDDisplayLink.m in Sources */, + BF67904B4E6C8359A5540C1516DC35DD /* SDFileAttributeHelper.m in Sources */, + AF42AB272E74275D08F989B9111E045A /* SDGraphicsImageRenderer.m in Sources */, + C4F6E2A79BD3990086848911AC8B7F89 /* SDImageAPNGCoder.m in Sources */, + A4E7010E8D87921AE6F9D645B7CDA53A /* SDImageAssetManager.m in Sources */, + 8150F3F396A29D249217B5B1BEF13E50 /* SDImageAWebPCoder.m in Sources */, + 3DC4D729B8A196329EA5A3DE5EFA370F /* SDImageCache.m in Sources */, + F0171E13E25FD40D6B6F869966ED8B08 /* SDImageCacheConfig.m in Sources */, + A1623A8868E9AC8BBEAAB9BC0421F463 /* SDImageCacheDefine.m in Sources */, + 0A1E121A8F4DAFDFBA2C6551AED0B082 /* SDImageCachesManager.m in Sources */, + 61BF5909F8FFEC516CA898FDBD838959 /* SDImageCachesManagerOperation.m in Sources */, + CBE2CD6C13ED59FC6DCA9AF08D1E2406 /* SDImageCoder.m in Sources */, + 63266AB53E590025F95E8472A2A75E66 /* SDImageCoderHelper.m in Sources */, + 16E7B447883B3E6CD5DA0C0F799AEE09 /* SDImageCodersManager.m in Sources */, + 421344238409756CF07372155FC3421C /* SDImageFrame.m in Sources */, + F4ADCF115B337B7C483F9C0064646182 /* SDImageFramePool.m in Sources */, + DB558A40B5AACA3DF4BDD7167C48CE71 /* SDImageGIFCoder.m in Sources */, + 41FF38113D3DE2C65D63D29AD0055EA1 /* SDImageGraphics.m in Sources */, + 317A2085CE162CFE3EC3ED9FB3514201 /* SDImageHEICCoder.m in Sources */, + E501E0E956F164F9E90453CC10766DFA /* SDImageIOAnimatedCoder.m in Sources */, + 5EC172A3A600E629AF4AD75C304DA2C9 /* SDImageIOCoder.m in Sources */, + 4CAA295F8BB967445E2273FB5A53769E /* SDImageLoader.m in Sources */, + 480C90679D30599E736F886A01D5EC27 /* SDImageLoadersManager.m in Sources */, + FACD362497B989F8C4445B5C7C340CDD /* SDImageTransformer.m in Sources */, + 6581039AAD4BF84784812194E353F279 /* SDInternalMacros.m in Sources */, + DA0591ACC058D6673CFC94A664BDD51B /* SDMemoryCache.m in Sources */, + 6B2576EF432DFDD2422B66193CED0582 /* SDWeakProxy.m in Sources */, + 2D521703994D252F0E6D24F7D5D53F2E /* SDWebImage-dummy.m in Sources */, + 1D361EE4E09C00F9148CE67CCD306D29 /* SDWebImageCacheKeyFilter.m in Sources */, + 31C998E878D5A0F686B187864A236183 /* SDWebImageCacheSerializer.m in Sources */, + 62796BA9266A3343CDB31913D051B1F2 /* SDWebImageCompat.m in Sources */, + 5D9A37A8D628C6BB9FCA2EF74E352C9C /* SDWebImageDefine.m in Sources */, + 2FA9B480039C913FD3352BFF4DDCAEFC /* SDWebImageDownloader.m in Sources */, + 4624831E1C1A912E31BA028AD4C1FA7C /* SDWebImageDownloaderConfig.m in Sources */, + 59C42C2827C8752D9488E217C5DDD820 /* SDWebImageDownloaderDecryptor.m in Sources */, + B435123EA0DFB080DDF204A68B76B649 /* SDWebImageDownloaderOperation.m in Sources */, + 8BFA637561CFFFD755077574D42FD312 /* SDWebImageDownloaderRequestModifier.m in Sources */, + D67C939C3709BFCC9711E3DAD0854801 /* SDWebImageDownloaderResponseModifier.m in Sources */, + 03FE09B9F7504CA3AE5116F1AA698DD7 /* SDWebImageError.m in Sources */, + 4A88FAAE5AFA7650E7A2E1F1C31B4E0E /* SDWebImageIndicator.m in Sources */, + E5E9A039F53F6FD7F998A44451EFD9AF /* SDWebImageManager.m in Sources */, + 86AA5A87E46FE0919A0A19BA722F4AAC /* SDWebImageOperation.m in Sources */, + C77923E363A3C9D4829376BE0EB08DFC /* SDWebImageOptionsProcessor.m in Sources */, + AEAA0FB549FD88F595F943D8CD4317DF /* SDWebImagePrefetcher.m in Sources */, + 0C24DB1B347FCDCDA9B579CBEA896B7F /* SDWebImageTransition.m in Sources */, + C8A9EB5DED9F08B5FCD153955FC14E93 /* UIButton+WebCache.m in Sources */, + BDDD8451EC24E029EE5394AD6B29E479 /* UIColor+SDHexString.m in Sources */, + 56ED612030120A0397156D40650605F1 /* UIImage+ExtendedCacheData.m in Sources */, + D727D42D3C6D75079100C9E2CDE45C59 /* UIImage+ForceDecode.m in Sources */, + C118334CFB7C43F8EFE615B0C66C1078 /* UIImage+GIF.m in Sources */, + 09BDBBF0B88B52D2ACBB454BDBA94CAB /* UIImage+MemoryCacheCost.m in Sources */, + 9F9BC40A239CEA83F849DDC2C4F375A7 /* UIImage+Metadata.m in Sources */, + 7ACAFB8878D787E4FB3D716750C91E8C /* UIImage+MultiFormat.m in Sources */, + D531DD839DFEF7D21041913C6B1BF95E /* UIImage+Transform.m in Sources */, + A8A9DA6C580EAE3E50B590CEDF0A45CC /* UIImageView+HighlightedWebCache.m in Sources */, + 2420216F493F3D0E2038DDF1E8E8C7C6 /* UIImageView+WebCache.m in Sources */, + 39B39F80D3373C1F6C7BAB344310A1C9 /* UIView+WebCache.m in Sources */, + 43DA4C5AD87FBD2334FEED50DD133D4F /* UIView+WebCacheOperation.m in Sources */, + 51F93BB4A8A45852EB003139085145C4 /* UIView+WebCacheState.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A0BD1FC6FF7A1E6E2EC94DE4CDF1DA61 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; A60E7D11219A77AC97624EE5EFAE16C4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -871,19 +1806,35 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - D73C4EB97843C82E030E491F2D212141 /* Sources */ = { + AD4475E0BA3D83247D0815C868B78D0D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 41CC97B0C6B55C160191247F4CF2D8ED /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */, + 4BC4C53C7CA74C73E4841FC2CD3E32C0 /* ActivityIndicator.swift in Sources */, + 9E1DDCCA92AF0B9F1D1C6A670877FF59 /* AnimatedImage.swift in Sources */, + DF480FFE4BD46226C855A72CD81E50E8 /* Backport.swift in Sources */, + 8D05ED41A2FF6C70B78706F15F6098FE /* Image.swift in Sources */, + 96A5AC180E6F93402E7E57E2F592A3E8 /* ImageManager.swift in Sources */, + 9A19F8AF4CE027DF5271D2DAF670014C /* ImagePlayer.swift in Sources */, + 6D117033384F7B7E733B92455725CFA0 /* ImageViewWrapper.swift in Sources */, + 19EF8FDECF0A3B0DDF44ED4B7393C865 /* Indicator.swift in Sources */, + 959F820757DC746FDF7A3CD739523627 /* OnChange.swift in Sources */, + C737716F0120D6554E508ACD1ACA45C0 /* Overlay.swift in Sources */, + 4C4F24464D027DE21E5FB02DEB40D8C0 /* ProgressIndicator.swift in Sources */, + 82239DAE4AFBA4142974FBD8EB4620BF /* SDWebImageSwiftUI.swift in Sources */, + 92A408FEDAA401A41A7A235717062F82 /* SDWebImageSwiftUI-dummy.m in Sources */, + 0F2C8EDFFA5ADD894DC8D59811AB5B95 /* StateObject.swift in Sources */, + 7A5E9FDF0D7B71DDA61A79F171D0DBDE /* SwiftUICompatibility.swift in Sources */, + 107828081DC817509AEA4BC0755995CF /* Transition.swift in Sources */, + 90E9C7C7189370C95BEE1EB205BB4CDB /* WebImage.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - EB0148397D0D3BE3BDDD286B33CDA7DE /* Sources */ = { + DBC720CEC2491EE385D95F9C2C84766F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B1FF3AA160C3354557A6B38A48756E98 /* Pods-demo-store-ios-dummy.m in Sources */, + C35EED1B7854674B923283BF02AE95DC /* Pods-demo-store-ios-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1035,30 +1986,66 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 504A7F75DEBB11C4718A9166A011498E /* PBXTargetDependency */ = { + 1422FFBC3FAE6A8E66A59E9991FB1D3A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; + targetProxy = 8C40AB809AAB92156705FE0682FB8425 /* PBXContainerItemProxy */; + }; + 3BD1B5A0933BDF89AE8558F70FB52BE0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = REES46; target = 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */; - targetProxy = 97FD9F25B8F6CE6ACEDF790C858E79E0 /* PBXContainerItemProxy */; + targetProxy = 40A7CB4B0A15AA26A286237C3DC95BE1 /* PBXContainerItemProxy */; }; - E331C98E7CB8005A04A6364504C13DF3 /* PBXTargetDependency */ = { + 438E91038E0BBFC70FDAD160E6B0234B /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = REES46; target = 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */; - targetProxy = DCDA243612AE8D7094728CC593FF8178 /* PBXContainerItemProxy */; + targetProxy = 542A9B83BEF9F0BD938799CC124BE455 /* PBXContainerItemProxy */; }; - FAC7701D239872B8311C4054D9DB2831 /* PBXTargetDependency */ = { + 4AAF63A99B6A0D5ECFA6EBEEEA4F4CF9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "SDWebImage-SDWebImage"; + target = 94CFBA7D633ECA58DF85C327B035E6A3 /* SDWebImage-SDWebImage */; + targetProxy = A99F31A5E5D289319F21440CF2383E43 /* PBXContainerItemProxy */; + }; + B74B7BB4D4D8D02690801F2EBFBC3A24 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImageSwiftUI; + target = 92EBFA3E7005B4C18A9C0B44324EB80F /* SDWebImageSwiftUI */; + targetProxy = 2C892BD4D849AC22F2605C37038732CF /* PBXContainerItemProxy */; + }; + BDD19974F6C9A3105CCA953F44D62A2D /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "Pods-demo-store-ios"; target = 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */; - targetProxy = 40C2C9959393295F1B86C75B81551CC4 /* PBXContainerItemProxy */; + targetProxy = F08BBAD3B89A5D7B7714C68348C87676 /* PBXContainerItemProxy */; + }; + CFA86728496B80A0F40BE4CE2B7303F5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImageSwiftUI; + target = 92EBFA3E7005B4C18A9C0B44324EB80F /* SDWebImageSwiftUI */; + targetProxy = 7097CE6E72D7582F22EAD3655DE54080 /* PBXContainerItemProxy */; + }; + E1D43F48E69B1706A4D9B6B5EEB6B91B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; + targetProxy = 2B029E60540F41DAED3EF429AB0F6B86 /* PBXContainerItemProxy */; + }; + F55303ADA6093A5D638E87257AFC271B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; + targetProxy = C11ED8B5E2E81E3D5DDCCC1AE1E2D4D4 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 0543067DFA4157D877ECC1E37BB23EB4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */; + baseConfigurationReference = DBC37411E3FBDB55CA1205401E6D3AE2 /* REES46.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1072,7 +2059,7 @@ GCC_PREFIX_HEADER = "Target Support Files/REES46/REES46-prefix.pch"; INFOPLIST_FILE = "Target Support Files/REES46/REES46-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1094,7 +2081,7 @@ }; 06C2BC5254088328504EE61E0205587A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */; + baseConfigurationReference = 2A368399C2160AC6329182F20B166F4E /* REES46.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1108,7 +2095,7 @@ GCC_PREFIX_HEADER = "Target Support Files/REES46/REES46-prefix.pch"; INFOPLIST_FILE = "Target Support Files/REES46/REES46-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1127,9 +2114,135 @@ }; name = Debug; }; - 223F613DD12A97C370C9A8BBBA680196 /* Debug */ = { + 12C3793CAA6A936CFDB35471990579E6 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A6EB5D5955124BD96D5764A18024EBC9 /* Pods-demo-store-iosTests.debug.xcconfig */; + baseConfigurationReference = A21051CBF115DB2382ACC62E5753C6D1 /* SDWebImageSwiftUI.debug.xcconfig */; + buildSettings = { + 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"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap"; + PRODUCT_MODULE_NAME = SDWebImageSwiftUI; + PRODUCT_NAME = SDWebImageSwiftUI; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 194F8E05422FF77311DB227A533193FF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B799A41A144BDE98B056E872D41934CC /* SDWebImage.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage"; + IBSC_MODULE = SDWebImage; + INFOPLIST_FILE = "Target Support Files/SDWebImage/ResourceBundle-SDWebImage-SDWebImage-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 1F2E29403E8C783A50BC01060DEDC63D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2A71319F6A963531ACFFF30BCBC6DDB2 /* Pods-demo-store-ios-demo-store-iosUITests.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-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.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; + }; + 32040D39D02117DCCA9D23325823FC56 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3462E4224B703F8B93A5EA4485EDB339 /* SDWebImageSwiftUI.release.xcconfig */; + buildSettings = { + 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"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap"; + PRODUCT_MODULE_NAME = SDWebImageSwiftUI; + PRODUCT_NAME = SDWebImageSwiftUI; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 5323D08F969F6C0F1D91FBBD3911281C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6FEE741AF14146505421E6B9B790997B /* Pods-demo-store-iosTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -1143,7 +2256,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1159,12 +2272,67 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 712520B37F5A38A33B6D48486F7DC8BE /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 29D5B0FFB0FB808508AA9BDC2557AA03 /* SDWebImage.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage"; + IBSC_MODULE = SDWebImage; + INFOPLIST_FILE = "Target Support Files/SDWebImage/ResourceBundle-SDWebImage-SDWebImage-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 8D8A7B664F9680616A78EFCDEECA9F9D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B41372352EEE4B1588AE589803A39DAD /* Pods-demo-store-ios.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-demo-store-ios/Pods-demo-store-ios-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.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; }; - 2B9E26EAE2CD392AD762421F663075A1 /* Debug */ = { + 8DE5143C03248BB6CD542DE3963D6F3A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1202,7 +2370,6 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -1218,7 +2385,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -1231,47 +2398,9 @@ }; name = Debug; }; - 49EA8E87E9FEEFE7A39E5DE24D678A23 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3433BC654811C432BEF5CB32AAF90EFB /* Pods-demo-store-ios.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-demo-store-ios/Pods-demo-store-ios-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.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; - }; - 54DD08EE33F7AEF6E15ACEB4A2A3D5C7 /* Debug */ = { + 8FB812FDCD5C88BDCA905744FB8532EC /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D5AC60A10479B2D353EC371DC8B83A57 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; + baseConfigurationReference = A6EB5D5955124BD96D5764A18024EBC9 /* Pods-demo-store-iosTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -1283,16 +2412,16 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1306,7 +2435,7 @@ }; name = Debug; }; - 63FAF33E1C55B71A5F5A8B3CC8749F99 /* Release */ = { + 9E406C6AAF85E580207CD97B0044DEAB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1344,7 +2473,6 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -1357,7 +2485,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1369,9 +2497,9 @@ }; name = Release; }; - B11EC91B86D8E2B9AFB081C6BE92B63D /* Debug */ = { + B1A1A664FE9DB4275011BEDF58A2167A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B41372352EEE4B1588AE589803A39DAD /* Pods-demo-store-ios.debug.xcconfig */; + baseConfigurationReference = D5AC60A10479B2D353EC371DC8B83A57 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -1383,16 +2511,16 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1406,9 +2534,43 @@ }; name = Debug; }; - B1EF0CE90FBACBD5AE75C9B20E847EE2 /* Release */ = { + B53529646157685ADF71C0B6409AB0DA /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2A71319F6A963531ACFFF30BCBC6DDB2 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */; + baseConfigurationReference = 29D5B0FFB0FB808508AA9BDC2557AA03 /* SDWebImage.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/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/SDWebImage-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_MODULE_NAME = SDWebImage; + PRODUCT_NAME = SDWebImage; + 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; + }; + BD1E3AF2443E8DE24193FB7D30E5CFA2 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3433BC654811C432BEF5CB32AAF90EFB /* Pods-demo-store-ios.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -1420,16 +2582,16 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1444,12 +2606,10 @@ }; name = Release; }; - EA7EA17ED62FCF720DF60909BD5D8380 /* Release */ = { + D37BA8376F970DA8A2D8CFAFFE486465 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6FEE741AF14146505421E6B9B790997B /* Pods-demo-store-iosTests.release.xcconfig */; + baseConfigurationReference = B799A41A144BDE98B056E872D41934CC /* SDWebImage.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*]" = ""; @@ -1458,23 +2618,22 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SDWebImage/SDWebImage-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; + PRODUCT_MODULE_NAME = SDWebImage; + PRODUCT_NAME = SDWebImage; 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"; @@ -1485,11 +2644,11 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 055840A6FA6AAA9EF10FDACFBB00DB5C /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */ = { + 12F9C39CC5E96865A33F3F640ED54ADE /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - B11EC91B86D8E2B9AFB081C6BE92B63D /* Debug */, - 49EA8E87E9FEEFE7A39E5DE24D678A23 /* Release */, + B1A1A664FE9DB4275011BEDF58A2167A /* Debug */, + 1F2E29403E8C783A50BC01060DEDC63D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1506,26 +2665,53 @@ 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2B9E26EAE2CD392AD762421F663075A1 /* Debug */, - 63FAF33E1C55B71A5F5A8B3CC8749F99 /* Release */, + 8DE5143C03248BB6CD542DE3963D6F3A /* Debug */, + 9E406C6AAF85E580207CD97B0044DEAB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DDA0AEAEF33653027530506736479FDE /* Build configuration list for PBXNativeTarget "Pods-demo-store-iosTests" */ = { + 65F383B89BC176EDEB551DB2BFCAE26C /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B53529646157685ADF71C0B6409AB0DA /* Debug */, + D37BA8376F970DA8A2D8CFAFFE486465 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 84FF48163961B4CAB8D16B0E5E75CCD0 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8D8A7B664F9680616A78EFCDEECA9F9D /* Debug */, + BD1E3AF2443E8DE24193FB7D30E5CFA2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A1EA36506852AF79BBAB619F1CD9B763 /* Build configuration list for PBXNativeTarget "SDWebImage-SDWebImage" */ = { isa = XCConfigurationList; buildConfigurations = ( - 223F613DD12A97C370C9A8BBBA680196 /* Debug */, - EA7EA17ED62FCF720DF60909BD5D8380 /* Release */, + 712520B37F5A38A33B6D48486F7DC8BE /* Debug */, + 194F8E05422FF77311DB227A533193FF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - FFFF784778B0D8536B0539C3A7ED3159 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */ = { + A55791BDAB310B5F7CCCF664D1DFC367 /* Build configuration list for PBXNativeTarget "SDWebImageSwiftUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 12C3793CAA6A936CFDB35471990579E6 /* Debug */, + 32040D39D02117DCCA9D23325823FC56 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DDA0AEAEF33653027530506736479FDE /* Build configuration list for PBXNativeTarget "Pods-demo-store-iosTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 54DD08EE33F7AEF6E15ACEB4A2A3D5C7 /* Debug */, - B1EF0CE90FBACBD5AE75C9B20E847EE2 /* Release */, + 8FB812FDCD5C88BDCA905744FB8532EC /* Debug */, + 5323D08F969F6C0F1D91FBBD3911281C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown index e55d3e5..f85cc84 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown @@ -23,4 +23,51 @@ 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 REES46 SOFTWARE. + +## SDWebImage + +Copyright (c) 2009-2020 Olivier Poitrey rs@dailymotion.com + +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. + + + +## SDWebImageSwiftUI + +Copyright (c) 2019 lizhuoli1126@126.com + +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/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist index 34b435c..6d8ba7b 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist @@ -41,6 +41,65 @@ THE REES46 SOFTWARE. Type PSGroupSpecifier + + FooterText + Copyright (c) 2009-2020 Olivier Poitrey rs@dailymotion.com + +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 + SDWebImage + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2019 lizhuoli1126@126.com <lizhuoli1126@126.com> + +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 + SDWebImageSwiftUI + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist index 9bbe13e..54c0fe6 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist @@ -1,2 +1,4 @@ ${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh -${BUILT_PRODUCTS_DIR}/REES46/REES46.framework \ No newline at end of file +${BUILT_PRODUCTS_DIR}/REES46/REES46.framework +${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework +${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist index 628e46b..eb96684 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist @@ -1 +1,3 @@ -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist index 9bbe13e..54c0fe6 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist @@ -1,2 +1,4 @@ ${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh -${BUILT_PRODUCTS_DIR}/REES46/REES46.framework \ No newline at end of file +${BUILT_PRODUCTS_DIR}/REES46/REES46.framework +${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework +${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist index 628e46b..eb96684 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist @@ -1 +1,3 @@ -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh index b17e8ae..b3209ff 100755 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh @@ -177,9 +177,13 @@ code_sign_if_enabled() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/REES46/REES46.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/REES46/REES46.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig index 1826d4c..ebd8518 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "REES46" +OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig index 1826d4c..ebd8518 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "REES46" +OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown index e55d3e5..f85cc84 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown @@ -23,4 +23,51 @@ 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 REES46 SOFTWARE. + +## SDWebImage + +Copyright (c) 2009-2020 Olivier Poitrey rs@dailymotion.com + +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. + + + +## SDWebImageSwiftUI + +Copyright (c) 2019 lizhuoli1126@126.com + +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/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist index 34b435c..6d8ba7b 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist @@ -41,6 +41,65 @@ THE REES46 SOFTWARE. Type PSGroupSpecifier + + FooterText + Copyright (c) 2009-2020 Olivier Poitrey rs@dailymotion.com + +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 + SDWebImage + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2019 lizhuoli1126@126.com <lizhuoli1126@126.com> + +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 + SDWebImageSwiftUI + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist index d4accde..0914b96 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist @@ -1,2 +1,4 @@ ${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh -${BUILT_PRODUCTS_DIR}/REES46/REES46.framework \ No newline at end of file +${BUILT_PRODUCTS_DIR}/REES46/REES46.framework +${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework +${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist index 628e46b..eb96684 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist @@ -1 +1,3 @@ -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist index d4accde..0914b96 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist @@ -1,2 +1,4 @@ ${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh -${BUILT_PRODUCTS_DIR}/REES46/REES46.framework \ No newline at end of file +${BUILT_PRODUCTS_DIR}/REES46/REES46.framework +${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework +${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist index 628e46b..eb96684 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist @@ -1 +1,3 @@ -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh index b17e8ae..b3209ff 100755 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh @@ -177,9 +177,13 @@ code_sign_if_enabled() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/REES46/REES46.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/REES46/REES46.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig index f6da505..3d3516b 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "REES46" +OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig index f6da505..3d3516b 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "REES46" +OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig index 40b2d2d..32c08dd 100644 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig @@ -1,8 +1,8 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "REES46" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig index 40b2d2d..32c08dd 100644 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig @@ -1,8 +1,8 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "REES46" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 905a5af..bb29691 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */; }; 452CB1BD95293EB9465F6C4C /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF343FE4C1EB44258E4142CD /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; 748A7C58839E67C62D21DB52 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; @@ -44,7 +45,6 @@ 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */; }; 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */; }; 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD192C36F94800D6D346 /* BottomBarView.swift */; }; - 79D46076E61CE01A7716D506 /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -120,7 +120,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 79D46076E61CE01A7716D506 /* Pods_demo_store_ios.framework in Frameworks */, + 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -757,7 +757,7 @@ LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; + ONLY_ACTIVE_ARCH = NO; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist index 8abce06..c1b9618 100644 --- a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ demo-store-ios.xcscheme_^#shared#^_ orderHint - 4 + 7 diff --git a/demo-store-ios/features/catalogTab/CatalogScreenView.swift b/demo-store-ios/features/catalogTab/CatalogScreenView.swift index 9fd92d7..1812e51 100644 --- a/demo-store-ios/features/catalogTab/CatalogScreenView.swift +++ b/demo-store-ios/features/catalogTab/CatalogScreenView.swift @@ -1,14 +1,69 @@ - import SwiftUI struct CatalogScreenView: View { + + var product: RecommendedProduct? + + @State private var selectedImageIndex = 0 + var body: some View { NavigationView { - VStack { - + ScrollView { + VStack(alignment: .leading) { + + Spacer().frame(height: 20) + + Text("Home / \(product?.name ?? "") / \(product?.brand ?? "")") + .font(.system(size: 14)) + .foregroundColor(.gray) + .padding(.horizontal) + + Spacer().frame(height: 20) + + if let product = product { + let imageUrls = Array(product.resizedImages.values.sorted()) + + TabView(selection: $selectedImageIndex) { + ForEach(imageUrls.indices, id: \.self) { index in + RemoteImageView( + urlString: imageUrls[index], + width: 350, + height: 350, + contentMode: .fill + ).tag(index) + } + } + .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never)) + .frame(height: 300) + + Spacer().frame(height: 20) + + HStack { + ForEach(0.. Void) { - sdkManager.sdk?.recommend(blockId: blockId, currentProductId: currentProductId) { response in + sdkManager.sdk?.recommend( + blockId: blockId, + currentProductId: currentProductId + ) { response in switch response { case .success(let recommendResponse): let products = RecommendedProductMapper.mapResponseToProducts(response: recommendResponse) diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index b23b415..e3bd4d4 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -105,9 +105,6 @@ } } } - }, - "Favourites" : { - }, "go_home_button" : { "extractionState" : "manual", @@ -120,6 +117,16 @@ } } }, + "Home / %@ / %@" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Home / %1$@ / %2$@" + } + } + } + }, "login_button" : { "extractionState" : "manual", "localizations" : { @@ -152,6 +159,9 @@ } } } + }, + "No product data available" : { + }, "process_timeout_title" : { "extractionState" : "manual", @@ -164,8 +174,16 @@ } } }, - "Products" : { - + "products_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Products" + } + } + } }, "reccomender_title" : { "extractionState" : "manual", From ad258303cc13b3cbfe61d7757efd699b5ea463c3 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 12 Jul 2024 15:24:06 +0200 Subject: [PATCH 30/85] feat: Add rating and reviews --- .../catalogTab/CatalogScreenView.swift | 177 ++++++++++++++---- .../features/mainTab/MainScreenView.swift | 6 +- demo-store-ios/utils/RatingConverter.swift | 22 ++- resources/Localizable.xcstrings | 11 ++ 4 files changed, 170 insertions(+), 46 deletions(-) diff --git a/demo-store-ios/features/catalogTab/CatalogScreenView.swift b/demo-store-ios/features/catalogTab/CatalogScreenView.swift index 1812e51..a5920d6 100644 --- a/demo-store-ios/features/catalogTab/CatalogScreenView.swift +++ b/demo-store-ios/features/catalogTab/CatalogScreenView.swift @@ -10,60 +10,155 @@ struct CatalogScreenView: View { NavigationView { ScrollView { VStack(alignment: .leading) { - + topSection + productImagesSection + productDetailsSection Spacer().frame(height: 20) - - Text("Home / \(product?.name ?? "") / \(product?.brand ?? "")") - .font(.system(size: 14)) - .foregroundColor(.gray) - .padding(.horizontal) - - Spacer().frame(height: 20) - - if let product = product { - let imageUrls = Array(product.resizedImages.values.sorted()) - - TabView(selection: $selectedImageIndex) { - ForEach(imageUrls.indices, id: \.self) { index in - RemoteImageView( - urlString: imageUrls[index], - width: 350, - height: 350, - contentMode: .fill - ).tag(index) - } + VStack { + if let oldPrice = product?.oldPriceFormatted { + Text(oldPrice) + .font(.subheadline) + .foregroundColor(.secondary) + .strikethrough() } - .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never)) - .frame(height: 300) - Spacer().frame(height: 20) + Spacer().frame(height: 4) HStack { - ForEach(0.. String { + if Double(index) <= rating { + return "star.fill" + } else if Double(index) - rating < 1 { + return "star.lefthalf.fill" + } else { + return "star" + } + } } diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index e3bd4d4..43edc67 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -185,6 +185,17 @@ } } }, + "rating_reviews" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reviews" + } + } + } + }, "reccomender_title" : { "extractionState" : "manual", "localizations" : { From d8300a7b11ae45b25d2a6d6c75801d57d89c1071 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 12 Jul 2024 23:01:48 +0200 Subject: [PATCH 31/85] feat: Add price and discount --- .../catalogTab/CatalogScreenView.swift | 54 +++++++++++++------ demo-store-ios/utils/RemoteImageLoader.swift | 7 ++- resources/Localizable.xcstrings | 3 ++ 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/demo-store-ios/features/catalogTab/CatalogScreenView.swift b/demo-store-ios/features/catalogTab/CatalogScreenView.swift index a5920d6..cacc5ec 100644 --- a/demo-store-ios/features/catalogTab/CatalogScreenView.swift +++ b/demo-store-ios/features/catalogTab/CatalogScreenView.swift @@ -10,26 +10,15 @@ struct CatalogScreenView: View { NavigationView { ScrollView { VStack(alignment: .leading) { + topSection + productImagesSection + productDetailsSection - Spacer().frame(height: 20) - VStack { - if let oldPrice = product?.oldPriceFormatted { - Text(oldPrice) - .font(.subheadline) - .foregroundColor(.secondary) - .strikethrough() - } - - Spacer().frame(height: 4) - - HStack { - Text(product?.priceFormatted ?? "") - .font(.system(size: 17, weight: .bold)) - .foregroundColor(.primary) - } - } + + priceSection + } .padding(.horizontal) .background(Color.white) @@ -42,6 +31,7 @@ struct CatalogScreenView: View { } } } + } private var topSection: some View { @@ -122,6 +112,36 @@ struct CatalogScreenView: View { .lineSpacing(8) } } + + private var priceSection: some View { + VStack(alignment: .leading, spacing: 4) { + Spacer().frame(height: 20) + + Text(product?.oldPriceFormatted ?? "₽ 42") + .font(.system(size: 18)) + .foregroundColor(.secondary) + .strikethrough() + + HStack { + Text(product?.priceFormatted ?? "") + .font(.system(size: 17, weight: .bold)) + .foregroundColor(.primary) + + Spacer().frame(width: 12) + + Text("\(Int.random(in: 1...50))%") + .font(.system(size: 16)) + .frame(width: 46, height: 18) + .foregroundColor(.white) + .padding(8) + .background(Color.red) + .cornerRadius(8) + } + Spacer().frame(height: 20) + } + .frame(maxWidth: .infinity, alignment: .topLeading) + } + } struct CatalogScreenView_Previews: PreviewProvider { diff --git a/demo-store-ios/utils/RemoteImageLoader.swift b/demo-store-ios/utils/RemoteImageLoader.swift index 82a13f6..e0ae157 100644 --- a/demo-store-ios/utils/RemoteImageLoader.swift +++ b/demo-store-ios/utils/RemoteImageLoader.swift @@ -29,7 +29,12 @@ struct RemoteImageView: View { let height: CGFloat? let contentMode: ContentMode - init(urlString: String, width: CGFloat? = nil, height: CGFloat? = nil, contentMode: ContentMode = .fit) { + init( + urlString: String, + width: CGFloat? = nil, + height: CGFloat? = nil, + contentMode: ContentMode = .fit + ) { self.urlString = urlString self.width = width self.height = height diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 43edc67..a845166 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -6,6 +6,9 @@ }, "%lld" : { + }, + "%lld%%" : { + }, "also_bought_title" : { "extractionState" : "manual", From d61a560bb8edd6ab3fc4afe062dc130643c43cb1 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 12 Jul 2024 23:42:00 +0200 Subject: [PATCH 32/85] feat: Add recommendation section in product details --- .../catalogTab/CatalogScreenView.swift | 126 ++++++++++++------ .../features/mainTab/MainScreenView.swift | 9 +- demo-store-ios/viewModel/SdkViewModel.swift | 11 +- resources/Localizable.xcstrings | 20 +++ 4 files changed, 115 insertions(+), 51 deletions(-) diff --git a/demo-store-ios/features/catalogTab/CatalogScreenView.swift b/demo-store-ios/features/catalogTab/CatalogScreenView.swift index cacc5ec..d58c4b0 100644 --- a/demo-store-ios/features/catalogTab/CatalogScreenView.swift +++ b/demo-store-ios/features/catalogTab/CatalogScreenView.swift @@ -3,6 +3,7 @@ import SwiftUI struct CatalogScreenView: View { var product: RecommendedProduct? + @ObservedObject var viewModel = SDKViewModel() @State private var selectedImageIndex = 0 @@ -19,9 +20,11 @@ struct CatalogScreenView: View { priceSection - } - .padding(.horizontal) - .background(Color.white) + actionSection + + recomendSection + + } .background(Color.white) } .onAppear { if let product = product { @@ -31,7 +34,6 @@ struct CatalogScreenView: View { } } } - } private var topSection: some View { @@ -41,7 +43,7 @@ struct CatalogScreenView: View { .font(.system(size: 14)) .foregroundColor(.gray) Spacer().frame(height: 20) - } + }.padding(.horizontal) } private var productImagesSection: some View { @@ -77,7 +79,7 @@ struct CatalogScreenView: View { .foregroundColor(.black) .padding() } - } + }.padding(.horizontal) } private var productDetailsSection: some View { @@ -110,7 +112,7 @@ struct CatalogScreenView: View { .font(.system(size: 13, weight: .regular)) .foregroundColor(.black) .lineSpacing(8) - } + }.padding(.horizontal) } private var priceSection: some View { @@ -139,46 +141,84 @@ struct CatalogScreenView: View { } Spacer().frame(height: 20) } + .padding(.horizontal) .frame(maxWidth: .infinity, alignment: .topLeading) } + private var actionSection: some View { + HStack { + CounterSectionView() + .frame(height: 50) + .background(Color.white) + .border(Color.gray, width: 1) + .cornerRadius(4) + + Spacer().frame(width: 16) + + Button(action: { + // Action for the button + }) { + Text("Add to Cart") + .font(.system(size: 17, weight: .bold)) + .foregroundColor(.white) + .frame(maxWidth: .infinity, maxHeight: 50) + .background(Color.black) + .cornerRadius(8) + } + } + .padding(.horizontal) + .frame(height: 50) + } + + private var recomendSection: some View { + VStack{ + Spacer().frame(height : 36) + + ShortRecommendationListView( + recommendedProducts: viewModel.recommenderProducts, + title: NSLocalizedString("recommend_like_title", comment: "") + ) + .onAppear { + viewModel.loadRecommenderRecommendations( currentProductId: "665") + } + + Spacer().frame(height: 36) + } + } } -struct CatalogScreenView_Previews: PreviewProvider { - static var previews: some View { - CatalogScreenView( - product: RecommendedProduct( - id: "1", - barcode: "123456", - name: "Product 1", - brand: "Brand 1", - model: "Model 1", - description: "Description 1", - imageUrl: "https://example.com/product1.jpg", - resizedImageUrl: "https://example.com/product1_resized.jpg", - url: "https://example.com/product1", - deeplinkIos: "", - categories: [], - locations: [], - price: 99.99, - priceFormatted: "$99.99", - priceFull: 129.99, - priceFullFormatted: "$129.99", - oldPrice: 10.0, - oldPriceFormatted: "$129.99", - oldPriceFull: 0.0, - oldPriceFullFormatted: nil, - currency: "USD", - salesRate: 10, - discount: 20, - rating: 4, - relativeSalesRate: 0.5, - paramsRaw: nil, - fashionOriginalSizes: [], - fashionSizes: [], - fashionColors: [], - resizedImages: [:] - ) - ) +struct CounterSectionView: View { + @State private var counter = 0 + + var body: some View { + HStack(spacing: 0) { + Button(action: { + if counter > 0 { + counter -= 1 + } + }) { + Text("-") + .font(.system(size: 20, weight: .bold)) + .foregroundColor(.black) + .frame(width: 50, height: 50) + .background(Color.white) + } + + Text("\(counter)") + .font(.system(size: 20, weight: .bold)) + .foregroundColor(.black) + .frame(width: 50, height: 50) + .background(Color.white) + + Button(action: { + counter += 1 + }) { + Text("+") + .font(.system(size: 20, weight: .bold)) + .foregroundColor(.black) + .frame(width: 50, height: 50) + .background(Color.white) + } + } } } diff --git a/demo-store-ios/features/mainTab/MainScreenView.swift b/demo-store-ios/features/mainTab/MainScreenView.swift index cd35f0b..1435da3 100644 --- a/demo-store-ios/features/mainTab/MainScreenView.swift +++ b/demo-store-ios/features/mainTab/MainScreenView.swift @@ -18,22 +18,23 @@ struct MainScreenView: View { ShortRecommendationListView( recommendedProducts: viewModel.arrivalsProducts, title: NSLocalizedString("arrivals_title", comment: "") - ).onAppear { - viewModel.loadArrivalsRecommendations(blockId: blockId, currentProductId: "670") + ) + .onAppear { + viewModel.loadArrivalsRecommendations( currentProductId: "670") } ShortRecommendationListView( recommendedProducts: viewModel.topTrendProducts, title: NSLocalizedString("top_trend_title", comment: "") ).onAppear { - viewModel.loadTopTrendRecommendations(blockId: blockId, currentProductId: "656") + viewModel.loadTopTrendRecommendations(currentProductId: "656") } ShortRecommendationListView( recommendedProducts: viewModel.recommenderProducts, title: NSLocalizedString("reccomender_title", comment: "") ).onAppear { - viewModel.loadRecommenderRecommendations(blockId: blockId, currentProductId: "651") + viewModel.loadRecommenderRecommendations(currentProductId: "651") } } diff --git a/demo-store-ios/viewModel/SdkViewModel.swift b/demo-store-ios/viewModel/SdkViewModel.swift index e75ab79..761a035 100644 --- a/demo-store-ios/viewModel/SdkViewModel.swift +++ b/demo-store-ios/viewModel/SdkViewModel.swift @@ -3,10 +3,13 @@ import Combine import REES46 class SDKViewModel: ObservableObject { + + private let blockId = "977cb67194a72fdc7b424f49d69a862d" + @Published var arrivalsProducts: [RecommendedProduct] = [] @Published var topTrendProducts: [RecommendedProduct] = [] @Published var recommenderProducts: [RecommendedProduct] = [] - + let sdkManager = SDKManager.shared func getRecommendations(blockId: String, currentProductId: String, completion: @escaping ([RecommendedProduct]) -> Void) { @@ -26,19 +29,19 @@ class SDKViewModel: ObservableObject { } } - func loadArrivalsRecommendations(blockId: String, currentProductId: String) { + func loadArrivalsRecommendations( currentProductId: String) { getRecommendations(blockId: blockId, currentProductId: currentProductId) { products in self.arrivalsProducts = products } } - func loadTopTrendRecommendations(blockId: String, currentProductId: String) { + func loadTopTrendRecommendations( currentProductId: String) { getRecommendations(blockId: blockId, currentProductId: currentProductId) { products in self.topTrendProducts = products } } - func loadRecommenderRecommendations(blockId: String, currentProductId: String) { + func loadRecommenderRecommendations( currentProductId: String) { getRecommendations(blockId: blockId, currentProductId: currentProductId) { products in self.recommenderProducts = products } diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index a845166..858f820 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -1,6 +1,9 @@ { "sourceLanguage" : "en", "strings" : { + "-" : { + + }, "%@" : { }, @@ -9,6 +12,12 @@ }, "%lld%%" : { + }, + "+" : { + + }, + "Add to Cart" : { + }, "also_bought_title" : { "extractionState" : "manual", @@ -210,6 +219,17 @@ } } }, + "recommend_like_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "You also may like" + } + } + } + }, "settings_sub_title" : { "extractionState" : "manual", "localizations" : { From b6488f5bfac2e1ad4fd3a4c67c37d0b09891762c Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Sat, 13 Jul 2024 00:23:19 +0200 Subject: [PATCH 33/85] feat: Add cart viewmodel --- demo-store-ios.xcodeproj/project.pbxproj | 26 ++++++++-- demo-store-ios/DemoStoreApp.swift | 2 +- .../cartTab/viewModel/CartViewModel.swift | 52 +++++++++++++++++++ .../catalogTab/CatalogScreenView.swift | 23 +++++--- .../features/mainTab/MainScreenView.swift | 2 +- .../stories/MainStoriesContainerView.swift | 2 +- .../controller/StoriesViewController.swift | 2 +- .../mainTab/viewModel/MainTabViewModel.swift} | 2 +- demo-store-ios/models/ProductCartItem.swift | 7 +++ 9 files changed, 100 insertions(+), 18 deletions(-) create mode 100644 demo-store-ios/features/cartTab/viewModel/CartViewModel.swift rename demo-store-ios/{viewModel/SdkViewModel.swift => features/mainTab/viewModel/MainTabViewModel.swift} (97%) create mode 100644 demo-store-ios/models/ProductCartItem.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index bb29691..e02315b 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -10,12 +10,14 @@ 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */; }; 452CB1BD95293EB9465F6C4C /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF343FE4C1EB44258E4142CD /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; 748A7C58839E67C62D21DB52 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */; }; + 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */; }; + 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; 75674CDE2C3C4292007FAB88 /* MainStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */; }; 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE52C3D295F007FAB88 /* SdkManager.swift */; }; - 75674CE82C3D299A007FAB88 /* SdkViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */; }; + 75674CE82C3D299A007FAB88 /* MainTabViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* MainTabViewModel.swift */; }; 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; 75674CF52C3D92CC007FAB88 /* Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Category.swift */; }; @@ -68,12 +70,14 @@ 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1274DEF2C4D166945251575B /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; + 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCartItem.swift; sourceTree = ""; }; + 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainStoriesContainerView.swift; sourceTree = ""; }; 75674CE52C3D295F007FAB88 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; - 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkViewModel.swift; sourceTree = ""; }; + 75674CE72C3D299A007FAB88 /* MainTabViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabViewModel.swift; sourceTree = ""; }; 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; 75674CF42C3D92CC007FAB88 /* Category.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Category.swift; sourceTree = ""; }; @@ -143,6 +147,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 752F1D3D2C41E1C6002D4AC3 /* viewModel */ = { + isa = PBXGroup; + children = ( + 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */, + ); + path = viewModel; + sourceTree = ""; + }; 7559449C2C357E1800C274C9 /* features */ = { isa = PBXGroup; children = ( @@ -167,6 +179,7 @@ 755944A22C35858C00C274C9 /* mainTab */ = { isa = PBXGroup; children = ( + 75674CE92C3D29BF007FAB88 /* viewModel */, 75674CF02C3D787A007FAB88 /* recommendation */, 75674CEC2C3D2E45007FAB88 /* discover */, 75674CEA2C3D2E32007FAB88 /* stories */, @@ -188,7 +201,7 @@ 75674CE92C3D29BF007FAB88 /* viewModel */ = { isa = PBXGroup; children = ( - 75674CE72C3D299A007FAB88 /* SdkViewModel.swift */, + 75674CE72C3D299A007FAB88 /* MainTabViewModel.swift */, ); path = viewModel; sourceTree = ""; @@ -233,6 +246,7 @@ children = ( 75674CF42C3D92CC007FAB88 /* Category.swift */, 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */, + 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */, ); path = models; sourceTree = ""; @@ -284,7 +298,6 @@ 75674CFA2C3D9957007FAB88 /* mappers */, 75674CF32C3D92B0007FAB88 /* models */, 75A3F4212C3828A400AAC175 /* Info.plist */, - 75674CE92C3D29BF007FAB88 /* viewModel */, 75ECCD1B2C37F09100D6D346 /* di */, 75ECCD182C36F92A00D6D346 /* navigation */, 755944A32C35883F00C274C9 /* mainSubView */, @@ -334,6 +347,7 @@ 75ECCD0D2C36BE0600D6D346 /* cartTab */ = { isa = PBXGroup; children = ( + 752F1D3D2C41E1C6002D4AC3 /* viewModel */, 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, ); path = cartTab; @@ -636,6 +650,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.swift in Sources */, 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */, 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */, @@ -656,11 +671,12 @@ 75E1C8ED2C3EACDA005018B4 /* DetailsToolbar.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */, - 75674CE82C3D299A007FAB88 /* SdkViewModel.swift in Sources */, + 75674CE82C3D299A007FAB88 /* MainTabViewModel.swift in Sources */, 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, + 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */, 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, diff --git a/demo-store-ios/DemoStoreApp.swift b/demo-store-ios/DemoStoreApp.swift index 0c61b01..56b7b15 100644 --- a/demo-store-ios/DemoStoreApp.swift +++ b/demo-store-ios/DemoStoreApp.swift @@ -2,7 +2,7 @@ import SwiftUI @main struct DemoStoreApp: App { - @StateObject private var sdkViewModel = SDKViewModel() + @StateObject private var sdkViewModel = MainTabViewModel() @State private var showSplash = true diff --git a/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift b/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift new file mode 100644 index 0000000..ee3b63b --- /dev/null +++ b/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift @@ -0,0 +1,52 @@ +import Foundation +import Combine + +class CartViewModel: ObservableObject { + @Published var cart: [ProductCartItem] = [] + + func addToCart(product: RecommendedProduct, quantity: Int) { + if let index = cart.firstIndex(where: { $0.product.id == product.id }) { + cart[index].quantity += quantity + let totalPrice = calculateTotalPrice(for: product.priceFormatted ?? "", quantity: cart[index].quantity) + print("Updated \(product.name) quantity to \(cart[index].quantity). Total Price: \(totalPrice)") + } else { + let newItem = ProductCartItem(product: product, quantity: quantity) + cart.append(newItem) + let totalPrice = calculateTotalPrice(for: product.priceFormatted ?? "", quantity: quantity) + print("Added \(product.name) with quantity \(quantity). Total Price: \(totalPrice)") + } + } + + func updateCartItem(productId: String, quantity: Int) { + if let index = cart.firstIndex(where: { $0.product.id == productId }) { + if quantity > 0 { + cart[index].quantity = quantity + let totalPrice = calculateTotalPrice(for: cart[index].product.priceFormatted ?? "", quantity: quantity) + print("Updated \(cart[index].product.name) quantity to \(quantity). Total Price: \(totalPrice)") + } else { + let removedProduct = cart.remove(at: index) + print("Removed \(removedProduct.product.name). Price: \(removedProduct.product.priceFormatted ?? "")") + } + } + } + + func removeFromCart(productId: String) { + if let index = cart.firstIndex(where: { $0.product.id == productId }) { + let removedProduct = cart.remove(at: index) + print("Removed \(removedProduct.product.name). Price: \(removedProduct.product.priceFormatted ?? "")") + } + } + + private func calculateTotalPrice(for priceString: String, quantity: Int) -> String { + // Assuming the price string is in the format "$99.99" + let numberFormatter = NumberFormatter() + numberFormatter.numberStyle = .currency + + if let priceNumber = numberFormatter.number(from: priceString)?.doubleValue { + let totalPrice = priceNumber * Double(quantity) + return numberFormatter.string(from: NSNumber(value: totalPrice)) ?? "N/A" + } + + return "N/A" + } +} diff --git a/demo-store-ios/features/catalogTab/CatalogScreenView.swift b/demo-store-ios/features/catalogTab/CatalogScreenView.swift index d58c4b0..784be4f 100644 --- a/demo-store-ios/features/catalogTab/CatalogScreenView.swift +++ b/demo-store-ios/features/catalogTab/CatalogScreenView.swift @@ -3,9 +3,11 @@ import SwiftUI struct CatalogScreenView: View { var product: RecommendedProduct? - @ObservedObject var viewModel = SDKViewModel() + @ObservedObject var viewModel = MainTabViewModel() + @ObservedObject var cartViewModel = CartViewModel() @State private var selectedImageIndex = 0 + @State private var counter = 1 var body: some View { NavigationView { @@ -24,7 +26,8 @@ struct CatalogScreenView: View { recomendSection - } .background(Color.white) + } + .background(Color.white) } .onAppear { if let product = product { @@ -133,7 +136,7 @@ struct CatalogScreenView: View { Text("\(Int.random(in: 1...50))%") .font(.system(size: 16)) - .frame(width: 46, height: 18) + .frame(width: 46, height: 14) .foregroundColor(.white) .padding(8) .background(Color.red) @@ -147,7 +150,7 @@ struct CatalogScreenView: View { private var actionSection: some View { HStack { - CounterSectionView() + CounterSectionView(counter: $counter) .frame(height: 50) .background(Color.white) .border(Color.gray, width: 1) @@ -155,9 +158,13 @@ struct CatalogScreenView: View { Spacer().frame(width: 16) - Button(action: { - // Action for the button - }) { + Button( + action: { + if let product = product { + cartViewModel.addToCart(product: product, quantity: counter) + } + } + ) { Text("Add to Cart") .font(.system(size: 17, weight: .bold)) .foregroundColor(.white) @@ -188,7 +195,7 @@ struct CatalogScreenView: View { } struct CounterSectionView: View { - @State private var counter = 0 + @Binding var counter: Int var body: some View { HStack(spacing: 0) { diff --git a/demo-store-ios/features/mainTab/MainScreenView.swift b/demo-store-ios/features/mainTab/MainScreenView.swift index 1435da3..731bf91 100644 --- a/demo-store-ios/features/mainTab/MainScreenView.swift +++ b/demo-store-ios/features/mainTab/MainScreenView.swift @@ -3,7 +3,7 @@ import REES46 struct MainScreenView: View { @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var viewModel = SDKViewModel() + @ObservedObject var viewModel = MainTabViewModel() private let blockId = "977cb67194a72fdc7b424f49d69a862d" diff --git a/demo-store-ios/features/mainTab/stories/MainStoriesContainerView.swift b/demo-store-ios/features/mainTab/stories/MainStoriesContainerView.swift index 5950e49..94dcd82 100644 --- a/demo-store-ios/features/mainTab/stories/MainStoriesContainerView.swift +++ b/demo-store-ios/features/mainTab/stories/MainStoriesContainerView.swift @@ -13,7 +13,7 @@ struct MainStoriesContainerView: View { StoriesViewControllerRepresentable() .frame(height: 200) } - .environmentObject(SDKViewModel()) + .environmentObject(MainTabViewModel()) } } diff --git a/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift b/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift index 55ad829..3de6e1c 100644 --- a/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift +++ b/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift @@ -35,7 +35,7 @@ class StoriesViewController: UIViewController { struct StoriesViewControllerRepresentable: UIViewControllerRepresentable { - @EnvironmentObject var sdkViewModel: SDKViewModel + @EnvironmentObject var sdkViewModel: MainTabViewModel func makeUIViewController(context: Context) -> StoriesViewController { let viewController = StoriesViewController() diff --git a/demo-store-ios/viewModel/SdkViewModel.swift b/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift similarity index 97% rename from demo-store-ios/viewModel/SdkViewModel.swift rename to demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift index 761a035..6db6736 100644 --- a/demo-store-ios/viewModel/SdkViewModel.swift +++ b/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift @@ -2,7 +2,7 @@ import Foundation import Combine import REES46 -class SDKViewModel: ObservableObject { +class MainTabViewModel: ObservableObject { private let blockId = "977cb67194a72fdc7b424f49d69a862d" diff --git a/demo-store-ios/models/ProductCartItem.swift b/demo-store-ios/models/ProductCartItem.swift new file mode 100644 index 0000000..d3e70f6 --- /dev/null +++ b/demo-store-ios/models/ProductCartItem.swift @@ -0,0 +1,7 @@ +import Foundation + +struct ProductCartItem: Identifiable { + var id: String { product.id } + let product: RecommendedProduct + var quantity: Int +} From 564debe9926003b387a7e0889aba1ed608ec3e38 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Sat, 13 Jul 2024 01:06:48 +0200 Subject: [PATCH 34/85] feat: Add cart repository --- demo-store-ios.xcodeproj/project.pbxproj | 12 +++++ demo-store-ios/DemoStoreApp.swift | 2 + .../features/cartTab/CartScreenView.swift | 27 ++++++++-- .../cartTab/repository/CartRepository.swift | 41 ++++++++++++++ .../cartTab/viewModel/CartViewModel.swift | 53 ++++++------------- .../catalogTab/CatalogScreenView.swift | 3 +- .../recommendation/ProductListItemView.swift | 1 + .../mainTab/viewModel/MainTabViewModel.swift | 14 +++++ demo-store-ios/models/ProductCartItem.swift | 16 +++++- resources/Localizable.xcstrings | 9 ++++ 10 files changed, 131 insertions(+), 47 deletions(-) create mode 100644 demo-store-ios/features/cartTab/repository/CartRepository.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index e02315b..4f462e3 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 748A7C58839E67C62D21DB52 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */; }; 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */; }; 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */; }; + 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; @@ -72,6 +73,7 @@ 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCartItem.swift; sourceTree = ""; }; 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; + 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepository.swift; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; @@ -155,6 +157,14 @@ path = viewModel; sourceTree = ""; }; + 752F1D3E2C41E5AC002D4AC3 /* repository */ = { + isa = PBXGroup; + children = ( + 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */, + ); + path = repository; + sourceTree = ""; + }; 7559449C2C357E1800C274C9 /* features */ = { isa = PBXGroup; children = ( @@ -347,6 +357,7 @@ 75ECCD0D2C36BE0600D6D346 /* cartTab */ = { isa = PBXGroup; children = ( + 752F1D3E2C41E5AC002D4AC3 /* repository */, 752F1D3D2C41E1C6002D4AC3 /* viewModel */, 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, ); @@ -675,6 +686,7 @@ 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, + 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */, 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, diff --git a/demo-store-ios/DemoStoreApp.swift b/demo-store-ios/DemoStoreApp.swift index 56b7b15..2560c7d 100644 --- a/demo-store-ios/DemoStoreApp.swift +++ b/demo-store-ios/DemoStoreApp.swift @@ -2,8 +2,10 @@ import SwiftUI @main struct DemoStoreApp: App { + @StateObject private var sdkViewModel = MainTabViewModel() + @State private var showSplash = true var body: some Scene { diff --git a/demo-store-ios/features/cartTab/CartScreenView.swift b/demo-store-ios/features/cartTab/CartScreenView.swift index cc34e0b..14f1db2 100644 --- a/demo-store-ios/features/cartTab/CartScreenView.swift +++ b/demo-store-ios/features/cartTab/CartScreenView.swift @@ -1,15 +1,32 @@ - import SwiftUI struct CartScreenView: View { + @ObservedObject var cartViewModel = CartViewModel() + var body: some View { NavigationView { VStack { - Text("cart_tab_title") - .foregroundColor(.white) + Text("Cart Items:") + .font(.title) + .foregroundColor(.black) + .padding() + + List(cartViewModel.cartItems) { cartItem in + VStack(alignment: .leading) { + Text(cartItem.product.name) + .font(.headline) + Text("Price: \(cartItem.product.priceFormatted ?? "")") + .foregroundColor(.gray) + } + .padding() + .background(Color.white) + .cornerRadius(8) + .shadow(radius: 2) + .padding(.horizontal) + } + .listStyle(InsetListStyle()) + .navigationBarTitle("Cart") } - .navigationTitle("cart_tab_title") - .background(Color.black.edgesIgnoringSafeArea(.all)) } } } diff --git a/demo-store-ios/features/cartTab/repository/CartRepository.swift b/demo-store-ios/features/cartTab/repository/CartRepository.swift new file mode 100644 index 0000000..4a60d4a --- /dev/null +++ b/demo-store-ios/features/cartTab/repository/CartRepository.swift @@ -0,0 +1,41 @@ +import Foundation +import Combine + +class CartRepository: ObservableObject { + + static let shared = CartRepository() + + private init() {} + + @Published var cartItems: [ProductCartItem] = [] + + func addToCart(product: RecommendedProduct, quantity: Int) { + if let index = cartItems.firstIndex(where: { $0.product.id == product.id }) { + cartItems[index].quantity += quantity + print("Updated \(product.name) quantity to \(cartItems[index].quantity). Price: \(product.priceFormatted ?? "")") + } else { + let newItem = ProductCartItem(product: product, quantity: quantity) + cartItems.append(newItem) + print("Added \(product.name) with quantity \(quantity). Price: \(product.priceFormatted ?? "")") + } + } + + func updateCartItem(productId: String, quantity: Int) { + if let index = cartItems.firstIndex(where: { $0.product.id == productId }) { + if quantity > 0 { + cartItems[index].quantity = quantity + print("Updated \(cartItems[index].product.name) quantity to \(quantity). Price: \(cartItems[index].product.priceFormatted ?? "")") + } else { + let removedProduct = cartItems.remove(at: index) + print("Removed \(removedProduct.product.name). Price: \(removedProduct.product.priceFormatted ?? "")") + } + } + } + + func removeFromCart(productId: String) { + if let index = cartItems.firstIndex(where: { $0.product.id == productId }) { + let removedProduct = cartItems.remove(at: index) + print("Removed \(removedProduct.product.name). Price: \(removedProduct.product.priceFormatted ?? "")") + } + } +} diff --git a/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift b/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift index ee3b63b..eb52573 100644 --- a/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift +++ b/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift @@ -2,51 +2,28 @@ import Foundation import Combine class CartViewModel: ObservableObject { - @Published var cart: [ProductCartItem] = [] + @Published var cartItems: [ProductCartItem] = [] + + private let cartRepository = CartRepository.shared + private var cancellables = Set() + + init() { + cartRepository.$cartItems + .sink { [weak self] cartItems in + self?.cartItems = cartItems + } + .store(in: &cancellables) + } func addToCart(product: RecommendedProduct, quantity: Int) { - if let index = cart.firstIndex(where: { $0.product.id == product.id }) { - cart[index].quantity += quantity - let totalPrice = calculateTotalPrice(for: product.priceFormatted ?? "", quantity: cart[index].quantity) - print("Updated \(product.name) quantity to \(cart[index].quantity). Total Price: \(totalPrice)") - } else { - let newItem = ProductCartItem(product: product, quantity: quantity) - cart.append(newItem) - let totalPrice = calculateTotalPrice(for: product.priceFormatted ?? "", quantity: quantity) - print("Added \(product.name) with quantity \(quantity). Total Price: \(totalPrice)") - } + cartRepository.addToCart(product: product, quantity: quantity) } func updateCartItem(productId: String, quantity: Int) { - if let index = cart.firstIndex(where: { $0.product.id == productId }) { - if quantity > 0 { - cart[index].quantity = quantity - let totalPrice = calculateTotalPrice(for: cart[index].product.priceFormatted ?? "", quantity: quantity) - print("Updated \(cart[index].product.name) quantity to \(quantity). Total Price: \(totalPrice)") - } else { - let removedProduct = cart.remove(at: index) - print("Removed \(removedProduct.product.name). Price: \(removedProduct.product.priceFormatted ?? "")") - } - } + cartRepository.updateCartItem(productId: productId, quantity: quantity) } func removeFromCart(productId: String) { - if let index = cart.firstIndex(where: { $0.product.id == productId }) { - let removedProduct = cart.remove(at: index) - print("Removed \(removedProduct.product.name). Price: \(removedProduct.product.priceFormatted ?? "")") - } - } - - private func calculateTotalPrice(for priceString: String, quantity: Int) -> String { - // Assuming the price string is in the format "$99.99" - let numberFormatter = NumberFormatter() - numberFormatter.numberStyle = .currency - - if let priceNumber = numberFormatter.number(from: priceString)?.doubleValue { - let totalPrice = priceNumber * Double(quantity) - return numberFormatter.string(from: NSNumber(value: totalPrice)) ?? "N/A" - } - - return "N/A" + cartRepository.removeFromCart(productId: productId) } } diff --git a/demo-store-ios/features/catalogTab/CatalogScreenView.swift b/demo-store-ios/features/catalogTab/CatalogScreenView.swift index 784be4f..253b958 100644 --- a/demo-store-ios/features/catalogTab/CatalogScreenView.swift +++ b/demo-store-ios/features/catalogTab/CatalogScreenView.swift @@ -4,7 +4,6 @@ struct CatalogScreenView: View { var product: RecommendedProduct? @ObservedObject var viewModel = MainTabViewModel() - @ObservedObject var cartViewModel = CartViewModel() @State private var selectedImageIndex = 0 @State private var counter = 1 @@ -161,7 +160,7 @@ struct CatalogScreenView: View { Button( action: { if let product = product { - cartViewModel.addToCart(product: product, quantity: counter) + viewModel.addToCart(product: product, quantity: counter) } } ) { diff --git a/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift b/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift index 727507c..82e81f3 100644 --- a/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift +++ b/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift @@ -3,6 +3,7 @@ import SwiftUI struct ProductListItemView: View { @EnvironmentObject var navigationManager: NavigationManager + var product: RecommendedProduct var containerWidth: CGFloat var containerHeight: CGFloat diff --git a/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift b/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift index 6db6736..20805d5 100644 --- a/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift +++ b/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift @@ -10,6 +10,8 @@ class MainTabViewModel: ObservableObject { @Published var topTrendProducts: [RecommendedProduct] = [] @Published var recommenderProducts: [RecommendedProduct] = [] + private let cartRepository = CartRepository.shared + let sdkManager = SDKManager.shared func getRecommendations(blockId: String, currentProductId: String, completion: @escaping ([RecommendedProduct]) -> Void) { @@ -46,4 +48,16 @@ class MainTabViewModel: ObservableObject { self.recommenderProducts = products } } + + func addToCart(product: RecommendedProduct, quantity: Int) { + cartRepository.addToCart(product: product, quantity: quantity) + } + + func updateCartItem(productId: String, quantity: Int) { + cartRepository.updateCartItem(productId: productId, quantity: quantity) + } + + func removeFromCart(productId: String) { + cartRepository.removeFromCart(productId: productId) + } } diff --git a/demo-store-ios/models/ProductCartItem.swift b/demo-store-ios/models/ProductCartItem.swift index d3e70f6..60f1324 100644 --- a/demo-store-ios/models/ProductCartItem.swift +++ b/demo-store-ios/models/ProductCartItem.swift @@ -1,7 +1,19 @@ import Foundation -struct ProductCartItem: Identifiable { - var id: String { product.id } +struct ProductCartItem: Identifiable, Hashable, Equatable { let product: RecommendedProduct var quantity: Int + + var id: String { + product.id + } + + static func == (lhs: ProductCartItem, rhs: ProductCartItem) -> Bool { + return lhs.product.id == rhs.product.id && lhs.quantity == rhs.quantity + } + + func hash(into hasher: inout Hasher) { + hasher.combine(id) + hasher.combine(quantity) + } } diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 858f820..41cb5bb 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -51,6 +51,12 @@ } } } + }, + "Cart" : { + + }, + "Cart Items:" : { + }, "cart_tab_title" : { "extractionState" : "manual", @@ -174,6 +180,9 @@ }, "No product data available" : { + }, + "Price: %@" : { + }, "process_timeout_title" : { "extractionState" : "manual", From 722ed61fe0c1c48da105bab7c677a8b3f0cd9d17 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Sat, 13 Jul 2024 20:03:45 +0200 Subject: [PATCH 35/85] feat: Add cart list items --- .../features/cartTab/CartScreenView.swift | 71 ++++++++++++++----- .../catalogTab/CatalogScreenView.swift | 33 +++++---- .../recommendation/ProductListItemView.swift | 27 +++---- demo-store-ios/utils/RemoteImageLoader.swift | 12 ++-- resources/Localizable.xcstrings | 10 +-- 5 files changed, 99 insertions(+), 54 deletions(-) diff --git a/demo-store-ios/features/cartTab/CartScreenView.swift b/demo-store-ios/features/cartTab/CartScreenView.swift index 14f1db2..340c6e8 100644 --- a/demo-store-ios/features/cartTab/CartScreenView.swift +++ b/demo-store-ios/features/cartTab/CartScreenView.swift @@ -6,26 +6,63 @@ struct CartScreenView: View { var body: some View { NavigationView { VStack { - Text("Cart Items:") - .font(.title) - .foregroundColor(.black) - .padding() - List(cartViewModel.cartItems) { cartItem in - VStack(alignment: .leading) { - Text(cartItem.product.name) - .font(.headline) - Text("Price: \(cartItem.product.priceFormatted ?? "")") - .foregroundColor(.gray) + Spacer().frame(height: 20) + + List { + ForEach(cartViewModel.cartItems) { cartItem in + VStack(spacing: 0) { + HStack(spacing: 16) { + RemoteImageView( + urlString: cartItem.product.imageUrl, + width: 64, + height: 64, + contentMode: .fit, + showBorder: false + ) + + VStack(alignment: .leading, spacing: 4) { + Text(cartItem.product.brand) + .font(.system(size: 12)) + .foregroundColor(.gray) + + Text(cartItem.product.name) + .font(.system(size: 16)) + .foregroundColor(.black) + .lineLimit(1) + .truncationMode(.tail) + } + .frame(maxWidth: .infinity, alignment: .leading) + + Text(cartItem.product.priceFormatted ?? "") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding(.trailing, 12) + + Button( + action: { + cartViewModel.removeFromCart(productId: cartItem.product.id) + } + ) { + Image(systemName: "xmark") + .foregroundColor(.white) + .frame(width: 24, height: 24) + .background(Color.gray) + .clipShape(Circle()) + } + .buttonStyle(BorderlessButtonStyle()) + } + .padding(.vertical, 8) + .background(Color.white) + + Divider() + } + .listRowInsets(EdgeInsets()) + .padding(.horizontal) } - .padding() - .background(Color.white) - .cornerRadius(8) - .shadow(radius: 2) - .padding(.horizontal) } - .listStyle(InsetListStyle()) - .navigationBarTitle("Cart") + .listStyle(PlainListStyle()) + .navigationBarTitle("cart_tab_title") } } } diff --git a/demo-store-ios/features/catalogTab/CatalogScreenView.swift b/demo-store-ios/features/catalogTab/CatalogScreenView.swift index 253b958..0bd5952 100644 --- a/demo-store-ios/features/catalogTab/CatalogScreenView.swift +++ b/demo-store-ios/features/catalogTab/CatalogScreenView.swift @@ -12,19 +12,25 @@ struct CatalogScreenView: View { NavigationView { ScrollView { VStack(alignment: .leading) { - - topSection - - productImagesSection - - productDetailsSection - - priceSection - - actionSection - + if let product = product { + topSection + + productImagesSection + + productDetailsSection + + priceSection + + actionSection + + } else { + Text("No product available") + .font(.headline) + .foregroundColor(.black) + .padding() + .frame(height:300) + } recomendSection - } .background(Color.white) } @@ -59,7 +65,8 @@ struct CatalogScreenView: View { urlString: imageUrls[index], width: 350, height: 350, - contentMode: .fit + contentMode: .fit, + showBorder: false ).tag(index) } } diff --git a/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift b/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift index 82e81f3..d887e14 100644 --- a/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift +++ b/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift @@ -3,6 +3,7 @@ import SwiftUI struct ProductListItemView: View { @EnvironmentObject var navigationManager: NavigationManager + @ObservedObject var viewModel = MainTabViewModel() var product: RecommendedProduct var containerWidth: CGFloat @@ -49,9 +50,11 @@ struct ProductListItemView: View { Spacer() if showShopButton { - Button(action: { - // TODO Действие по нажатию кнопки - }) { + Button( + action: { + viewModel.addToCart(product: product, quantity: 1) + } + ) { Text("Shop") .font(.system(size: 12)) .foregroundColor(.white) @@ -67,14 +70,14 @@ struct ProductListItemView: View { .cornerRadius(10) .frame(width: containerWidth, height: containerHeight) .onTapGesture { - navigationManager.navigateTo( - screen: AnyView( - CatalogScreenView( - product: product - ) - ), - selectedTab: .catalog - ) - } + navigationManager.navigateTo( + screen: AnyView( + CatalogScreenView( + product: product + ) + ), + selectedTab: .catalog + ) + } } } diff --git a/demo-store-ios/utils/RemoteImageLoader.swift b/demo-store-ios/utils/RemoteImageLoader.swift index e0ae157..049bcf7 100644 --- a/demo-store-ios/utils/RemoteImageLoader.swift +++ b/demo-store-ios/utils/RemoteImageLoader.swift @@ -28,19 +28,22 @@ struct RemoteImageView: View { let width: CGFloat? let height: CGFloat? let contentMode: ContentMode - + let showBorder: Bool + init( urlString: String, width: CGFloat? = nil, height: CGFloat? = nil, - contentMode: ContentMode = .fit + contentMode: ContentMode = .fit, + showBorder: Bool = true ) { self.urlString = urlString self.width = width self.height = height self.contentMode = contentMode + self.showBorder = showBorder } - + var body: some View { ZStack { if let uiImage = UIImage(data: imageLoader.imageData) { @@ -50,8 +53,9 @@ struct RemoteImageView: View { .frame(width: width, height: height) .cornerRadius(5) .overlay( + showBorder ? RoundedRectangle(cornerRadius: 10) - .stroke(Color.gray.opacity(0.5), lineWidth: 1) + .stroke(Color.gray.opacity(0.5), lineWidth: 1) : nil ) } else { Rectangle() diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 41cb5bb..d7b2e45 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -51,12 +51,6 @@ } } } - }, - "Cart" : { - - }, - "Cart Items:" : { - }, "cart_tab_title" : { "extractionState" : "manual", @@ -178,10 +172,10 @@ } } }, - "No product data available" : { + "No product available" : { }, - "Price: %@" : { + "No product data available" : { }, "process_timeout_title" : { From 2cdd20952a79d327cb7accdbccc29d0e6acb0c63 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Sat, 13 Jul 2024 22:34:45 +0200 Subject: [PATCH 36/85] feat: Add getting full price --- .../features/cartTab/CartScreenView.swift | 62 +++++++++++++++++-- resources/Localizable.xcstrings | 3 + 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/demo-store-ios/features/cartTab/CartScreenView.swift b/demo-store-ios/features/cartTab/CartScreenView.swift index 340c6e8..4a55e1b 100644 --- a/demo-store-ios/features/cartTab/CartScreenView.swift +++ b/demo-store-ios/features/cartTab/CartScreenView.swift @@ -1,12 +1,28 @@ import SwiftUI struct CartScreenView: View { + + @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var cartViewModel = CartViewModel() + var totalPrice: Int { + let total = cartViewModel.cartItems.reduce(0) { (result, cartItem) in + if let priceString = cartItem.product.priceFormatted { + let cleanedPriceString = priceString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() + + if let price = Int(cleanedPriceString) { + return result + price + } + } + return result + } + print("Computed total price:", total) + return total + } + var body: some View { NavigationView { VStack { - Spacer().frame(height: 20) List { @@ -54,15 +70,51 @@ struct CartScreenView: View { } .padding(.vertical, 8) .background(Color.white) - + Divider() - } - .listRowInsets(EdgeInsets()) - .padding(.horizontal) + } + .listRowInsets(EdgeInsets()) + .padding(.horizontal) + } + + VStack(spacing: 0) { + Spacer().frame(height: 20) + Spacer(minLength: 0) + + VStack(alignment: .trailing, spacing: 12) { + HStack { + Spacer() + Text("shipping_title") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding(.trailing, 12) + + Text("Free") + .font(.system(size: 16, weight: .bold)) + .foregroundColor(.black) + } + + HStack { + Spacer() + Text("total_title") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding(.trailing, 12) + + Text("\(totalPrice)") + .font(.system(size: 16, weight: .bold)) + .foregroundColor(.black) + } + } + .padding(.horizontal) } + .listRowInsets(EdgeInsets()) } .listStyle(PlainListStyle()) .navigationBarTitle("cart_tab_title") + .onAppear{ + navigationManager.setToolbarHidden(hidden: false) + } } } } diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index d7b2e45..c4bf07c 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -117,6 +117,9 @@ } } } + }, + "Free" : { + }, "go_home_button" : { "extractionState" : "manual", From 0f4a0ffcde900ff360b4aea6380013036b63604a Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 15 Jul 2024 17:23:30 +0200 Subject: [PATCH 37/85] feat: Add quantity and cart buttons for purchase handling --- .../features/cartTab/CartScreenView.swift | 46 ++++++++++++++++++- resources/Localizable.xcstrings | 14 ++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/demo-store-ios/features/cartTab/CartScreenView.swift b/demo-store-ios/features/cartTab/CartScreenView.swift index 4a55e1b..2684f7e 100644 --- a/demo-store-ios/features/cartTab/CartScreenView.swift +++ b/demo-store-ios/features/cartTab/CartScreenView.swift @@ -11,7 +11,7 @@ struct CartScreenView: View { let cleanedPriceString = priceString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() if let price = Int(cleanedPriceString) { - return result + price + return result + (price * cartItem.quantity) } } return result @@ -47,6 +47,10 @@ struct CartScreenView: View { .foregroundColor(.black) .lineLimit(1) .truncationMode(.tail) + + Text("quantity_title \(cartItem.quantity)") + .font(.system(size: 14)) + .foregroundColor(.black) } .frame(maxWidth: .infinity, alignment: .leading) @@ -74,6 +78,7 @@ struct CartScreenView: View { Divider() } .listRowInsets(EdgeInsets()) + .background(Color.clear) .padding(.horizontal) } @@ -109,6 +114,44 @@ struct CartScreenView: View { .padding(.horizontal) } .listRowInsets(EdgeInsets()) + + HStack(spacing: 16) { + Button( + action: { + navigationManager.navigateTo(screen: AnyView(MainScreenView()), selectedTab: .main) + } + ) { + Text("continue_button") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding() + .frame(maxWidth: .infinity) + .background(Color.white) + .cornerRadius(10) + .overlay( + RoundedRectangle(cornerRadius: 10) + .stroke(Color.black, lineWidth: 1) + ) + } + + Button( + action: { + // TODO Make purchase + } + ) { + Text("checkout_button") + .font(.system(size: 16)) + .foregroundColor(.white) + .padding() + .frame(maxWidth: .infinity) + .background(Color.black) + .cornerRadius(10) + } + } + .padding(.horizontal) + .padding(.vertical, 20) + .listRowInsets(EdgeInsets()) + .background(Color.clear) } .listStyle(PlainListStyle()) .navigationBarTitle("cart_tab_title") @@ -119,3 +162,4 @@ struct CartScreenView: View { } } } + diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index c4bf07c..f989fd7 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -202,6 +202,20 @@ } } } + }, + "quantity_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quantity:" + } + } + } + }, + "Quantity: %lld" : { + }, "rating_reviews" : { "extractionState" : "manual", From 82395f916bf2df2c9db57535e026f4b7060eb749 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 15 Jul 2024 18:22:50 +0200 Subject: [PATCH 38/85] feat: Add recommendation and empty states screen --- demo-store-ios.xcodeproj/project.pbxproj | 14 +- .../features/cartTab/CartScreenView.swift | 351 +++++++++++------- .../cartTab/viewModel/CartViewModel.swift | 11 + .../controller/StoriesViewController.swift | 4 +- .../mainTab/viewModel/MainTabViewModel.swift | 33 +- .../useCases/GetRecommendationsUseCase.swift | 25 ++ resources/Localizable.xcstrings | 4 +- 7 files changed, 277 insertions(+), 165 deletions(-) create mode 100644 demo-store-ios/useCases/GetRecommendationsUseCase.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 4f462e3..b61ae18 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */; }; 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */; }; 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */; }; + 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; @@ -74,6 +75,7 @@ 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCartItem.swift; sourceTree = ""; }; 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepository.swift; sourceTree = ""; }; + 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetRecommendationsUseCase.swift; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; @@ -165,6 +167,14 @@ path = repository; sourceTree = ""; }; + 752F1D412C457790002D4AC3 /* useCases */ = { + isa = PBXGroup; + children = ( + 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */, + ); + path = useCases; + sourceTree = ""; + }; 7559449C2C357E1800C274C9 /* features */ = { isa = PBXGroup; children = ( @@ -304,6 +314,7 @@ 75B935552C3564360063E814 /* demo-store-ios */ = { isa = PBXGroup; children = ( + 752F1D412C457790002D4AC3 /* useCases */, 75674CFF2C3DA0EC007FAB88 /* utils */, 75674CFA2C3D9957007FAB88 /* mappers */, 75674CF32C3D92B0007FAB88 /* models */, @@ -357,8 +368,8 @@ 75ECCD0D2C36BE0600D6D346 /* cartTab */ = { isa = PBXGroup; children = ( - 752F1D3E2C41E5AC002D4AC3 /* repository */, 752F1D3D2C41E1C6002D4AC3 /* viewModel */, + 752F1D3E2C41E5AC002D4AC3 /* repository */, 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, ); path = cartTab; @@ -663,6 +674,7 @@ files = ( 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.swift in Sources */, 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */, + 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */, 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */, 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, diff --git a/demo-store-ios/features/cartTab/CartScreenView.swift b/demo-store-ios/features/cartTab/CartScreenView.swift index 2684f7e..0f5842d 100644 --- a/demo-store-ios/features/cartTab/CartScreenView.swift +++ b/demo-store-ios/features/cartTab/CartScreenView.swift @@ -7,159 +7,240 @@ struct CartScreenView: View { var totalPrice: Int { let total = cartViewModel.cartItems.reduce(0) { (result, cartItem) in - if let priceString = cartItem.product.priceFormatted { - let cleanedPriceString = priceString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() - - if let price = Int(cleanedPriceString) { - return result + (price * cartItem.quantity) - } + if let priceString = cartItem.product.priceFormatted, + let price = Int(priceString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) { + return result + (price * cartItem.quantity) } return result } - print("Computed total price:", total) return total } var body: some View { NavigationView { - VStack { - Spacer().frame(height: 20) - - List { - ForEach(cartViewModel.cartItems) { cartItem in - VStack(spacing: 0) { - HStack(spacing: 16) { - RemoteImageView( - urlString: cartItem.product.imageUrl, - width: 64, - height: 64, - contentMode: .fit, - showBorder: false - ) - - VStack(alignment: .leading, spacing: 4) { - Text(cartItem.product.brand) - .font(.system(size: 12)) - .foregroundColor(.gray) - - Text(cartItem.product.name) - .font(.system(size: 16)) - .foregroundColor(.black) - .lineLimit(1) - .truncationMode(.tail) - - Text("quantity_title \(cartItem.quantity)") - .font(.system(size: 14)) - .foregroundColor(.black) - } - .frame(maxWidth: .infinity, alignment: .leading) - - Text(cartItem.product.priceFormatted ?? "") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding(.trailing, 12) - - Button( - action: { - cartViewModel.removeFromCart(productId: cartItem.product.id) - } - ) { - Image(systemName: "xmark") - .foregroundColor(.white) - .frame(width: 24, height: 24) - .background(Color.gray) - .clipShape(Circle()) - } - .buttonStyle(BorderlessButtonStyle()) - } - .padding(.vertical, 8) - .background(Color.white) - - Divider() - } - .listRowInsets(EdgeInsets()) - .background(Color.clear) - .padding(.horizontal) - } + ScrollView { + VStack(spacing: 0) { + Spacer().frame(height: 20) - VStack(spacing: 0) { - Spacer().frame(height: 20) - Spacer(minLength: 0) - - VStack(alignment: .trailing, spacing: 12) { - HStack { - Spacer() - Text("shipping_title") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding(.trailing, 12) - - Text("Free") - .font(.system(size: 16, weight: .bold)) - .foregroundColor(.black) - } - - HStack { - Spacer() - Text("total_title") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding(.trailing, 12) - - Text("\(totalPrice)") - .font(.system(size: 16, weight: .bold)) - .foregroundColor(.black) + if cartViewModel.cartItems.isEmpty { + EmptyCartView() + .frame(height: 250) + } else { + CartListView( + cartItems: cartViewModel.cartItems, + removeFromCart: { productId in + cartViewModel.removeFromCart(productId: productId) } - } - .padding(.horizontal) - } - .listRowInsets(EdgeInsets()) - - HStack(spacing: 16) { - Button( - action: { - navigationManager.navigateTo(screen: AnyView(MainScreenView()), selectedTab: .main) - } - ) { - Text("continue_button") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding() - .frame(maxWidth: .infinity) - .background(Color.white) - .cornerRadius(10) - .overlay( - RoundedRectangle(cornerRadius: 10) - .stroke(Color.black, lineWidth: 1) - ) - } + ).frame(height: 250) - Button( - action: { - // TODO Make purchase - } - ) { - Text("checkout_button") - .font(.system(size: 16)) - .foregroundColor(.white) - .padding() - .frame(maxWidth: .infinity) - .background(Color.black) - .cornerRadius(10) - } + TotalPriceSection(totalPrice: totalPrice) + + NavigationButtonsView( + navigationManager: navigationManager, + cartViewModel: cartViewModel + ) } - .padding(.horizontal) - .padding(.vertical, 20) - .listRowInsets(EdgeInsets()) - .background(Color.clear) + + RecommendationSection(recommendedProducts: cartViewModel.recommenderProducts) } - .listStyle(PlainListStyle()) .navigationBarTitle("cart_tab_title") - .onAppear{ + .onAppear { navigationManager.setToolbarHidden(hidden: false) + cartViewModel.loadRecommenderRecommendations(currentProductId: "665") + } + } + } + } +} + +struct EmptyCartView: View { + var body: some View { + VStack { + Spacer() + Text("empty_cart_title") + .font(.system(size: 18, weight: .bold)) + .foregroundColor(.gray) + Spacer() + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } +} + +struct CartListView: View { + var cartItems: [ProductCartItem] + var removeFromCart: (String) -> Void + + var body: some View { + List { + ForEach(cartItems) { cartItem in + CartItemView( + cartItem: cartItem, + removeFromCart: { + removeFromCart(cartItem.product.id) + } + ) + } + } + .listStyle(PlainListStyle()) + } +} + +struct CartItemView: View { + var cartItem: ProductCartItem + var removeFromCart: () -> Void + + var body: some View { + VStack(spacing: 0) { + HStack(spacing: 16) { + RemoteImageView( + urlString: cartItem.product.imageUrl, + width: 64, + height: 64, + contentMode: .fit, + showBorder: false + ) + + VStack(alignment: .leading, spacing: 4) { + Text(cartItem.product.brand) + .font(.system(size: 12)) + .foregroundColor(.gray) + + Text(cartItem.product.name) + .font(.system(size: 16)) + .foregroundColor(.black) + .lineLimit(1) + .truncationMode(.tail) + + Text("quantity_title \(cartItem.quantity)") + .font(.system(size: 14)) + .foregroundColor(.black) } + .frame(maxWidth: .infinity, alignment: .leading) + + Text(cartItem.product.priceFormatted ?? "") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding(.trailing, 12) + + Button( + action: { + removeFromCart() + } + ) { + Image(systemName: "xmark") + .foregroundColor(.white) + .frame(width: 24, height: 24) + .background(Color.gray) + .clipShape(Circle()) + } + .buttonStyle(BorderlessButtonStyle()) + } + .padding(.vertical, 8) + .background(Color.white) + + Divider() + } + .listRowInsets(EdgeInsets()) + .background(Color.clear) + .padding(.horizontal) + } +} + +struct RecommendationSection: View { + var recommendedProducts: [RecommendedProduct] + + var body: some View { + VStack { + Spacer().frame(height: 36) + + ShortRecommendationListView( + recommendedProducts: recommendedProducts, + title: NSLocalizedString("recommend_like_title", comment: "") + ) + + Spacer().frame(height: 36) + } + .background(Color.white) + .listRowInsets(EdgeInsets()) + } +} + +struct TotalPriceSection: View { + var totalPrice: Int + + var body: some View { + VStack(alignment: .trailing, spacing: 12) { + Spacer().frame(height: 10) + + HStack { + Spacer() + Text("shipping_title") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding(.trailing, 12) + + Text("Free") + .font(.system(size: 16, weight: .bold)) + .foregroundColor(.black) + } + + HStack { + Spacer() + Text("total_title") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding(.trailing, 12) + + Text("\(totalPrice)") + .font(.system(size: 16, weight: .bold)) + .foregroundColor(.black) } } + .padding(.horizontal) } } +struct NavigationButtonsView: View { + @ObservedObject var navigationManager: NavigationManager + @ObservedObject var cartViewModel:CartViewModel + + var body: some View { + VStack{ + HStack(spacing: 16) { + Button( + action: { + navigationManager.navigateTo(screen: AnyView(MainScreenView()), selectedTab: .main) + } + ) { + Text("continue_button") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding() + .frame(maxWidth: .infinity) + .background(Color.white) + .cornerRadius(10) + .overlay( + RoundedRectangle(cornerRadius: 10) + .stroke(Color.black, lineWidth: 1) + ) + } + + Button( + action: { + // TODO Make purchase + } + ) { + Text("checkout_button") + .font(.system(size: 16)) + .foregroundColor(.white) + .padding() + .frame(maxWidth: .infinity) + .background(Color.black) + .cornerRadius(10) + } + } + .padding(.horizontal) + .padding(.vertical, 20) + } + } +} diff --git a/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift b/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift index eb52573..20fad03 100644 --- a/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift +++ b/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift @@ -2,11 +2,16 @@ import Foundation import Combine class CartViewModel: ObservableObject { + @Published var cartItems: [ProductCartItem] = [] + @Published var recommenderProducts: [RecommendedProduct] = [] + private let getRecommendationsUseCase = GetRecommendationsUseCase() private let cartRepository = CartRepository.shared private var cancellables = Set() + private let blockId = "977cb67194a72fdc7b424f49d69a862d" + init() { cartRepository.$cartItems .sink { [weak self] cartItems in @@ -26,4 +31,10 @@ class CartViewModel: ObservableObject { func removeFromCart(productId: String) { cartRepository.removeFromCart(productId: productId) } + + func loadRecommenderRecommendations(currentProductId: String) { + getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in + self.recommenderProducts = products + } + } } diff --git a/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift b/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift index 3de6e1c..0cb53fa 100644 --- a/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift +++ b/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift @@ -35,7 +35,7 @@ class StoriesViewController: UIViewController { struct StoriesViewControllerRepresentable: UIViewControllerRepresentable { - @EnvironmentObject var sdkViewModel: MainTabViewModel + @EnvironmentObject var viewModel: MainTabViewModel func makeUIViewController(context: Context) -> StoriesViewController { let viewController = StoriesViewController() @@ -43,7 +43,7 @@ struct StoriesViewControllerRepresentable: UIViewControllerRepresentable { } func updateUIViewController(_ uiViewController: StoriesViewController, context: Context) { - if let sdk = sdkViewModel.sdkManager.sdk { + if let sdk = viewModel.sdkManager.sdk { uiViewController.configure(with: sdk) } else { print("StoriesViewControllerRepresentable: SDK not found") diff --git a/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift b/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift index 20805d5..b86aa7d 100644 --- a/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift +++ b/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift @@ -10,41 +10,24 @@ class MainTabViewModel: ObservableObject { @Published var topTrendProducts: [RecommendedProduct] = [] @Published var recommenderProducts: [RecommendedProduct] = [] - private let cartRepository = CartRepository.shared - let sdkManager = SDKManager.shared + private let cartRepository = CartRepository.shared + private let getRecommendationsUseCase = GetRecommendationsUseCase() - func getRecommendations(blockId: String, currentProductId: String, completion: @escaping ([RecommendedProduct]) -> Void) { - sdkManager.sdk?.recommend( - blockId: blockId, - currentProductId: currentProductId - ) { response in - switch response { - case .success(let recommendResponse): - let products = RecommendedProductMapper.mapResponseToProducts(response: recommendResponse) - DispatchQueue.main.async { - completion(products) - } - case .failure(let error): - print("Error:", error.localizedDescription) - } - } - } - - func loadArrivalsRecommendations( currentProductId: String) { - getRecommendations(blockId: blockId, currentProductId: currentProductId) { products in + func loadArrivalsRecommendations(currentProductId: String) { + getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in self.arrivalsProducts = products } } - func loadTopTrendRecommendations( currentProductId: String) { - getRecommendations(blockId: blockId, currentProductId: currentProductId) { products in + func loadTopTrendRecommendations(currentProductId: String) { + getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in self.topTrendProducts = products } } - func loadRecommenderRecommendations( currentProductId: String) { - getRecommendations(blockId: blockId, currentProductId: currentProductId) { products in + func loadRecommenderRecommendations(currentProductId: String) { + getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in self.recommenderProducts = products } } diff --git a/demo-store-ios/useCases/GetRecommendationsUseCase.swift b/demo-store-ios/useCases/GetRecommendationsUseCase.swift new file mode 100644 index 0000000..28f2637 --- /dev/null +++ b/demo-store-ios/useCases/GetRecommendationsUseCase.swift @@ -0,0 +1,25 @@ +import Foundation +import Combine +import REES46 + +class GetRecommendationsUseCase { + + private let sdkManager = SDKManager.shared + + func execute(blockId: String, currentProductId: String, completion: @escaping ([RecommendedProduct]) -> Void) { + sdkManager.sdk?.recommend( + blockId: blockId, + currentProductId: currentProductId + ) { response in + switch response { + case .success(let recommendResponse): + let products = RecommendedProductMapper.mapResponseToProducts(response: recommendResponse) + DispatchQueue.main.async { + completion(products) + } + case .failure(let error): + print("Error:", error.localizedDescription) + } + } + } +} diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index f989fd7..ce443f4 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -214,7 +214,7 @@ } } }, - "Quantity: %lld" : { + "quantity_title %lld" : { }, "rating_reviews" : { @@ -361,7 +361,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Total" + "value" : "Total:" } } } From e2ce8ae162c19d744aa815bd9634e33817530d38 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 15 Jul 2024 18:51:18 +0200 Subject: [PATCH 39/85] feat: Add loading --- .../features/cartTab/CartScreenView.swift | 17 ++++- .../cartTab/viewModel/CartViewModel.swift | 2 + .../features/mainTab/MainScreenView.swift | 64 +++++++++++-------- .../mainTab/viewModel/MainTabViewModel.swift | 7 +- .../settingsTab/SettingsScreenView.swift | 56 ++++++++++------ resources/Localizable.xcstrings | 3 + 6 files changed, 98 insertions(+), 51 deletions(-) diff --git a/demo-store-ios/features/cartTab/CartScreenView.swift b/demo-store-ios/features/cartTab/CartScreenView.swift index 0f5842d..c66597b 100644 --- a/demo-store-ios/features/cartTab/CartScreenView.swift +++ b/demo-store-ios/features/cartTab/CartScreenView.swift @@ -5,6 +5,8 @@ struct CartScreenView: View { @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var cartViewModel = CartViewModel() + @State private var isLoading = true + var totalPrice: Int { let total = cartViewModel.cartItems.reduce(0) { (result, cartItem) in if let priceString = cartItem.product.priceFormatted, @@ -22,7 +24,16 @@ struct CartScreenView: View { VStack(spacing: 0) { Spacer().frame(height: 20) - if cartViewModel.cartItems.isEmpty { + if isLoading { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .onAppear { + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + isLoading = false + } + } + .frame(height: 250) + } else if cartViewModel.cartItems.isEmpty { EmptyCartView() .frame(height: 250) } else { @@ -41,7 +52,9 @@ struct CartScreenView: View { ) } - RecommendationSection(recommendedProducts: cartViewModel.recommenderProducts) + if !isLoading{ + RecommendationSection(recommendedProducts: cartViewModel.recommenderProducts) + } } .navigationBarTitle("cart_tab_title") .onAppear { diff --git a/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift b/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift index 20fad03..13f854d 100644 --- a/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift +++ b/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift @@ -5,6 +5,7 @@ class CartViewModel: ObservableObject { @Published var cartItems: [ProductCartItem] = [] @Published var recommenderProducts: [RecommendedProduct] = [] + @Published var isLoading: Bool = true private let getRecommendationsUseCase = GetRecommendationsUseCase() private let cartRepository = CartRepository.shared @@ -16,6 +17,7 @@ class CartViewModel: ObservableObject { cartRepository.$cartItems .sink { [weak self] cartItems in self?.cartItems = cartItems + self?.isLoading = false } .store(in: &cancellables) } diff --git a/demo-store-ios/features/mainTab/MainScreenView.swift b/demo-store-ios/features/mainTab/MainScreenView.swift index 731bf91..cdc9ed9 100644 --- a/demo-store-ios/features/mainTab/MainScreenView.swift +++ b/demo-store-ios/features/mainTab/MainScreenView.swift @@ -1,42 +1,52 @@ import SwiftUI -import REES46 struct MainScreenView: View { @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var viewModel = MainTabViewModel() - private let blockId = "977cb67194a72fdc7b424f49d69a862d" + @State private var isLoading = true var body: some View { NavigationView { ScrollView { VStack(spacing: 16) { - MainDiscoverView() - - MainStoriesContainerView() - - ShortRecommendationListView( - recommendedProducts: viewModel.arrivalsProducts, - title: NSLocalizedString("arrivals_title", comment: "") - ) - .onAppear { - viewModel.loadArrivalsRecommendations( currentProductId: "670") + if isLoading { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .onAppear { + // Simulate loading delay + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + isLoading = false + } + } + .frame(height: 250) + } else { + MainDiscoverView() + + MainStoriesContainerView() + + ShortRecommendationListView( + recommendedProducts: viewModel.arrivalsProducts, + title: NSLocalizedString("arrivals_title", comment: "") + ) + .onAppear { + viewModel.loadArrivalsRecommendations(currentProductId: "670") + } + + ShortRecommendationListView( + recommendedProducts: viewModel.topTrendProducts, + title: NSLocalizedString("top_trend_title", comment: "") + ).onAppear { + viewModel.loadTopTrendRecommendations(currentProductId: "656") + } + + ShortRecommendationListView( + recommendedProducts: viewModel.recommenderProducts, + title: NSLocalizedString("reccomender_title", comment: "") + ).onAppear { + viewModel.loadRecommenderRecommendations(currentProductId: "651") + } } - - ShortRecommendationListView( - recommendedProducts: viewModel.topTrendProducts, - title: NSLocalizedString("top_trend_title", comment: "") - ).onAppear { - viewModel.loadTopTrendRecommendations(currentProductId: "656") - } - - ShortRecommendationListView( - recommendedProducts: viewModel.recommenderProducts, - title: NSLocalizedString("reccomender_title", comment: "") - ).onAppear { - viewModel.loadRecommenderRecommendations(currentProductId: "651") - } - } .padding(.vertical, 16) .frame(maxWidth: .infinity, alignment: .top) diff --git a/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift b/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift index b86aa7d..0c57491 100644 --- a/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift +++ b/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift @@ -9,26 +9,31 @@ class MainTabViewModel: ObservableObject { @Published var arrivalsProducts: [RecommendedProduct] = [] @Published var topTrendProducts: [RecommendedProduct] = [] @Published var recommenderProducts: [RecommendedProduct] = [] - let sdkManager = SDKManager.shared + + @Published var isLoading = true + private let cartRepository = CartRepository.shared private let getRecommendationsUseCase = GetRecommendationsUseCase() func loadArrivalsRecommendations(currentProductId: String) { getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in self.arrivalsProducts = products + self.isLoading = false } } func loadTopTrendRecommendations(currentProductId: String) { getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in self.topTrendProducts = products + self.isLoading = false } } func loadRecommenderRecommendations(currentProductId: String) { getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in self.recommenderProducts = products + self.isLoading = false } } diff --git a/demo-store-ios/features/settingsTab/SettingsScreenView.swift b/demo-store-ios/features/settingsTab/SettingsScreenView.swift index ff4ab7e..0ce8731 100644 --- a/demo-store-ios/features/settingsTab/SettingsScreenView.swift +++ b/demo-store-ios/features/settingsTab/SettingsScreenView.swift @@ -16,26 +16,22 @@ struct SettingsScreenView: View { var body: some View { NavigationView { VStack { - SettingsInputCodeView(storeKey: $storeKey) -// switch viewState { -// case .loading: -// ProgressView() -// .progressViewStyle(CircularProgressViewStyle()) -// .onAppear { -// // Start a timer to simulate loading -// DispatchQueue.main.asyncAfter(deadline: .now() + 3) { -// loadData() -// } -// } -// -// case .error: -// SettingsErrroScreenView() { -// navigationManager.navigateTo(screen: AnyView(MainScreenView())) -// } -// -// case .data: -// SettingsInputCodeView(storeKey: $storeKey) -// } + switch viewState { + case .loading: + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .onAppear { + loadData() + } + + case .error(let errorMessage): + SettingsErrorScreenView(errorMessage: errorMessage) { + navigationManager.navigateTo(screen: AnyView(MainScreenView())) + } + + case .data: + SettingsInputCodeView(storeKey: $storeKey) + } } .padding() .navigationTitle("settings_tab_title") @@ -46,7 +42,7 @@ struct SettingsScreenView: View { private func loadData() { // Simulate data loading DispatchQueue.main.asyncAfter(deadline: .now() + 2) { - let success = Bool.random() + let success = true // Replace with actual condition to check data loading success if success { viewState = .data } else { @@ -56,6 +52,24 @@ struct SettingsScreenView: View { } } +struct SettingsErrorScreenView: View { + let errorMessage: String + let retryAction: () -> Void + + var body: some View { + VStack { + Text(errorMessage) + .foregroundColor(.red) + .padding() + + Button("Retry") { + retryAction() + } + .padding() + } + } +} + struct SettingsScreenView_Previews: PreviewProvider { static var previews: some View { SettingsScreenView() diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index ce443f4..5d46f6c 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -249,6 +249,9 @@ } } } + }, + "Retry" : { + }, "settings_sub_title" : { "extractionState" : "manual", From 9335cab32d2fd8da1e759924bc9e7dcb3574d30c Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 15 Jul 2024 18:59:30 +0200 Subject: [PATCH 40/85] fix: Reformat code and change cart string key --- .../features/cartTab/CartScreenView.swift | 2 +- .../catalogTab/CatalogScreenView.swift | 47 ++++++++++++------- .../FullRecommendationListView.swift | 2 +- resources/Localizable.xcstrings | 5 +- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/demo-store-ios/features/cartTab/CartScreenView.swift b/demo-store-ios/features/cartTab/CartScreenView.swift index c66597b..8d6e632 100644 --- a/demo-store-ios/features/cartTab/CartScreenView.swift +++ b/demo-store-ios/features/cartTab/CartScreenView.swift @@ -124,7 +124,7 @@ struct CartItemView: View { .lineLimit(1) .truncationMode(.tail) - Text("quantity_title \(cartItem.quantity)") + Text(String(format: NSLocalizedString("quantity_title", comment: ""), "\(cartItem.quantity)")) .font(.system(size: 14)) .foregroundColor(.black) } diff --git a/demo-store-ios/features/catalogTab/CatalogScreenView.swift b/demo-store-ios/features/catalogTab/CatalogScreenView.swift index 0bd5952..c661287 100644 --- a/demo-store-ios/features/catalogTab/CatalogScreenView.swift +++ b/demo-store-ios/features/catalogTab/CatalogScreenView.swift @@ -6,31 +6,44 @@ struct CatalogScreenView: View { @ObservedObject var viewModel = MainTabViewModel() @State private var selectedImageIndex = 0 + @State private var isLoading = true @State private var counter = 1 var body: some View { NavigationView { ScrollView { VStack(alignment: .leading) { - if let product = product { - topSection - - productImagesSection - - productDetailsSection - - priceSection - - actionSection - + if isLoading { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .onAppear { + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + isLoading = false + } + } + .frame(height: 250) } else { - Text("No product available") - .font(.headline) - .foregroundColor(.black) - .padding() - .frame(height:300) + + if let product = product { + topSection + + productImagesSection + + productDetailsSection + + priceSection + + actionSection + + } else { + Text("No product available") + .font(.headline) + .foregroundColor(.black) + .padding() + .frame(height:300) + } + recomendSection } - recomendSection } .background(Color.white) } diff --git a/demo-store-ios/features/mainTab/recommendation/FullRecommendationListView.swift b/demo-store-ios/features/mainTab/recommendation/FullRecommendationListView.swift index 040fc37..93348b4 100644 --- a/demo-store-ios/features/mainTab/recommendation/FullRecommendationListView.swift +++ b/demo-store-ios/features/mainTab/recommendation/FullRecommendationListView.swift @@ -8,8 +8,8 @@ struct FullRecommendationListView: View { var title: String var body: some View { VStack(alignment: .leading) { - DetailsToolbarView() + DetailsToolbarView() ScrollView { Spacer().frame(height: 20) diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 5d46f6c..05f77ca 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -209,13 +209,10 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Quantity:" + "value" : "Quantity: %@" } } } - }, - "quantity_title %lld" : { - }, "rating_reviews" : { "extractionState" : "manual", From a89cced6fe3906132419e18100bcf6c64d1a706c Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 13:39:20 +0200 Subject: [PATCH 41/85] refactor: Rename home tab and add search view and search view model --- demo-store-ios.xcodeproj/project.pbxproj | 72 ++++++++++++------- demo-store-ios/DemoStoreApp.swift | 2 +- demo-store-ios/di/SdkManager.swift | 2 + .../{cartTab => cart}/CartScreenView.swift | 2 +- .../repository/CartRepository.swift | 0 .../viewModel/CartViewModel.swift | 0 .../CatalogScreenView.swift | 2 +- .../HomeScreenView.swift} | 10 +-- .../discover/MainDiscoverView.swift | 0 .../FullRecommendationListView.swift | 0 .../recommendation/ProductListItemView.swift | 2 +- .../ShortRecommendationListView.swift | 0 .../stories/HomeStoriesContainerView.swift} | 8 +-- .../controller/StoriesViewController.swift | 4 +- .../viewModel/HomeViewModel.swift} | 2 +- .../features/search/SearchScreenView.swift | 15 ++++ .../SearchViewModel/SearchViewModel.swift | 9 +++ .../SettingsErrroScreenView.swift | 0 .../SettingsInputCodeView.swift | 0 .../SettingsScreenView.swift | 2 +- demo-store-ios/navigation/BottomBarView.swift | 66 ++++++++--------- .../navigation/NavigationManager.swift | 9 ++- 22 files changed, 132 insertions(+), 75 deletions(-) rename demo-store-ios/features/{cartTab => cart}/CartScreenView.swift (99%) rename demo-store-ios/features/{cartTab => cart}/repository/CartRepository.swift (100%) rename demo-store-ios/features/{cartTab => cart}/viewModel/CartViewModel.swift (100%) rename demo-store-ios/features/{catalogTab => catalog}/CatalogScreenView.swift (99%) rename demo-store-ios/features/{mainTab/MainScreenView.swift => home/HomeScreenView.swift} (92%) rename demo-store-ios/features/{mainTab => home}/discover/MainDiscoverView.swift (100%) rename demo-store-ios/features/{mainTab => home}/recommendation/FullRecommendationListView.swift (100%) rename demo-store-ios/features/{mainTab => home}/recommendation/ProductListItemView.swift (97%) rename demo-store-ios/features/{mainTab => home}/recommendation/ShortRecommendationListView.swift (100%) rename demo-store-ios/features/{mainTab/stories/MainStoriesContainerView.swift => home/stories/HomeStoriesContainerView.swift} (71%) rename demo-store-ios/features/{mainTab => home}/stories/controller/StoriesViewController.swift (92%) rename demo-store-ios/features/{mainTab/viewModel/MainTabViewModel.swift => home/viewModel/HomeViewModel.swift} (97%) create mode 100644 demo-store-ios/features/search/SearchScreenView.swift create mode 100644 demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift rename demo-store-ios/features/{settingsTab => settings}/SettingsErrroScreenView.swift (100%) rename demo-store-ios/features/{settingsTab => settings}/SettingsInputCodeView.swift (100%) rename demo-store-ios/features/{settingsTab => settings}/SettingsScreenView.swift (98%) diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index b61ae18..cb71bdb 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -14,12 +14,14 @@ 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */; }; 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */; }; 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */; }; + 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */; }; + 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.swift */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; - 75674CDE2C3C4292007FAB88 /* MainStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */; }; + 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */; }; 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE52C3D295F007FAB88 /* SdkManager.swift */; }; - 75674CE82C3D299A007FAB88 /* MainTabViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* MainTabViewModel.swift */; }; + 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */; }; 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; 75674CF52C3D92CC007FAB88 /* Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Category.swift */; }; @@ -43,7 +45,7 @@ 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */; }; 75E1C8ED2C3EACDA005018B4 /* DetailsToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */; }; 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */; }; - 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */; }; + 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */; }; 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */; }; @@ -76,12 +78,14 @@ 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepository.swift; sourceTree = ""; }; 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetRecommendationsUseCase.swift; sourceTree = ""; }; + 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; + 752F1D482C459680002D4AC3 /* SearchScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.swift; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; - 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainStoriesContainerView.swift; sourceTree = ""; }; + 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStoriesContainerView.swift; sourceTree = ""; }; 75674CE52C3D295F007FAB88 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; - 75674CE72C3D299A007FAB88 /* MainTabViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabViewModel.swift; sourceTree = ""; }; + 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; 75674CF42C3D92CC007FAB88 /* Category.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Category.swift; sourceTree = ""; }; @@ -109,7 +113,7 @@ 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.swift; sourceTree = ""; }; 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbar.swift; sourceTree = ""; }; 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.swift; sourceTree = ""; }; - 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainScreenView.swift; sourceTree = ""; }; + 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CatalogScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenView.swift; sourceTree = ""; }; @@ -175,13 +179,31 @@ path = useCases; sourceTree = ""; }; + 752F1D442C45952C002D4AC3 /* search */ = { + isa = PBXGroup; + children = ( + 752F1D452C459539002D4AC3 /* SearchViewModel */, + 752F1D482C459680002D4AC3 /* SearchScreenView.swift */, + ); + path = search; + sourceTree = ""; + }; + 752F1D452C459539002D4AC3 /* SearchViewModel */ = { + isa = PBXGroup; + children = ( + 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */, + ); + path = SearchViewModel; + sourceTree = ""; + }; 7559449C2C357E1800C274C9 /* features */ = { isa = PBXGroup; children = ( - 75ECCD0E2C36BE1000D6D346 /* settingsTab */, - 75ECCD0D2C36BE0600D6D346 /* cartTab */, - 75ECCD0C2C36BDFF00D6D346 /* catalogTab */, - 755944A22C35858C00C274C9 /* mainTab */, + 752F1D442C45952C002D4AC3 /* search */, + 75ECCD0E2C36BE1000D6D346 /* settings */, + 75ECCD0D2C36BE0600D6D346 /* cart */, + 75ECCD0C2C36BDFF00D6D346 /* catalog */, + 755944A22C35858C00C274C9 /* home */, 7559449D2C357E4300C274C9 /* splash */, ); path = features; @@ -196,16 +218,16 @@ path = splash; sourceTree = ""; }; - 755944A22C35858C00C274C9 /* mainTab */ = { + 755944A22C35858C00C274C9 /* home */ = { isa = PBXGroup; children = ( 75674CE92C3D29BF007FAB88 /* viewModel */, 75674CF02C3D787A007FAB88 /* recommendation */, 75674CEC2C3D2E45007FAB88 /* discover */, 75674CEA2C3D2E32007FAB88 /* stories */, - 75ECCD0A2C36BDF500D6D346 /* MainScreenView.swift */, + 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */, ); - path = mainTab; + path = home; sourceTree = ""; }; 755944A32C35883F00C274C9 /* mainSubView */ = { @@ -221,7 +243,7 @@ 75674CE92C3D29BF007FAB88 /* viewModel */ = { isa = PBXGroup; children = ( - 75674CE72C3D299A007FAB88 /* MainTabViewModel.swift */, + 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */, ); path = viewModel; sourceTree = ""; @@ -230,7 +252,7 @@ isa = PBXGroup; children = ( 75674CED2C3D39E8007FAB88 /* controller */, - 75674CDD2C3C4292007FAB88 /* MainStoriesContainerView.swift */, + 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */, ); path = stories; sourceTree = ""; @@ -357,32 +379,32 @@ path = "demo-store-iosUITests"; sourceTree = ""; }; - 75ECCD0C2C36BDFF00D6D346 /* catalogTab */ = { + 75ECCD0C2C36BDFF00D6D346 /* catalog */ = { isa = PBXGroup; children = ( 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */, ); - path = catalogTab; + path = catalog; sourceTree = ""; }; - 75ECCD0D2C36BE0600D6D346 /* cartTab */ = { + 75ECCD0D2C36BE0600D6D346 /* cart */ = { isa = PBXGroup; children = ( 752F1D3D2C41E1C6002D4AC3 /* viewModel */, 752F1D3E2C41E5AC002D4AC3 /* repository */, 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, ); - path = cartTab; + path = cart; sourceTree = ""; }; - 75ECCD0E2C36BE1000D6D346 /* settingsTab */ = { + 75ECCD0E2C36BE1000D6D346 /* settings */ = { isa = PBXGroup; children = ( 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */, 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */, 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */, ); - path = settingsTab; + path = settings; sourceTree = ""; }; 75ECCD152C36D6B400D6D346 /* resources */ = { @@ -684,17 +706,19 @@ 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, - 75674CDE2C3C4292007FAB88 /* MainStoriesContainerView.swift in Sources */, - 75ECCD0B2C36BDF500D6D346 /* MainScreenView.swift in Sources */, + 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */, + 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */, + 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */, 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */, 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */, 75B935592C3564360063E814 /* ContentView.swift in Sources */, + 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */, 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, 75E1C8ED2C3EACDA005018B4 /* DetailsToolbar.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */, - 75674CE82C3D299A007FAB88 /* MainTabViewModel.swift in Sources */, + 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */, 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, diff --git a/demo-store-ios/DemoStoreApp.swift b/demo-store-ios/DemoStoreApp.swift index 2560c7d..c7dbc0a 100644 --- a/demo-store-ios/DemoStoreApp.swift +++ b/demo-store-ios/DemoStoreApp.swift @@ -3,7 +3,7 @@ import SwiftUI @main struct DemoStoreApp: App { - @StateObject private var sdkViewModel = MainTabViewModel() + @StateObject private var sdkViewModel = HomeViewModel() @State private var showSplash = true diff --git a/demo-store-ios/di/SdkManager.swift b/demo-store-ios/di/SdkManager.swift index 3cc39d9..76202d9 100644 --- a/demo-store-ios/di/SdkManager.swift +++ b/demo-store-ios/di/SdkManager.swift @@ -35,10 +35,12 @@ class SDKManager { print("SDK Initialization succeeded") if let sessionId = self.sdk?.getSession() { print("SDK Session ID: \(sessionId)") +// self.suggestProducts() } else { print("Failed to retrieve SDK session ID") } } } } + } diff --git a/demo-store-ios/features/cartTab/CartScreenView.swift b/demo-store-ios/features/cart/CartScreenView.swift similarity index 99% rename from demo-store-ios/features/cartTab/CartScreenView.swift rename to demo-store-ios/features/cart/CartScreenView.swift index 8d6e632..53a7a4d 100644 --- a/demo-store-ios/features/cartTab/CartScreenView.swift +++ b/demo-store-ios/features/cart/CartScreenView.swift @@ -222,7 +222,7 @@ struct NavigationButtonsView: View { HStack(spacing: 16) { Button( action: { - navigationManager.navigateTo(screen: AnyView(MainScreenView()), selectedTab: .main) + navigationManager.navigateTo(screen: AnyView(HomeScreenView()), selectedTab: .main) } ) { Text("continue_button") diff --git a/demo-store-ios/features/cartTab/repository/CartRepository.swift b/demo-store-ios/features/cart/repository/CartRepository.swift similarity index 100% rename from demo-store-ios/features/cartTab/repository/CartRepository.swift rename to demo-store-ios/features/cart/repository/CartRepository.swift diff --git a/demo-store-ios/features/cartTab/viewModel/CartViewModel.swift b/demo-store-ios/features/cart/viewModel/CartViewModel.swift similarity index 100% rename from demo-store-ios/features/cartTab/viewModel/CartViewModel.swift rename to demo-store-ios/features/cart/viewModel/CartViewModel.swift diff --git a/demo-store-ios/features/catalogTab/CatalogScreenView.swift b/demo-store-ios/features/catalog/CatalogScreenView.swift similarity index 99% rename from demo-store-ios/features/catalogTab/CatalogScreenView.swift rename to demo-store-ios/features/catalog/CatalogScreenView.swift index c661287..3d87f91 100644 --- a/demo-store-ios/features/catalogTab/CatalogScreenView.swift +++ b/demo-store-ios/features/catalog/CatalogScreenView.swift @@ -3,7 +3,7 @@ import SwiftUI struct CatalogScreenView: View { var product: RecommendedProduct? - @ObservedObject var viewModel = MainTabViewModel() + @ObservedObject var viewModel = HomeViewModel() @State private var selectedImageIndex = 0 @State private var isLoading = true diff --git a/demo-store-ios/features/mainTab/MainScreenView.swift b/demo-store-ios/features/home/HomeScreenView.swift similarity index 92% rename from demo-store-ios/features/mainTab/MainScreenView.swift rename to demo-store-ios/features/home/HomeScreenView.swift index cdc9ed9..a8e06a7 100644 --- a/demo-store-ios/features/mainTab/MainScreenView.swift +++ b/demo-store-ios/features/home/HomeScreenView.swift @@ -1,8 +1,8 @@ import SwiftUI -struct MainScreenView: View { +struct HomeScreenView: View { @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var viewModel = MainTabViewModel() + @ObservedObject var viewModel = HomeViewModel() @State private var isLoading = true @@ -23,7 +23,7 @@ struct MainScreenView: View { } else { MainDiscoverView() - MainStoriesContainerView() + HomeStoriesContainerView() ShortRecommendationListView( recommendedProducts: viewModel.arrivalsProducts, @@ -59,9 +59,9 @@ struct MainScreenView: View { } } -struct MainScreenView_Previews: PreviewProvider { +struct HomeScreenView_Previews: PreviewProvider { static var previews: some View { - MainScreenView() + HomeScreenView() .environmentObject(NavigationManager()) } } diff --git a/demo-store-ios/features/mainTab/discover/MainDiscoverView.swift b/demo-store-ios/features/home/discover/MainDiscoverView.swift similarity index 100% rename from demo-store-ios/features/mainTab/discover/MainDiscoverView.swift rename to demo-store-ios/features/home/discover/MainDiscoverView.swift diff --git a/demo-store-ios/features/mainTab/recommendation/FullRecommendationListView.swift b/demo-store-ios/features/home/recommendation/FullRecommendationListView.swift similarity index 100% rename from demo-store-ios/features/mainTab/recommendation/FullRecommendationListView.swift rename to demo-store-ios/features/home/recommendation/FullRecommendationListView.swift diff --git a/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift b/demo-store-ios/features/home/recommendation/ProductListItemView.swift similarity index 97% rename from demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift rename to demo-store-ios/features/home/recommendation/ProductListItemView.swift index d887e14..f07484a 100644 --- a/demo-store-ios/features/mainTab/recommendation/ProductListItemView.swift +++ b/demo-store-ios/features/home/recommendation/ProductListItemView.swift @@ -3,7 +3,7 @@ import SwiftUI struct ProductListItemView: View { @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var viewModel = MainTabViewModel() + @ObservedObject var viewModel = HomeViewModel() var product: RecommendedProduct var containerWidth: CGFloat diff --git a/demo-store-ios/features/mainTab/recommendation/ShortRecommendationListView.swift b/demo-store-ios/features/home/recommendation/ShortRecommendationListView.swift similarity index 100% rename from demo-store-ios/features/mainTab/recommendation/ShortRecommendationListView.swift rename to demo-store-ios/features/home/recommendation/ShortRecommendationListView.swift diff --git a/demo-store-ios/features/mainTab/stories/MainStoriesContainerView.swift b/demo-store-ios/features/home/stories/HomeStoriesContainerView.swift similarity index 71% rename from demo-store-ios/features/mainTab/stories/MainStoriesContainerView.swift rename to demo-store-ios/features/home/stories/HomeStoriesContainerView.swift index 94dcd82..0535d6d 100644 --- a/demo-store-ios/features/mainTab/stories/MainStoriesContainerView.swift +++ b/demo-store-ios/features/home/stories/HomeStoriesContainerView.swift @@ -1,7 +1,7 @@ import SwiftUI import UIKit -struct MainStoriesContainerView: View { +struct HomeStoriesContainerView: View { var body: some View { VStack(alignment: .leading, spacing: 16) { Text("Stories") @@ -13,12 +13,12 @@ struct MainStoriesContainerView: View { StoriesViewControllerRepresentable() .frame(height: 200) } - .environmentObject(MainTabViewModel()) + .environmentObject(HomeViewModel()) } } -struct MainStoriesContainerView_Previews: PreviewProvider { +struct HomeStoriesContainerView_Previews: PreviewProvider { static var previews: some View { - MainStoriesContainerView() + HomeStoriesContainerView() } } diff --git a/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift b/demo-store-ios/features/home/stories/controller/StoriesViewController.swift similarity index 92% rename from demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift rename to demo-store-ios/features/home/stories/controller/StoriesViewController.swift index 0cb53fa..a05a573 100644 --- a/demo-store-ios/features/mainTab/stories/controller/StoriesViewController.swift +++ b/demo-store-ios/features/home/stories/controller/StoriesViewController.swift @@ -6,7 +6,7 @@ class StoriesViewController: UIViewController { var sdk: PersonalizationSDK? var storiesView: StoriesView? - var storiesCode:String = "40e9f2c0b33aa016dba02b5b1024bd36" + var storiesCode:String = "fcaa8d3168ab7d7346e4b4f1a1c92214" override func viewDidLoad() { super.viewDidLoad() @@ -35,7 +35,7 @@ class StoriesViewController: UIViewController { struct StoriesViewControllerRepresentable: UIViewControllerRepresentable { - @EnvironmentObject var viewModel: MainTabViewModel + @EnvironmentObject var viewModel: HomeViewModel func makeUIViewController(context: Context) -> StoriesViewController { let viewController = StoriesViewController() diff --git a/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift b/demo-store-ios/features/home/viewModel/HomeViewModel.swift similarity index 97% rename from demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift rename to demo-store-ios/features/home/viewModel/HomeViewModel.swift index 0c57491..805060c 100644 --- a/demo-store-ios/features/mainTab/viewModel/MainTabViewModel.swift +++ b/demo-store-ios/features/home/viewModel/HomeViewModel.swift @@ -2,7 +2,7 @@ import Foundation import Combine import REES46 -class MainTabViewModel: ObservableObject { +class HomeViewModel: ObservableObject { private let blockId = "977cb67194a72fdc7b424f49d69a862d" diff --git a/demo-store-ios/features/search/SearchScreenView.swift b/demo-store-ios/features/search/SearchScreenView.swift new file mode 100644 index 0000000..ed0830f --- /dev/null +++ b/demo-store-ios/features/search/SearchScreenView.swift @@ -0,0 +1,15 @@ + +import SwiftUI + +struct SearchScreenView:View { + @EnvironmentObject var navigationManager: NavigationManager + var body: some View { + VStack(alignment: .leading) { + + } + .background(Color.white) + .onAppear{ + navigationManager.setToolbarHidden(hidden: true) + } + } +} diff --git a/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift b/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift new file mode 100644 index 0000000..2cfbb8e --- /dev/null +++ b/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift @@ -0,0 +1,9 @@ +import Foundation +import Combine +import REES46 + +class SearchViewModel: ObservableObject { + + let sdkManager = SDKManager.shared + +} diff --git a/demo-store-ios/features/settingsTab/SettingsErrroScreenView.swift b/demo-store-ios/features/settings/SettingsErrroScreenView.swift similarity index 100% rename from demo-store-ios/features/settingsTab/SettingsErrroScreenView.swift rename to demo-store-ios/features/settings/SettingsErrroScreenView.swift diff --git a/demo-store-ios/features/settingsTab/SettingsInputCodeView.swift b/demo-store-ios/features/settings/SettingsInputCodeView.swift similarity index 100% rename from demo-store-ios/features/settingsTab/SettingsInputCodeView.swift rename to demo-store-ios/features/settings/SettingsInputCodeView.swift diff --git a/demo-store-ios/features/settingsTab/SettingsScreenView.swift b/demo-store-ios/features/settings/SettingsScreenView.swift similarity index 98% rename from demo-store-ios/features/settingsTab/SettingsScreenView.swift rename to demo-store-ios/features/settings/SettingsScreenView.swift index 0ce8731..385375e 100644 --- a/demo-store-ios/features/settingsTab/SettingsScreenView.swift +++ b/demo-store-ios/features/settings/SettingsScreenView.swift @@ -26,7 +26,7 @@ struct SettingsScreenView: View { case .error(let errorMessage): SettingsErrorScreenView(errorMessage: errorMessage) { - navigationManager.navigateTo(screen: AnyView(MainScreenView())) + navigationManager.navigateTo(screen: AnyView(HomeScreenView())) } case .data: diff --git a/demo-store-ios/navigation/BottomBarView.swift b/demo-store-ios/navigation/BottomBarView.swift index 99c3d70..206d444 100644 --- a/demo-store-ios/navigation/BottomBarView.swift +++ b/demo-store-ios/navigation/BottomBarView.swift @@ -6,40 +6,42 @@ struct BottomBarView: View { var body: some View { VStack { - Spacer() - - HStack { - TabBarButton(image: "MainTab", isSelected: selectedTab == .main) - .onTapGesture { - selectedTab = .main - navigationManager.navigateTo(screen: AnyView(MainScreenView()), selectedTab: .main) - } - .padding(.leading, 20) - - Spacer() - - TabBarButton(image: "CatalogTab", isSelected: selectedTab == .catalog) - .onTapGesture { - selectedTab = .catalog - navigationManager.navigateTo(screen: AnyView(CatalogScreenView()), selectedTab: .catalog) - } - - Spacer() - - TabBarButton(image: "CartTab", isSelected: selectedTab == .cart) - .onTapGesture { - selectedTab = .cart - navigationManager.navigateTo(screen: AnyView(CartScreenView()), selectedTab: .cart) - } - + if !navigationManager.isBottomBarHidden { Spacer() - TabBarButton(image: "SettingsTab", isSelected: selectedTab == .settings) - .onTapGesture { - selectedTab = .settings - navigationManager.navigateTo(screen: AnyView(SettingsScreenView()), selectedTab: .settings) - } - .padding(.trailing, 20) + HStack { + TabBarButton(image: "MainTab", isSelected: selectedTab == .main) + .onTapGesture { + selectedTab = .main + navigationManager.navigateTo(screen: AnyView(HomeScreenView()), selectedTab: .main) + } + .padding(.leading, 20) + + Spacer() + + TabBarButton(image: "CatalogTab", isSelected: selectedTab == .catalog) + .onTapGesture { + selectedTab = .catalog + navigationManager.navigateTo(screen: AnyView(CatalogScreenView()), selectedTab: .catalog) + } + + Spacer() + + TabBarButton(image: "CartTab", isSelected: selectedTab == .cart) + .onTapGesture { + selectedTab = .cart + navigationManager.navigateTo(screen: AnyView(CartScreenView()), selectedTab: .cart) + } + + Spacer() + + TabBarButton(image: "SettingsTab", isSelected: selectedTab == .settings) + .onTapGesture { + selectedTab = .settings + navigationManager.navigateTo(screen: AnyView(SettingsScreenView()), selectedTab: .settings) + } + .padding(.trailing, 20) + } } } .onChange(of: navigationManager.selectedTab) { newTab in diff --git a/demo-store-ios/navigation/NavigationManager.swift b/demo-store-ios/navigation/NavigationManager.swift index 16b43fa..8080fa4 100644 --- a/demo-store-ios/navigation/NavigationManager.swift +++ b/demo-store-ios/navigation/NavigationManager.swift @@ -3,11 +3,12 @@ import SwiftUI class NavigationManager: ObservableObject { @Published var currentScreen: AnyView @Published var isToolbarHidden: Bool = false + @Published var isBottomBarHidden: Bool = false @Published var currentScreenType: ScreenType = .none @Published var selectedTab: ScreenType? = .main init() { - self.currentScreen = AnyView(MainScreenView()) + self.currentScreen = AnyView(HomeScreenView()) self.currentScreenType = .main } @@ -17,7 +18,7 @@ class NavigationManager: ObservableObject { self.selectedTab = selectedTab switch screen { - case is MainScreenView: + case is HomeScreenView: self.currentScreenType = .main case is CatalogScreenView: self.currentScreenType = .catalog @@ -34,6 +35,10 @@ class NavigationManager: ObservableObject { self.isToolbarHidden = hidden } + func setBottomBarHidden(hidden: Bool) { + self.isBottomBarHidden = hidden + } + func resetSelection() { self.selectedTab = nil } From 2100ce905c852d1cc50d87e2c393f07bdcda42d6 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 16:59:40 +0200 Subject: [PATCH 42/85] feat: Add search screen with items and search history --- .../REES46/Classes/PersonalizationSDK.swift | 10 +- demo-store-ios.xcodeproj/project.pbxproj | 4 + demo-store-ios/ContentView.swift | 2 - .../features/catalog/CatalogScreenView.swift | 2 + .../features/search/SearchScreenView.swift | 114 ++++++++++- .../SearchViewModel/SearchViewModel.swift | 85 +++++++- .../settings/SettingsScreenView.swift | 3 + .../mainSubView/DetailsToolbar.swift | 6 + demo-store-ios/mainSubView/ToolbarView.swift | 6 + demo-store-ios/models/SearchResponseDto.swift | 184 ++++++++++++++++++ .../navigation/NavigationManager.swift | 15 +- resources/Localizable.xcstrings | 14 ++ 12 files changed, 434 insertions(+), 11 deletions(-) create mode 100644 demo-store-ios/models/SearchResponseDto.swift diff --git a/Pods/REES46/REES46/Classes/PersonalizationSDK.swift b/Pods/REES46/REES46/Classes/PersonalizationSDK.swift index 7c10584..bb4970a 100644 --- a/Pods/REES46/REES46/Classes/PersonalizationSDK.swift +++ b/Pods/REES46/REES46/Classes/PersonalizationSDK.swift @@ -158,7 +158,15 @@ public extension PersonalizationSDK { getProductsFromCart(completion: completion) } - func search(query: String, limit: Int? = nil, offset: Int? = nil, categoryLimit: Int? = nil, categories: String? = nil, extended: String? = nil, sortBy: String? = nil, sortDir: String? = nil, locations: String? = nil, brands: String? = nil, filters: [String: Any]? = nil, priceMin: Double? = nil, priceMax: Double? = nil, colors: [String]? = nil, fashionSizes: [String]? = nil, exclude: String? = nil, email: String? = nil, timeOut: Double? = nil, disableClarification: Bool? = nil, completion: @escaping(Result) -> Void) { + func search( + query: String, + limit: Int? = nil, + offset: Int? = nil, + categoryLimit: Int? = nil, + categories: String? = nil, + extended: String? = nil, + sortBy: String? = nil, + sortDir: String? = nil, locations: String? = nil, brands: String? = nil, filters: [String: Any]? = nil, priceMin: Double? = nil, priceMax: Double? = nil, colors: [String]? = nil, fashionSizes: [String]? = nil, exclude: String? = nil, email: String? = nil, timeOut: Double? = nil, disableClarification: Bool? = nil, completion: @escaping(Result) -> Void) { search(query: query, limit: limit, offset: offset, categoryLimit: categoryLimit, categories: categories, extended: extended, sortBy: sortBy, sortDir: sortDir, locations: locations, brands: brands, filters: filters, priceMin: priceMin, priceMax: priceMax, colors: colors, fashionSizes: fashionSizes, exclude: exclude, email: email, timeOut: timeOut, disableClarification: disableClarification, completion: completion) } diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index cb71bdb..4f048f3 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */; }; 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */; }; 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.swift */; }; + 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; @@ -80,6 +81,7 @@ 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetRecommendationsUseCase.swift; sourceTree = ""; }; 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; 752F1D482C459680002D4AC3 /* SearchScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.swift; sourceTree = ""; }; + 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResponseDto.swift; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; @@ -289,6 +291,7 @@ 75674CF42C3D92CC007FAB88 /* Category.swift */, 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */, 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */, + 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */, ); path = models; sourceTree = ""; @@ -720,6 +723,7 @@ 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */, 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */, 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, + 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, diff --git a/demo-store-ios/ContentView.swift b/demo-store-ios/ContentView.swift index 0c1c6dc..5d919b8 100644 --- a/demo-store-ios/ContentView.swift +++ b/demo-store-ios/ContentView.swift @@ -26,10 +26,8 @@ struct ContentView: View { } } -#if DEBUG struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } -#endif diff --git a/demo-store-ios/features/catalog/CatalogScreenView.swift b/demo-store-ios/features/catalog/CatalogScreenView.swift index 3d87f91..907e4d6 100644 --- a/demo-store-ios/features/catalog/CatalogScreenView.swift +++ b/demo-store-ios/features/catalog/CatalogScreenView.swift @@ -3,6 +3,7 @@ import SwiftUI struct CatalogScreenView: View { var product: RecommendedProduct? + @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var viewModel = HomeViewModel() @State private var selectedImageIndex = 0 @@ -53,6 +54,7 @@ struct CatalogScreenView: View { } else { print("DATA is nil") } + navigationManager.setToolbarHidden(hidden: false) } } } diff --git a/demo-store-ios/features/search/SearchScreenView.swift b/demo-store-ios/features/search/SearchScreenView.swift index ed0830f..cea4131 100644 --- a/demo-store-ios/features/search/SearchScreenView.swift +++ b/demo-store-ios/features/search/SearchScreenView.swift @@ -1,14 +1,122 @@ - import SwiftUI -struct SearchScreenView:View { +struct SearchScreenView: View { + @EnvironmentObject var navigationManager: NavigationManager + @ObservedObject var viewModel = SearchViewModel() + var body: some View { VStack(alignment: .leading) { + HStack { + ZStack { + TextField("Search...", text: $viewModel.searchText) + .padding(.leading, 10) + .padding(.trailing, 40) + .frame(height: 40) + .background(Color(.systemGray6)) + .cornerRadius(6) + .overlay( + RoundedRectangle(cornerRadius: 6).stroke( + Color.gray.opacity(0.5), + lineWidth: 1 + ) + ) + + if !viewModel.searchText.isEmpty { + HStack { + Spacer() + Button(action: { + viewModel.clearSearchText() + }) { + Image(systemName: "xmark.circle.fill") + .foregroundColor(.gray) + } + .padding(.trailing, 10) + } + } + } + + Button(action: { + navigationManager.navigateBack() + }) { + Image(systemName: "xmark") + .foregroundColor(.black) + } + .padding(.leading, 10) + } + .padding() + + // Search history section + if !viewModel.searchHistory.isEmpty { + VStack(alignment: .leading) { + Divider().background(Color.gray) + + Text("search_history_title") + .font(.system(size: 11)) + .padding(.horizontal) + .foregroundColor(.gray) + + ForEach(viewModel.searchHistory, id: \.self) { query in + Text(query) + .font(.system(size: 14)) + .padding(.horizontal) + .padding(.vertical, 8) + .foregroundColor(.black) + } + + Divider().background(Color.gray) + } + } + + // Search results or loading/error message + if viewModel.isLoading { + ProgressView() + .padding() + } else if let errorMessage = viewModel.errorMessage { + Text(errorMessage) + .foregroundColor(.red) + .padding() + } else if let searchResults = viewModel.searchResults { + List(searchResults.products) { product in + + HStack { + + RemoteImageView( + urlString: product.imageUrl, + width: 48, + height: 48, + contentMode: .fill, + showBorder: false + ) .padding(.horizontal) + + VStack(alignment: .leading) { + Text(product.name) + .font(.system(size: 14)) + .padding(.horizontal) + .foregroundColor(.gray) + + Text("\(product.priceFormatted)") + .font(.system(size: 14)) + .padding(.horizontal) + .foregroundColor(.black) + } + .padding(.leading, 10) + + Spacer() + } + .padding(.vertical, 8) + .onAppear{ + print("ITEMS COUNT \(searchResults)") + } + } + .listStyle(PlainListStyle()) + .padding(.horizontal, -20) + } + Spacer() } .background(Color.white) - .onAppear{ + .onAppear { navigationManager.setToolbarHidden(hidden: true) } } diff --git a/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift b/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift index 2cfbb8e..9658c21 100644 --- a/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift +++ b/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift @@ -1,9 +1,90 @@ -import Foundation +import SwiftUI import Combine import REES46 class SearchViewModel: ObservableObject { - let sdkManager = SDKManager.shared + @Published var searchText: String = "" + @Published var searchResults: LocalSearchResponse? = nil + @Published var isLoading: Bool = false + @Published var errorMessage: String? + @Published var searchHistory: [String] = [] + + private var cancellables = Set() + + init() { + $searchText + .debounce(for: .milliseconds(300), scheduler: RunLoop.main) + .sink { [weak self] searchText in + self?.search(query: searchText) + } + .store(in: &cancellables) + } + + func search(query: String) { + guard !query.isEmpty else { + searchResults = nil + return + } + + isLoading = true + errorMessage = nil + + sdkManager.sdk?.search( + query: query, + limit: nil, + offset: nil, + categoryLimit: nil, + categories: nil, + extended: nil, + sortBy: nil, + sortDir: nil, + locations: nil, + brands: nil, + filters: nil, + priceMin: nil, + priceMax: nil, + colors: nil, + fashionSizes: nil, + exclude: nil, + email: nil, + timeOut: nil, + disableClarification: nil + ) { [weak self] result in + DispatchQueue.main.async { + self?.isLoading = false + switch result { + case .success(let response): + self?.searchResults = LocalSearchResponse.from(response) + self?.updateSearchHistory(query: query) + case .failure(let error): + self?.errorMessage = error.localizedDescription + } + } + } + } + + private func updateSearchHistory(query: String) { + if query.count >= 5 && !searchHistory.contains(query) { + searchHistory.insert(query, at: 0) + + if searchHistory.count > 10 { + searchHistory = Array(searchHistory.prefix(10)) + } + } + } + + func clearSearchResults() { + searchResults = nil + } + + func clearErrorMessage() { + errorMessage = nil + } + + func clearSearchText() { + searchText = "" + } + } diff --git a/demo-store-ios/features/settings/SettingsScreenView.swift b/demo-store-ios/features/settings/SettingsScreenView.swift index 385375e..b66dba3 100644 --- a/demo-store-ios/features/settings/SettingsScreenView.swift +++ b/demo-store-ios/features/settings/SettingsScreenView.swift @@ -36,6 +36,9 @@ struct SettingsScreenView: View { .padding() .navigationTitle("settings_tab_title") .background(Color.white.edgesIgnoringSafeArea(.all)) + .onAppear{ + navigationManager.setToolbarHidden(hidden: false) + } } } diff --git a/demo-store-ios/mainSubView/DetailsToolbar.swift b/demo-store-ios/mainSubView/DetailsToolbar.swift index a6bd874..4c516e7 100644 --- a/demo-store-ios/mainSubView/DetailsToolbar.swift +++ b/demo-store-ios/mainSubView/DetailsToolbar.swift @@ -34,6 +34,12 @@ struct DetailsToolbarView: View { .renderingMode(.template) .frame(width: 30, height: 30) .foregroundColor(.white) + .onTapGesture { + navigationManager.navigateTo( + screen: AnyView(SearchScreenView()), + selectedTab: navigationManager.selectedTab + ) + } Image("CartIcon") .resizable() diff --git a/demo-store-ios/mainSubView/ToolbarView.swift b/demo-store-ios/mainSubView/ToolbarView.swift index 5605957..8edafc7 100644 --- a/demo-store-ios/mainSubView/ToolbarView.swift +++ b/demo-store-ios/mainSubView/ToolbarView.swift @@ -37,6 +37,12 @@ struct ToolbarView: View { .renderingMode(.template) .frame(width: 30, height: 30) .foregroundColor(.black) + .onTapGesture { + navigationManager.navigateTo( + screen: AnyView(SearchScreenView()), + selectedTab: navigationManager.selectedTab + ) + } Image("CartIcon") .resizable() diff --git a/demo-store-ios/models/SearchResponseDto.swift b/demo-store-ios/models/SearchResponseDto.swift new file mode 100644 index 0000000..40116ac --- /dev/null +++ b/demo-store-ios/models/SearchResponseDto.swift @@ -0,0 +1,184 @@ +import Foundation +import REES46 + +struct LocalFilter { + let count: Int + let values: [String: Int] +} + +struct LocalIndustrialFilters { + let fashionSizes: [LocalFashionSize] + let fashionColors: [LocalFashionColor] +} + +struct LocalFashionSize { + let count: Int + let size: String +} + +struct LocalFashionColor { + let count: Int + let color: String +} + +struct LocalPriceRange { + let min: Double + let max: Double +} + +struct LocalSuggest { + let name: String + let url: String + let deeplinkIos: String +} + +struct LocalQuery { + let name: String + let url: String + let deeplinkIos: String +} + +struct LocalCategory { + let id: String + let name: String + let url: String? + let alias: String? + let parentId: String? +} + +struct LocalRedirect { + let query: String + let redirectUrl: String + let deeplink: String? + let deeplinkIos: String? +} + +struct LocalSearchResponse { + let categories: [LocalCategory] + let products: [LocalProduct] + let productsTotal: Int + let queries: [LocalQuery] + let filters: [String: LocalFilter]? + let industrialFilters: LocalIndustrialFilters? + let brands: [String]? + let priceRange: LocalPriceRange? + let redirect: LocalRedirect? +} + +struct LocalProduct: Identifiable { + let id: String + let barcode: String + let name: String + let brand: String + let model: String + let description: String + let imageUrl: String + let resizedImageUrl: String + let resizedImages: [String: String] + let url: String + let deeplinkIos: String + let price: Double + let priceFormatted: String + let priceFull: Double + let priceFullFormatted: String + let oldPrice: Double + let oldPriceFormatted: String + let oldPriceFull: Double + let oldPriceFullFormatted: String + let currency: String + let salesRate: Int + let discount: Int + let relativeSalesRate: Float + let isNew: Bool? + let params: [[String: Any]]? +} + +extension LocalSearchResponse { + static func from(_ response: SearchResponse) -> LocalSearchResponse { + return LocalSearchResponse( + categories: response.categories.map { category in + LocalCategory( + id: category.id, + name: category.name, + url: category.url, + alias: category.alias, + parentId: category.parentId + ) + }, + products: response.products.map { product in + LocalProduct( + id: product.id, + barcode: product.barcode, + name: product.name, + brand: product.brand, + model: product.model, + description: product.description, + imageUrl: product.imageUrl, + resizedImageUrl: product.resizedImageUrl, + resizedImages: product.resizedImages, + url: product.url, + deeplinkIos: product.deeplinkIos, + price: product.price, + priceFormatted: product.priceFormatted, + priceFull: product.priceFull, + priceFullFormatted: product.priceFullFormatted, + oldPrice: product.oldPrice, + oldPriceFormatted: product.oldPriceFormatted, + oldPriceFull: product.oldPriceFull, + oldPriceFullFormatted: product.oldPriceFullFormatted, + currency: product.currency, + salesRate: product.salesRate, + discount: product.discount, + relativeSalesRate: product.relativeSalesRate, + isNew: product.isNew, + params: product.params + ) + }, + productsTotal: response.productsTotal, + queries: response.queries.map { query in + LocalQuery( + name: query.name, + url: query.url, + deeplinkIos: query.deeplinkIos + ) + }, + filters: response.filters?.mapValues { filter in + LocalFilter( + count: filter.count, + values: filter.values + ) + }, + industrialFilters: response.industrialFilters.map { filters in + LocalIndustrialFilters( + fashionSizes: filters.fashionSizes.map { size in + LocalFashionSize( + count: size.count, + size: size.size + ) + }, + fashionColors: filters.fashionColors.map { color in + LocalFashionColor( + count: color.count, + color: color.color + ) + } + ) + }, + brands: response.brands, + priceRange: response.priceRange.map { range in + LocalPriceRange( + min: range.min, + max: range.max + ) + }, + redirect: response.redirect.map { redirect in + LocalRedirect( + query: redirect.query, + redirectUrl: redirect.redirectUrl, + deeplink: redirect.deeplink, + deeplinkIos: redirect.deeplinkIos + ) + } + ) + } +} diff --git a/demo-store-ios/navigation/NavigationManager.swift b/demo-store-ios/navigation/NavigationManager.swift index 8080fa4..5ec2243 100644 --- a/demo-store-ios/navigation/NavigationManager.swift +++ b/demo-store-ios/navigation/NavigationManager.swift @@ -7,15 +7,19 @@ class NavigationManager: ObservableObject { @Published var currentScreenType: ScreenType = .none @Published var selectedTab: ScreenType? = .main + private var screenHistory: [AnyView] = [] + init() { - self.currentScreen = AnyView(HomeScreenView()) + let homeView = HomeScreenView() + self.currentScreen = AnyView(homeView) self.currentScreenType = .main + self.screenHistory.append(self.currentScreen) } func navigateTo(screen: Content, selectedTab: ScreenType? = .main) { - self.currentScreen = AnyView(screen) self.selectedTab = selectedTab + self.screenHistory.append(self.currentScreen) switch screen { case is HomeScreenView: @@ -44,7 +48,12 @@ class NavigationManager: ObservableObject { } func navigateBack() { - // Implement navigation back logic if needed + if screenHistory.count > 1 { + screenHistory.removeLast() + if let previousScreen = screenHistory.last { + self.currentScreen = previousScreen + } + } } } diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 05f77ca..8bd8fac 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -249,6 +249,20 @@ }, "Retry" : { + }, + "search_history_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your requests history" + } + } + } + }, + "Search..." : { + }, "settings_sub_title" : { "extractionState" : "manual", From cebdb1bcb9ea22f200311c97db9d9e0badbfa7cc Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 17:25:32 +0200 Subject: [PATCH 43/85] feat: Add detekting total count --- .../features/search/SearchScreenView.swift | 45 ++++++++++++++++--- .../SearchViewModel/SearchViewModel.swift | 3 ++ resources/Localizable.xcstrings | 3 ++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/demo-store-ios/features/search/SearchScreenView.swift b/demo-store-ios/features/search/SearchScreenView.swift index cea4131..d42308d 100644 --- a/demo-store-ios/features/search/SearchScreenView.swift +++ b/demo-store-ios/features/search/SearchScreenView.swift @@ -1,4 +1,6 @@ import SwiftUI +import Combine +import REES46 struct SearchScreenView: View { @@ -85,9 +87,10 @@ struct SearchScreenView: View { urlString: product.imageUrl, width: 48, height: 48, - contentMode: .fill, + contentMode: .fit, showBorder: false - ) .padding(.horizontal) + ) + .padding(.horizontal) VStack(alignment: .leading) { Text(product.name) @@ -102,15 +105,17 @@ struct SearchScreenView: View { } .padding(.leading, 10) - Spacer() } .padding(.vertical, 8) - .onAppear{ - print("ITEMS COUNT \(searchResults)") - } + .frame(height: 40) } .listStyle(PlainListStyle()) .padding(.horizontal, -20) + + if searchResults.productsTotal != 0 { + ViewAllButton(count: searchResults.productsTotal) + .padding(.bottom) + } } Spacer() @@ -121,3 +126,31 @@ struct SearchScreenView: View { } } } + +struct ViewAllButton: View { + let count: Int + + var body: some View { + Button(action: { + // Handle action when button is tapped + // For example, navigate to a new view with all search results + }) { + HStack { + Spacer() + Text("View all (\(count))") + .foregroundColor(.black) + .font(.system(size: 14)) + .padding(.horizontal) + Spacer() + } + .frame(height: 44) + .background(Color.white) + .cornerRadius(5) + .overlay( + RoundedRectangle(cornerRadius: 5) + .stroke(Color.gray.opacity(0.5), lineWidth: 1) + ) + .padding([.leading, .trailing]) + } + } +} diff --git a/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift b/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift index 9658c21..36463ff 100644 --- a/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift +++ b/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift @@ -11,6 +11,8 @@ class SearchViewModel: ObservableObject { @Published var errorMessage: String? @Published var searchHistory: [String] = [] + @Published var totalItemCount: Int = 0 + private var cancellables = Set() init() { @@ -58,6 +60,7 @@ class SearchViewModel: ObservableObject { case .success(let response): self?.searchResults = LocalSearchResponse.from(response) self?.updateSearchHistory(query: query) + self?.totalItemCount = self?.searchResults?.productsTotal ?? 0 case .failure(let error): self?.errorMessage = error.localizedDescription } diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index 8bd8fac..c05014c 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -390,6 +390,9 @@ } } } + }, + "View all (%lld)" : { + } }, "version" : "1.0" From 5030d5db74fc1531e2e9a3ba55c635e0627ae64d Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 17:25:39 +0200 Subject: [PATCH 44/85] feat: Add detekting total count --- .../REES46/Classes/SimplePersonalizationSDK.swift | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift b/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift index fc9de19..68050d6 100644 --- a/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift +++ b/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift @@ -249,15 +249,14 @@ class SimplePersonalizationSDK: PersonalizationSDK { func search(query: String, limit: Int?, offset: Int?, categoryLimit: Int?, categories: String?, extended: String?, sortBy: String?, sortDir: String?, locations: String?, brands: String?, filters: [String: Any]?, priceMin: Double?, priceMax: Double?, colors: [String]?, fashionSizes: [String]?, exclude: String?, email: String?, timeOut: Double?, disableClarification: Bool?, completion: @escaping (Result) -> Void) { sessionQueue.addOperation { + let path = "search" var params: [String: String] = [ - Constants.shopId: self.shopId, - Constants.deviceId: self.deviceId, - Constants.userSeance: self.userSeance, - Constants.segment: Constants.type, - Constants.segment: self.segment, - Constants.type: "full_search", - Constants.searchQuery: query, + "shop_id": self.shopId, + "did": self.deviceId, + "sid": self.userSeance, + "type": "full_search", + "search_query": query, ] if let limit = limit { From 9b705e85fefa94a63c2e659d3db57ad8a2bf6635 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 19:11:35 +0200 Subject: [PATCH 45/85] feat: Add clicking on search history and alignment progress view --- .../features/cart/CartScreenView.swift | 2 +- .../features/search/SearchScreenView.swift | 38 +++++++++++++------ resources/Localizable.xcstrings | 26 ++++++++++--- 3 files changed, 48 insertions(+), 18 deletions(-) diff --git a/demo-store-ios/features/cart/CartScreenView.swift b/demo-store-ios/features/cart/CartScreenView.swift index 53a7a4d..f7ec276 100644 --- a/demo-store-ios/features/cart/CartScreenView.swift +++ b/demo-store-ios/features/cart/CartScreenView.swift @@ -222,7 +222,7 @@ struct NavigationButtonsView: View { HStack(spacing: 16) { Button( action: { - navigationManager.navigateTo(screen: AnyView(HomeScreenView()), selectedTab: .main) + navigationManager.navigateBack() } ) { Text("continue_button") diff --git a/demo-store-ios/features/search/SearchScreenView.swift b/demo-store-ios/features/search/SearchScreenView.swift index d42308d..f9775c5 100644 --- a/demo-store-ios/features/search/SearchScreenView.swift +++ b/demo-store-ios/features/search/SearchScreenView.swift @@ -11,7 +11,7 @@ struct SearchScreenView: View { VStack(alignment: .leading) { HStack { ZStack { - TextField("Search...", text: $viewModel.searchText) + TextField("search_hint", text: $viewModel.searchText) .padding(.leading, 10) .padding(.trailing, 40) .frame(height: 40) @@ -38,9 +38,11 @@ struct SearchScreenView: View { } } - Button(action: { - navigationManager.navigateBack() - }) { + Button( + action: { + navigationManager.navigateBack() + } + ) { Image(systemName: "xmark") .foregroundColor(.black) } @@ -59,11 +61,16 @@ struct SearchScreenView: View { .foregroundColor(.gray) ForEach(viewModel.searchHistory, id: \.self) { query in - Text(query) - .font(.system(size: 14)) - .padding(.horizontal) - .padding(.vertical, 8) - .foregroundColor(.black) + Button(action: { + viewModel.searchText = query + }) { + Text(query) + .font(.system(size: 14)) + .padding(.horizontal) + .padding(.vertical, 8) + .foregroundColor(.black) + .frame(maxWidth: .infinity, alignment: .leading) + } } Divider().background(Color.gray) @@ -72,8 +79,15 @@ struct SearchScreenView: View { // Search results or loading/error message if viewModel.isLoading { - ProgressView() - .padding() + GeometryReader { geometry in + VStack { + Spacer() + ProgressView() + .frame(width: 36, height: 36) + Spacer() + } + .frame(width: geometry.size.width, height: geometry.size.height) + } } else if let errorMessage = viewModel.errorMessage { Text(errorMessage) .foregroundColor(.red) @@ -137,7 +151,7 @@ struct ViewAllButton: View { }) { HStack { Spacer() - Text("View all (\(count))") + Text(String(format: NSLocalizedString("view_all_button", comment: ""), "\(count)")) .foregroundColor(.black) .font(.system(size: 14)) .padding(.horizontal) diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index c05014c..d5cc625 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -249,6 +249,17 @@ }, "Retry" : { + }, + "search_hint" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search..." + } + } + } }, "search_history_title" : { "extractionState" : "manual", @@ -260,9 +271,6 @@ } } } - }, - "Search..." : { - }, "settings_sub_title" : { "extractionState" : "manual", @@ -391,8 +399,16 @@ } } }, - "View all (%lld)" : { - + "view_all_button" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "View all %@" + } + } + } } }, "version" : "1.0" From 41d1166b40fec934ae4b188553dcd6502c9374b2 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 19:19:44 +0200 Subject: [PATCH 46/85] feat: Navigation to search result --- demo-store-ios.xcodeproj/project.pbxproj | 4 ++++ .../features/search/SearchResultView.swift | 11 +++++++++++ .../features/search/SearchScreenView.swift | 14 ++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 demo-store-ios/features/search/SearchResultView.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 4f048f3..b0c21cd 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */; }; 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.swift */; }; 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */; }; + 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; @@ -82,6 +83,7 @@ 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; 752F1D482C459680002D4AC3 /* SearchScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.swift; sourceTree = ""; }; 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResponseDto.swift; sourceTree = ""; }; + 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; @@ -186,6 +188,7 @@ children = ( 752F1D452C459539002D4AC3 /* SearchViewModel */, 752F1D482C459680002D4AC3 /* SearchScreenView.swift */, + 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */, ); path = search; sourceTree = ""; @@ -703,6 +706,7 @@ 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */, 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, + 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */, 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, 75674CF72C3D92E0007FAB88 /* RecommendedProduct.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, diff --git a/demo-store-ios/features/search/SearchResultView.swift b/demo-store-ios/features/search/SearchResultView.swift new file mode 100644 index 0000000..b7cadd2 --- /dev/null +++ b/demo-store-ios/features/search/SearchResultView.swift @@ -0,0 +1,11 @@ + +import Foundation +import SwiftUI + +struct SearchResultView: View { + var body: some View { + VStack(alignment: .leading) { + + } + } +} diff --git a/demo-store-ios/features/search/SearchScreenView.swift b/demo-store-ios/features/search/SearchScreenView.swift index f9775c5..1b069ea 100644 --- a/demo-store-ios/features/search/SearchScreenView.swift +++ b/demo-store-ios/features/search/SearchScreenView.swift @@ -127,8 +127,16 @@ struct SearchScreenView: View { .padding(.horizontal, -20) if searchResults.productsTotal != 0 { - ViewAllButton(count: searchResults.productsTotal) - .padding(.bottom) + ViewAllButton(count: searchResults.productsTotal){ + navigationManager.navigateTo( + screen: AnyView( + SearchResultView( + + ) + ), + selectedTab: nil + ) + }.padding(.bottom) } } @@ -142,7 +150,9 @@ struct SearchScreenView: View { } struct ViewAllButton: View { + let count: Int + let action: () -> Void var body: some View { Button(action: { From 00a208aa4df148b991e0cbb4abff9cc6e1b7cbfa Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 19:20:09 +0200 Subject: [PATCH 47/85] fix: Add logs only in debug flavor --- .../features/cart/repository/CartRepository.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/demo-store-ios/features/cart/repository/CartRepository.swift b/demo-store-ios/features/cart/repository/CartRepository.swift index 4a60d4a..6e1541b 100644 --- a/demo-store-ios/features/cart/repository/CartRepository.swift +++ b/demo-store-ios/features/cart/repository/CartRepository.swift @@ -12,11 +12,15 @@ class CartRepository: ObservableObject { func addToCart(product: RecommendedProduct, quantity: Int) { if let index = cartItems.firstIndex(where: { $0.product.id == product.id }) { cartItems[index].quantity += quantity + #if DEBUG print("Updated \(product.name) quantity to \(cartItems[index].quantity). Price: \(product.priceFormatted ?? "")") + #endif } else { let newItem = ProductCartItem(product: product, quantity: quantity) cartItems.append(newItem) + #if DEBUG print("Added \(product.name) with quantity \(quantity). Price: \(product.priceFormatted ?? "")") + #endif } } @@ -24,10 +28,14 @@ class CartRepository: ObservableObject { if let index = cartItems.firstIndex(where: { $0.product.id == productId }) { if quantity > 0 { cartItems[index].quantity = quantity + #if DEBUG print("Updated \(cartItems[index].product.name) quantity to \(quantity). Price: \(cartItems[index].product.priceFormatted ?? "")") + #endif } else { let removedProduct = cartItems.remove(at: index) + #if DEBUG print("Removed \(removedProduct.product.name). Price: \(removedProduct.product.priceFormatted ?? "")") + #endif } } } @@ -35,7 +43,9 @@ class CartRepository: ObservableObject { func removeFromCart(productId: String) { if let index = cartItems.firstIndex(where: { $0.product.id == productId }) { let removedProduct = cartItems.remove(at: index) + #if DEBUG print("Removed \(removedProduct.product.name). Price: \(removedProduct.product.priceFormatted ?? "")") + #endif } } } From 52d29e08ba52f2628e713b19ad88afc047dd7d36 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 19:37:28 +0200 Subject: [PATCH 48/85] feat: Add search result model and showing search result screen --- .../features/search/SearchResultView.swift | 21 +++++++++++ .../features/search/SearchScreenView.swift | 34 +++++++---------- demo-store-ios/models/SearchResponseDto.swift | 37 +++++++++++++++++++ 3 files changed, 72 insertions(+), 20 deletions(-) diff --git a/demo-store-ios/features/search/SearchResultView.swift b/demo-store-ios/features/search/SearchResultView.swift index b7cadd2..fb71567 100644 --- a/demo-store-ios/features/search/SearchResultView.swift +++ b/demo-store-ios/features/search/SearchResultView.swift @@ -3,9 +3,30 @@ import Foundation import SwiftUI struct SearchResultView: View { + @EnvironmentObject var navigationManager: NavigationManager + + var recommendedProducts: [RecommendedProduct] var body: some View { + VStack(alignment: .leading) { + + ScrollView { + Spacer().frame(height: 20) + LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: 16) { + ForEach(recommendedProducts, id: \.id) { product in + ProductListItemView( + product: product, + containerWidth: 170, + containerHeight: 280, + imageWidth: 170, + imageHeight: 170, + showShopButton: true + ).padding(20) + } + } + } } + .background(Color.white) } } diff --git a/demo-store-ios/features/search/SearchScreenView.swift b/demo-store-ios/features/search/SearchScreenView.swift index 1b069ea..fc5aa7b 100644 --- a/demo-store-ios/features/search/SearchScreenView.swift +++ b/demo-store-ios/features/search/SearchScreenView.swift @@ -61,16 +61,14 @@ struct SearchScreenView: View { .foregroundColor(.gray) ForEach(viewModel.searchHistory, id: \.self) { query in - Button(action: { - viewModel.searchText = query - }) { - Text(query) - .font(.system(size: 14)) - .padding(.horizontal) - .padding(.vertical, 8) - .foregroundColor(.black) - .frame(maxWidth: .infinity, alignment: .leading) - } + Text(query) + .font(.system(size: 14)) + .padding(.horizontal) + .padding(.vertical, 8) + .foregroundColor(.black) + .onTapGesture { + viewModel.searchText = query + } } Divider().background(Color.gray) @@ -127,16 +125,16 @@ struct SearchScreenView: View { .padding(.horizontal, -20) if searchResults.productsTotal != 0 { - ViewAllButton(count: searchResults.productsTotal){ + ViewAllButton(count: searchResults.productsTotal) { + let recommendedProducts = searchResults.products.map { RecommendedProduct.from(localProduct: $0) } navigationManager.navigateTo( screen: AnyView( - SearchResultView( - - ) + SearchResultView(recommendedProducts: recommendedProducts) ), selectedTab: nil ) - }.padding(.bottom) + } + .padding(.bottom) } } @@ -150,15 +148,11 @@ struct SearchScreenView: View { } struct ViewAllButton: View { - let count: Int let action: () -> Void var body: some View { - Button(action: { - // Handle action when button is tapped - // For example, navigate to a new view with all search results - }) { + Button(action: action) { HStack { Spacer() Text(String(format: NSLocalizedString("view_all_button", comment: ""), "\(count)")) diff --git a/demo-store-ios/models/SearchResponseDto.swift b/demo-store-ios/models/SearchResponseDto.swift index 40116ac..a05da0d 100644 --- a/demo-store-ios/models/SearchResponseDto.swift +++ b/demo-store-ios/models/SearchResponseDto.swift @@ -182,3 +182,40 @@ extension LocalSearchResponse { ) } } + +extension RecommendedProduct { + static func from(localProduct: LocalProduct) -> RecommendedProduct { + return RecommendedProduct( + id: localProduct.id, + barcode: localProduct.barcode, + name: localProduct.name, + brand: localProduct.brand, + model: localProduct.model, + description: localProduct.description, + imageUrl: localProduct.imageUrl, + resizedImageUrl: localProduct.resizedImageUrl, + url: localProduct.url, + deeplinkIos: localProduct.deeplinkIos, + categories: [], + locations: [], + price: localProduct.price, + priceFormatted: localProduct.priceFormatted, + priceFull: localProduct.priceFull, + priceFullFormatted: localProduct.priceFullFormatted, + oldPrice: localProduct.oldPrice, + oldPriceFormatted: localProduct.oldPriceFormatted, + oldPriceFull: localProduct.oldPriceFull, + oldPriceFullFormatted: localProduct.oldPriceFullFormatted, + currency: localProduct.currency, + salesRate: localProduct.salesRate, + discount: localProduct.discount, + rating: Int(localProduct.relativeSalesRate), + relativeSalesRate: localProduct.relativeSalesRate, + paramsRaw: localProduct.params, + fashionOriginalSizes: [], + fashionSizes: [], + fashionColors: [], + resizedImages: localProduct.resizedImages + ) + } +} From 552eebca381ae56a2e658766885e76dbd2aca83f Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 20:41:23 +0200 Subject: [PATCH 49/85] feat: Add frameworks like a modules --- common/common.h | 18 + .../cart/presentation}/CartViewModel.swift | 0 .../cart/repository/CartRepository.swift | 0 .../home/presentation}/HomeViewModel.swift | 0 .../presentation}/SearchViewModel.swift | 0 .../useCases/GetRecommendationsUseCase.swift | 0 commonTests/commonTests.swift | 36 ++ data/data.h | 18 + .../mappers/RecommendedProductMapper.swift | 0 .../models/CategoryDto.swift | 0 .../models/ProductCartItemDto.swift | 0 .../models/RecommendedProductDto.swift | 0 .../models/RecommenderResponse.swift | 0 .../models/SearchResponseDto.swift | 0 demo-store-ios.xcodeproj/project.pbxproj | 451 +++++++++++++++++- .../xcschemes/xcschememanagement.plist | 12 +- 16 files changed, 509 insertions(+), 26 deletions(-) create mode 100644 common/common.h rename {demo-store-ios/features/cart/viewModel => common/feature/cart/presentation}/CartViewModel.swift (100%) rename {demo-store-ios/features => common/feature}/cart/repository/CartRepository.swift (100%) rename {demo-store-ios/features/home/viewModel => common/feature/home/presentation}/HomeViewModel.swift (100%) rename {demo-store-ios/features/search/SearchViewModel => common/feature/search/presentation}/SearchViewModel.swift (100%) rename {demo-store-ios => common}/useCases/GetRecommendationsUseCase.swift (100%) create mode 100644 commonTests/commonTests.swift create mode 100644 data/data.h rename {demo-store-ios => data}/mappers/RecommendedProductMapper.swift (100%) rename demo-store-ios/models/Category.swift => data/models/CategoryDto.swift (100%) rename demo-store-ios/models/ProductCartItem.swift => data/models/ProductCartItemDto.swift (100%) rename demo-store-ios/models/RecommendedProduct.swift => data/models/RecommendedProductDto.swift (100%) rename {demo-store-ios => data}/models/RecommenderResponse.swift (100%) rename {demo-store-ios => data}/models/SearchResponseDto.swift (100%) diff --git a/common/common.h b/common/common.h new file mode 100644 index 0000000..d837ac7 --- /dev/null +++ b/common/common.h @@ -0,0 +1,18 @@ +// +// common.h +// common +// +// Created by Daniel Green on 2024-07-16. +// + +#import + +//! Project version number for common. +FOUNDATION_EXPORT double commonVersionNumber; + +//! Project version string for common. +FOUNDATION_EXPORT const unsigned char commonVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/demo-store-ios/features/cart/viewModel/CartViewModel.swift b/common/feature/cart/presentation/CartViewModel.swift similarity index 100% rename from demo-store-ios/features/cart/viewModel/CartViewModel.swift rename to common/feature/cart/presentation/CartViewModel.swift diff --git a/demo-store-ios/features/cart/repository/CartRepository.swift b/common/feature/cart/repository/CartRepository.swift similarity index 100% rename from demo-store-ios/features/cart/repository/CartRepository.swift rename to common/feature/cart/repository/CartRepository.swift diff --git a/demo-store-ios/features/home/viewModel/HomeViewModel.swift b/common/feature/home/presentation/HomeViewModel.swift similarity index 100% rename from demo-store-ios/features/home/viewModel/HomeViewModel.swift rename to common/feature/home/presentation/HomeViewModel.swift diff --git a/demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift b/common/feature/search/presentation/SearchViewModel.swift similarity index 100% rename from demo-store-ios/features/search/SearchViewModel/SearchViewModel.swift rename to common/feature/search/presentation/SearchViewModel.swift diff --git a/demo-store-ios/useCases/GetRecommendationsUseCase.swift b/common/useCases/GetRecommendationsUseCase.swift similarity index 100% rename from demo-store-ios/useCases/GetRecommendationsUseCase.swift rename to common/useCases/GetRecommendationsUseCase.swift diff --git a/commonTests/commonTests.swift b/commonTests/commonTests.swift new file mode 100644 index 0000000..ab94c1f --- /dev/null +++ b/commonTests/commonTests.swift @@ -0,0 +1,36 @@ +// +// commonTests.swift +// commonTests +// +// Created by Daniel Green on 2024-07-16. +// + +import XCTest +@testable import common + +final class commonTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/data/data.h b/data/data.h new file mode 100644 index 0000000..0f27c24 --- /dev/null +++ b/data/data.h @@ -0,0 +1,18 @@ +// +// data.h +// data +// +// Created by Daniel Green on 2024-07-16. +// + +#import + +//! Project version number for data. +FOUNDATION_EXPORT double dataVersionNumber; + +//! Project version string for data. +FOUNDATION_EXPORT const unsigned char dataVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/demo-store-ios/mappers/RecommendedProductMapper.swift b/data/mappers/RecommendedProductMapper.swift similarity index 100% rename from demo-store-ios/mappers/RecommendedProductMapper.swift rename to data/mappers/RecommendedProductMapper.swift diff --git a/demo-store-ios/models/Category.swift b/data/models/CategoryDto.swift similarity index 100% rename from demo-store-ios/models/Category.swift rename to data/models/CategoryDto.swift diff --git a/demo-store-ios/models/ProductCartItem.swift b/data/models/ProductCartItemDto.swift similarity index 100% rename from demo-store-ios/models/ProductCartItem.swift rename to data/models/ProductCartItemDto.swift diff --git a/demo-store-ios/models/RecommendedProduct.swift b/data/models/RecommendedProductDto.swift similarity index 100% rename from demo-store-ios/models/RecommendedProduct.swift rename to data/models/RecommendedProductDto.swift diff --git a/demo-store-ios/models/RecommenderResponse.swift b/data/models/RecommenderResponse.swift similarity index 100% rename from demo-store-ios/models/RecommenderResponse.swift rename to data/models/RecommenderResponse.swift diff --git a/demo-store-ios/models/SearchResponseDto.swift b/data/models/SearchResponseDto.swift similarity index 100% rename from demo-store-ios/models/SearchResponseDto.swift rename to data/models/SearchResponseDto.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index b0c21cd..24cc0a5 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */; }; 452CB1BD95293EB9465F6C4C /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF343FE4C1EB44258E4142CD /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; 748A7C58839E67C62D21DB52 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */; }; - 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */; }; + 752F1D3A2C41E01D002D4AC3 /* ProductCartItemDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */; }; 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */; }; 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */; }; 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */; }; @@ -18,6 +18,12 @@ 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.swift */; }; 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */; }; 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */; }; + 752F1D792C46F493002D4AC3 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 752F1D782C46F493002D4AC3 /* common.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 752F1D7C2C46F493002D4AC3 /* common.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D762C46F493002D4AC3 /* common.framework */; }; + 752F1D7D2C46F493002D4AC3 /* common.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D762C46F493002D4AC3 /* common.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 752F1D8F2C46F5D7002D4AC3 /* data.h in Headers */ = {isa = PBXBuildFile; fileRef = 752F1D8E2C46F5D7002D4AC3 /* data.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 752F1D922C46F5D7002D4AC3 /* data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D8C2C46F5D7002D4AC3 /* data.framework */; }; + 752F1D932C46F5D7002D4AC3 /* data.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D8C2C46F5D7002D4AC3 /* data.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; @@ -26,8 +32,8 @@ 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */; }; 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; - 75674CF52C3D92CC007FAB88 /* Category.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Category.swift */; }; - 75674CF72C3D92E0007FAB88 /* RecommendedProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */; }; + 75674CF52C3D92CC007FAB88 /* CategoryDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* CategoryDto.swift */; }; + 75674CF72C3D92E0007FAB88 /* RecommendedProductDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */; }; 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */; }; 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */; }; @@ -56,6 +62,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 752F1D7A2C46F493002D4AC3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75B9354B2C3564360063E814 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 752F1D752C46F493002D4AC3; + remoteInfo = common; + }; + 752F1D902C46F5D7002D4AC3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75B9354B2C3564360063E814 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 752F1D8B2C46F5D7002D4AC3; + remoteInfo = data; + }; 75B935642C3564370063E814 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 75B9354B2C3564360063E814 /* Project object */; @@ -72,11 +92,26 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 752F1D6D2C46F411002D4AC3 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 752F1D932C46F5D7002D4AC3 /* data.framework in Embed Frameworks */, + 752F1D7D2C46F493002D4AC3 /* common.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1274DEF2C4D166945251575B /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; - 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCartItem.swift; sourceTree = ""; }; + 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCartItemDto.swift; sourceTree = ""; }; 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepository.swift; sourceTree = ""; }; 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetRecommendationsUseCase.swift; sourceTree = ""; }; @@ -84,6 +119,11 @@ 752F1D482C459680002D4AC3 /* SearchScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.swift; sourceTree = ""; }; 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResponseDto.swift; sourceTree = ""; }; 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; + 752F1D632C46F411002D4AC3 /* commonTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = commonTests.swift; sourceTree = ""; }; + 752F1D762C46F493002D4AC3 /* common.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = common.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 752F1D782C46F493002D4AC3 /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; + 752F1D8C2C46F5D7002D4AC3 /* data.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = data.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 752F1D8E2C46F5D7002D4AC3 /* data.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = data.h; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; @@ -92,8 +132,8 @@ 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; - 75674CF42C3D92CC007FAB88 /* Category.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Category.swift; sourceTree = ""; }; - 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProduct.swift; sourceTree = ""; }; + 75674CF42C3D92CC007FAB88 /* CategoryDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryDto.swift; sourceTree = ""; }; + 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductDto.swift; sourceTree = ""; }; 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortRecommendationListView.swift; sourceTree = ""; }; 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageLoader.swift; sourceTree = ""; }; @@ -132,11 +172,27 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 752F1D732C46F493002D4AC3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 752F1D892C46F5D7002D4AC3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 75B935502C3564360063E814 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */, + 752F1D922C46F5D7002D4AC3 /* data.framework in Frameworks */, + 752F1D7C2C46F493002D4AC3 /* common.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -159,12 +215,12 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 752F1D3D2C41E1C6002D4AC3 /* viewModel */ = { + 752F1D3D2C41E1C6002D4AC3 /* presentation */ = { isa = PBXGroup; children = ( 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */, ); - path = viewModel; + path = presentation; sourceTree = ""; }; 752F1D3E2C41E5AC002D4AC3 /* repository */ = { @@ -186,19 +242,97 @@ 752F1D442C45952C002D4AC3 /* search */ = { isa = PBXGroup; children = ( - 752F1D452C459539002D4AC3 /* SearchViewModel */, 752F1D482C459680002D4AC3 /* SearchScreenView.swift */, 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */, ); path = search; sourceTree = ""; }; - 752F1D452C459539002D4AC3 /* SearchViewModel */ = { + 752F1D452C459539002D4AC3 /* presentation */ = { isa = PBXGroup; children = ( 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */, ); - path = SearchViewModel; + path = presentation; + sourceTree = ""; + }; + 752F1D622C46F411002D4AC3 /* commonTests */ = { + isa = PBXGroup; + children = ( + 752F1D632C46F411002D4AC3 /* commonTests.swift */, + ); + path = commonTests; + sourceTree = ""; + }; + 752F1D772C46F493002D4AC3 /* common */ = { + isa = PBXGroup; + children = ( + 752F1D412C457790002D4AC3 /* useCases */, + 752F1D812C46F4B1002D4AC3 /* feature */, + 752F1D782C46F493002D4AC3 /* common.h */, + ); + path = common; + sourceTree = ""; + }; + 752F1D812C46F4B1002D4AC3 /* feature */ = { + isa = PBXGroup; + children = ( + 752F1D862C46F503002D4AC3 /* catalog */, + 752F1D852C46F4FD002D4AC3 /* search */, + 752F1D842C46F4F7002D4AC3 /* settings */, + 752F1D832C46F4F2002D4AC3 /* cart */, + 752F1D822C46F4EB002D4AC3 /* home */, + ); + path = feature; + sourceTree = ""; + }; + 752F1D822C46F4EB002D4AC3 /* home */ = { + isa = PBXGroup; + children = ( + 75674CE92C3D29BF007FAB88 /* presentation */, + ); + path = home; + sourceTree = ""; + }; + 752F1D832C46F4F2002D4AC3 /* cart */ = { + isa = PBXGroup; + children = ( + 752F1D3D2C41E1C6002D4AC3 /* presentation */, + 752F1D3E2C41E5AC002D4AC3 /* repository */, + ); + path = cart; + sourceTree = ""; + }; + 752F1D842C46F4F7002D4AC3 /* settings */ = { + isa = PBXGroup; + children = ( + ); + path = settings; + sourceTree = ""; + }; + 752F1D852C46F4FD002D4AC3 /* search */ = { + isa = PBXGroup; + children = ( + 752F1D452C459539002D4AC3 /* presentation */, + ); + path = search; + sourceTree = ""; + }; + 752F1D862C46F503002D4AC3 /* catalog */ = { + isa = PBXGroup; + children = ( + ); + path = catalog; + sourceTree = ""; + }; + 752F1D8D2C46F5D7002D4AC3 /* data */ = { + isa = PBXGroup; + children = ( + 75674CFA2C3D9957007FAB88 /* mappers */, + 75674CF32C3D92B0007FAB88 /* models */, + 752F1D8E2C46F5D7002D4AC3 /* data.h */, + ); + path = data; sourceTree = ""; }; 7559449C2C357E1800C274C9 /* features */ = { @@ -226,7 +360,6 @@ 755944A22C35858C00C274C9 /* home */ = { isa = PBXGroup; children = ( - 75674CE92C3D29BF007FAB88 /* viewModel */, 75674CF02C3D787A007FAB88 /* recommendation */, 75674CEC2C3D2E45007FAB88 /* discover */, 75674CEA2C3D2E32007FAB88 /* stories */, @@ -245,12 +378,12 @@ path = mainSubView; sourceTree = ""; }; - 75674CE92C3D29BF007FAB88 /* viewModel */ = { + 75674CE92C3D29BF007FAB88 /* presentation */ = { isa = PBXGroup; children = ( 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */, ); - path = viewModel; + path = presentation; sourceTree = ""; }; 75674CEA2C3D2E32007FAB88 /* stories */ = { @@ -291,9 +424,9 @@ 75674CF32C3D92B0007FAB88 /* models */ = { isa = PBXGroup; children = ( - 75674CF42C3D92CC007FAB88 /* Category.swift */, - 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */, - 752F1D392C41E01D002D4AC3 /* ProductCartItem.swift */, + 75674CF42C3D92CC007FAB88 /* CategoryDto.swift */, + 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */, + 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */, 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */, ); path = models; @@ -323,6 +456,9 @@ 75B935552C3564360063E814 /* demo-store-ios */, 75B935662C3564370063E814 /* demo-store-iosTests */, 75B935702C3564370063E814 /* demo-store-iosUITests */, + 752F1D622C46F411002D4AC3 /* commonTests */, + 752F1D772C46F493002D4AC3 /* common */, + 752F1D8D2C46F5D7002D4AC3 /* data */, 75B935542C3564360063E814 /* Products */, 8FED5CC7CDC6607CEFB8FDC9 /* Pods */, ECE8154AB54931A903490932 /* Frameworks */, @@ -335,6 +471,8 @@ 75B935532C3564360063E814 /* demo-store-ios.app */, 75B935632C3564370063E814 /* demo-store-iosTests.xctest */, 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */, + 752F1D762C46F493002D4AC3 /* common.framework */, + 752F1D8C2C46F5D7002D4AC3 /* data.framework */, ); name = Products; sourceTree = ""; @@ -342,10 +480,7 @@ 75B935552C3564360063E814 /* demo-store-ios */ = { isa = PBXGroup; children = ( - 752F1D412C457790002D4AC3 /* useCases */, 75674CFF2C3DA0EC007FAB88 /* utils */, - 75674CFA2C3D9957007FAB88 /* mappers */, - 75674CF32C3D92B0007FAB88 /* models */, 75A3F4212C3828A400AAC175 /* Info.plist */, 75ECCD1B2C37F09100D6D346 /* di */, 75ECCD182C36F92A00D6D346 /* navigation */, @@ -396,8 +531,6 @@ 75ECCD0D2C36BE0600D6D346 /* cart */ = { isa = PBXGroup; children = ( - 752F1D3D2C41E1C6002D4AC3 /* viewModel */, - 752F1D3E2C41E5AC002D4AC3 /* repository */, 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, ); path = cart; @@ -463,7 +596,62 @@ }; /* End PBXGroup section */ +/* Begin PBXHeadersBuildPhase section */ + 752F1D712C46F493002D4AC3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 752F1D792C46F493002D4AC3 /* common.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 752F1D872C46F5D7002D4AC3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 752F1D8F2C46F5D7002D4AC3 /* data.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + /* Begin PBXNativeTarget section */ + 752F1D752C46F493002D4AC3 /* common */ = { + isa = PBXNativeTarget; + buildConfigurationList = 752F1D7E2C46F493002D4AC3 /* Build configuration list for PBXNativeTarget "common" */; + buildPhases = ( + 752F1D712C46F493002D4AC3 /* Headers */, + 752F1D722C46F493002D4AC3 /* Sources */, + 752F1D732C46F493002D4AC3 /* Frameworks */, + 752F1D742C46F493002D4AC3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = common; + productName = common; + productReference = 752F1D762C46F493002D4AC3 /* common.framework */; + productType = "com.apple.product-type.framework"; + }; + 752F1D8B2C46F5D7002D4AC3 /* data */ = { + isa = PBXNativeTarget; + buildConfigurationList = 752F1D942C46F5D7002D4AC3 /* Build configuration list for PBXNativeTarget "data" */; + buildPhases = ( + 752F1D872C46F5D7002D4AC3 /* Headers */, + 752F1D882C46F5D7002D4AC3 /* Sources */, + 752F1D892C46F5D7002D4AC3 /* Frameworks */, + 752F1D8A2C46F5D7002D4AC3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = data; + productName = data; + productReference = 752F1D8C2C46F5D7002D4AC3 /* data.framework */; + productType = "com.apple.product-type.framework"; + }; 75B935522C3564360063E814 /* demo-store-ios */ = { isa = PBXNativeTarget; buildConfigurationList = 75B935772C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-ios" */; @@ -473,10 +661,13 @@ 75B935502C3564360063E814 /* Frameworks */, 75B935512C3564360063E814 /* Resources */, 2ADA2F5588F90BD1D09FAC65 /* [CP] Embed Pods Frameworks */, + 752F1D6D2C46F411002D4AC3 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( + 752F1D7B2C46F493002D4AC3 /* PBXTargetDependency */, + 752F1D912C46F5D7002D4AC3 /* PBXTargetDependency */, ); name = "demo-store-ios"; productName = "demo-store-ios"; @@ -532,6 +723,12 @@ LastSwiftUpdateCheck = 1540; LastUpgradeCheck = 1540; TargetAttributes = { + 752F1D752C46F493002D4AC3 = { + CreatedOnToolsVersion = 15.4; + }; + 752F1D8B2C46F5D7002D4AC3 = { + CreatedOnToolsVersion = 15.4; + }; 75B935522C3564360063E814 = { CreatedOnToolsVersion = 15.4; }; @@ -561,11 +758,27 @@ 75B935522C3564360063E814 /* demo-store-ios */, 75B935622C3564370063E814 /* demo-store-iosTests */, 75B9356C2C3564370063E814 /* demo-store-iosUITests */, + 752F1D752C46F493002D4AC3 /* common */, + 752F1D8B2C46F5D7002D4AC3 /* data */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 752F1D742C46F493002D4AC3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 752F1D8A2C46F5D7002D4AC3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 75B935512C3564360063E814 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -696,11 +909,25 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 752F1D722C46F493002D4AC3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 752F1D882C46F5D7002D4AC3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 75B9354F2C3564360063E814 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.swift in Sources */, + 752F1D3A2C41E01D002D4AC3 /* ProductCartItemDto.swift in Sources */, 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */, 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */, 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, @@ -708,7 +935,7 @@ 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */, 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, - 75674CF72C3D92E0007FAB88 /* RecommendedProduct.swift in Sources */, + 75674CF72C3D92E0007FAB88 /* RecommendedProductDto.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, @@ -736,7 +963,7 @@ 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, - 75674CF52C3D92CC007FAB88 /* Category.swift in Sources */, + 75674CF52C3D92CC007FAB88 /* CategoryDto.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -760,6 +987,16 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 752F1D7B2C46F493002D4AC3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 752F1D752C46F493002D4AC3 /* common */; + targetProxy = 752F1D7A2C46F493002D4AC3 /* PBXContainerItemProxy */; + }; + 752F1D912C46F5D7002D4AC3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 752F1D8B2C46F5D7002D4AC3 /* data */; + targetProxy = 752F1D902C46F5D7002D4AC3 /* PBXContainerItemProxy */; + }; 75B935652C3564370063E814 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 75B935522C3564360063E814 /* demo-store-ios */; @@ -773,6 +1010,152 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + 752F1D7F2C46F493002D4AC3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.common"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 752F1D802C46F493002D4AC3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.common"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 752F1D952C46F5D7002D4AC3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.data"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 752F1D962C46F5D7002D4AC3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.data"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 75B935752C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1031,6 +1414,24 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 752F1D7E2C46F493002D4AC3 /* Build configuration list for PBXNativeTarget "common" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 752F1D7F2C46F493002D4AC3 /* Debug */, + 752F1D802C46F493002D4AC3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 752F1D942C46F5D7002D4AC3 /* Build configuration list for PBXNativeTarget "data" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 752F1D952C46F5D7002D4AC3 /* Debug */, + 752F1D962C46F5D7002D4AC3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 75B9354E2C3564360063E814 /* Build configuration list for PBXProject "demo-store-ios" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist index c1b9618..994e1e1 100644 --- a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,11 +4,21 @@ SchemeUserState - demo-store-ios.xcscheme_^#shared#^_ + common.xcscheme_^#shared#^_ orderHint 7 + data.xcscheme_^#shared#^_ + + orderHint + 9 + + demo-store-ios.xcscheme_^#shared#^_ + + orderHint + 8 + From cd6c6da272a51442c4b73aedde7cb68f9066229c Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 16 Jul 2024 21:21:19 +0200 Subject: [PATCH 50/85] feat: Add search result screen list, navigation and texts --- .../features/catalog/CatalogScreenView.swift | 2 +- .../features/search/SearchResultView.swift | 64 +++++++++++++++++-- .../features/search/SearchScreenView.swift | 13 ++-- .../mainSubView/SectionHeaderView.swift | 9 ++- resources/Localizable.xcstrings | 32 ++++++++++ 5 files changed, 108 insertions(+), 12 deletions(-) diff --git a/demo-store-ios/features/catalog/CatalogScreenView.swift b/demo-store-ios/features/catalog/CatalogScreenView.swift index 907e4d6..e3b85d3 100644 --- a/demo-store-ios/features/catalog/CatalogScreenView.swift +++ b/demo-store-ios/features/catalog/CatalogScreenView.swift @@ -25,7 +25,7 @@ struct CatalogScreenView: View { .frame(height: 250) } else { - if let product = product { + if product != nil { topSection productImagesSection diff --git a/demo-store-ios/features/search/SearchResultView.swift b/demo-store-ios/features/search/SearchResultView.swift index fb71567..6ebfff3 100644 --- a/demo-store-ios/features/search/SearchResultView.swift +++ b/demo-store-ios/features/search/SearchResultView.swift @@ -1,18 +1,71 @@ - -import Foundation import SwiftUI struct SearchResultView: View { @EnvironmentObject var navigationManager: NavigationManager var recommendedProducts: [RecommendedProduct] + var count: Int + var body: some View { - VStack(alignment: .leading) { + Spacer().frame(height: 50) + + HStack { + Button( + action: { + navigationManager.navigateBack() + } + ) { + Image(systemName: "chevron.left") + .foregroundColor(.black) + } + .padding(.leading, 16) + + Text("search_result_title") + .font(.system(size: 24, weight: .bold)) + .foregroundColor(.black) + .padding(.horizontal) + + Spacer() + + Button( + action: { + // TODO: Route to Filter screen + } + ) { + Image(systemName: "slider.horizontal.3") + .foregroundColor(.black) + } + .padding(.trailing, 16) + + Button( + action: { + navigationManager.navigateTo(screen: AnyView(HomeScreenView()), selectedTab: .main) + } + ) { + Image(systemName: "xmark") + .foregroundColor(.black) + } + .padding(.trailing, 16) + } + .frame(height: 50) + .background(Color.white) + + HStack { + Text("search_found_title") + .font(.system(size: 14)) + .foregroundColor(.black) + + Text(String(format: NSLocalizedString("search_count_result", comment: ""), "\(count)")) + .font(.system(size: 14)) + .foregroundColor(.gray) + } + .padding(.vertical, 8) + .background(Color.white) + .padding(.horizontal) ScrollView { - Spacer().frame(height: 20) LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: 16) { ForEach(recommendedProducts, id: \.id) { product in ProductListItemView( @@ -25,8 +78,11 @@ struct SearchResultView: View { ).padding(20) } } + .padding(.horizontal) + .padding(.bottom, 20) } } .background(Color.white) + .edgesIgnoringSafeArea(.all) } } diff --git a/demo-store-ios/features/search/SearchScreenView.swift b/demo-store-ios/features/search/SearchScreenView.swift index fc5aa7b..5d51df0 100644 --- a/demo-store-ios/features/search/SearchScreenView.swift +++ b/demo-store-ios/features/search/SearchScreenView.swift @@ -27,9 +27,11 @@ struct SearchScreenView: View { if !viewModel.searchText.isEmpty { HStack { Spacer() - Button(action: { - viewModel.clearSearchText() - }) { + Button( + action: { + viewModel.clearSearchText() + } + ) { Image(systemName: "xmark.circle.fill") .foregroundColor(.gray) } @@ -129,7 +131,10 @@ struct SearchScreenView: View { let recommendedProducts = searchResults.products.map { RecommendedProduct.from(localProduct: $0) } navigationManager.navigateTo( screen: AnyView( - SearchResultView(recommendedProducts: recommendedProducts) + SearchResultView( + recommendedProducts: recommendedProducts, + count: searchResults.productsTotal + ) ), selectedTab: nil ) diff --git a/demo-store-ios/mainSubView/SectionHeaderView.swift b/demo-store-ios/mainSubView/SectionHeaderView.swift index 770326b..1c26d9a 100644 --- a/demo-store-ios/mainSubView/SectionHeaderView.swift +++ b/demo-store-ios/mainSubView/SectionHeaderView.swift @@ -29,8 +29,11 @@ struct SectionHeaderView: View { struct SectionHeaderView_Previews: PreviewProvider { static var previews: some View { - SectionHeaderView(title: "Section Title", buttonAction: { - print("Show All tapped") - }) + SectionHeaderView( + title: "Section Title", + buttonAction: { + print("Show All tapped") + } + ) } } diff --git a/resources/Localizable.xcstrings b/resources/Localizable.xcstrings index d5cc625..b3472d4 100644 --- a/resources/Localizable.xcstrings +++ b/resources/Localizable.xcstrings @@ -249,6 +249,27 @@ }, "Retry" : { + }, + "search_count_result" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : " %@ products" + } + } + } + }, + "search_found_title" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "found" + } + } + } }, "search_hint" : { "extractionState" : "manual", @@ -272,6 +293,17 @@ } } }, + "search_result_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search Results" + } + } + } + }, "settings_sub_title" : { "extractionState" : "manual", "localizations" : { From 2bd3301363f6a3f2eac7a5adc674a2543344aaf0 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 18 Jul 2024 16:13:26 +0200 Subject: [PATCH 51/85] feat: Add packages and move files to directories --- {demo-store-ios => App}/AppDelegate.swift | 0 {demo-store-ios => App}/ContentView.swift | 0 {demo-store-ios => App}/DemoStoreApp.swift | 0 {demo-store-ios => App}/Info.plist | 0 .../Domain}/NavigationManager.swift | 2 +- .../Presentation/View}/BottomBarView.swift | 2 +- .../Preview Assets.xcassets}/Contents.json | 0 .../mainSubView/UiUtils.swift | 0 Core/Core.h | 18 + .../di => Core/DI}/SdkManager.swift | 1 - .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/AppIcon.png | Bin .../AppIcon.appiconset/Contents.json | 0 .../Resources/Assets.xcassets}/Contents.json | 0 .../Icons/CartIcon.imageset/Contents.json | 0 .../Icons/CartIcon.imageset/Frame 26.pdf | Bin .../Icons/CartIcon.imageset/Frame 27.pdf | Bin .../Icons/CartIcon.imageset/Frame 28.pdf | Bin .../Icons/CartTab.imageset/Contents.json | 0 .../Icons/CartTab.imageset/cart 1.pdf | Bin .../Icons/CartTab.imageset/cart 2.pdf | Bin .../Icons/CartTab.imageset/cart.pdf | Bin .../Icons/CatalogTab.imageset/Contents.json | 0 .../Icons/CatalogTab.imageset/folder 1.pdf | Bin .../Icons/CatalogTab.imageset/folder 2.pdf | Bin .../Icons/CatalogTab.imageset/folder.pdf | Bin .../Assets.xcassets/Icons}/Contents.json | 0 .../Icons/MainTab.imageset/Contents.json | 0 .../Icons/MainTab.imageset/home 1.pdf | Bin .../Icons/MainTab.imageset/home 2.pdf | Bin .../Icons/MainTab.imageset/home.pdf | Bin .../Icons/MenuIcon.imageset/Contents.json | 0 .../Icons/MenuIcon.imageset/hamburger 1.pdf | Bin .../Icons/MenuIcon.imageset/hamburger 2.pdf | Bin .../Icons/MenuIcon.imageset/hamburger.pdf | Bin .../Icons/SearchIcon.imageset/Contents.json | 0 .../Icons/SearchIcon.imageset/Frame 25.pdf | Bin .../Icons/SearchIcon.imageset/Frame 26.pdf | Bin .../Icons/SearchIcon.imageset/Frame 27.pdf | Bin .../Icons/SettingsTab.imageset/Contents.json | 0 .../Icons/SettingsTab.imageset/cog 1.pdf | Bin .../Icons/SettingsTab.imageset/cog 2.pdf | Bin .../Icons/SettingsTab.imageset/cog.pdf | Bin .../Assets.xcassets/Logo}/Contents.json | 0 .../Logo/SplashLogo.imageset/Contents.json | 0 .../Logo/SplashLogo.imageset/Logo 1.pdf | Bin .../Logo/SplashLogo.imageset/Logo 2.pdf | Bin .../Logo/SplashLogo.imageset/Logo.pdf | Bin .../Logo/ToolbarLogo.imageset/Contents.json | 0 .../Logo/ToolbarLogo.imageset/Logo 1.pdf | Bin .../Logo/ToolbarLogo.imageset/Logo 2.pdf | Bin .../Logo/ToolbarLogo.imageset/Logo.pdf | Bin .../Resources}/Localizable.xcstrings | 0 .../Utils}/RatingConverter.swift | 0 .../Utils}/RemoteImageLoader.swift | 0 {data => Data}/data.h | 0 .../mappers/RecommendedProductMapper.swift | 0 {data => Data}/models/CategoryDto.swift | 0 .../models/ProductCartItemDto.swift | 0 .../models/RecommendedProductDto.swift | 0 .../models/RecommenderResponse.swift | 0 {data => Data}/models/SearchResponseDto.swift | 0 .../Domain/Repository}/CartRepository.swift | 0 .../Presentation/View}/CartScreenView.swift | 0 .../ViewModel}/CartViewModel.swift | 0 Feature/Feature.h | 18 + .../UseCase}/GetRecommendationsUseCase.swift | 0 .../Presentation/View}/DetailsToolbar.swift | 0 .../View/Discover}/MainDiscoverView.swift | 0 .../Presentation/View}/HomeScreenView.swift | 0 .../FullRecommendationListView.swift | 0 .../Recommendation}/ProductListItemView.swift | 2 +- .../ShortRecommendationListView.swift | 0 .../View}/SectionHeaderView.swift | 0 .../Controller}/StoriesViewController.swift | 0 .../Stories}/HomeStoriesContainerView.swift | 0 .../Home/Presentation/View}/ToolbarView.swift | 0 .../ViewModel}/HomeViewModel.swift | 0 .../View/ProductsScreenView.swift | 2 +- .../Presentation/View}/SearchResultView.swift | 0 .../Presentation/View}/SearchScreenView.swift | 0 .../ViewModel}/SearchViewModel.swift | 0 .../View}/SettingsErrroScreenView.swift | 0 .../View}/SettingsInputCodeView.swift | 0 .../View}/SettingsScreenView.swift | 0 .../Controller/LaunchScreenController.swift | 0 .../Presentation}/SplashScreenView.swift | 0 common/common.h | 18 - commonTests/commonTests.swift | 36 - demo-store-ios.xcodeproj/project.pbxproj | 917 ++++++++++++------ .../xcschemes/demo-store-ios.xcscheme | 102 ++ .../xcschemes/xcschememanagement.plist | 34 +- 92 files changed, 768 insertions(+), 384 deletions(-) rename {demo-store-ios => App}/AppDelegate.swift (100%) rename {demo-store-ios => App}/ContentView.swift (100%) rename {demo-store-ios => App}/DemoStoreApp.swift (100%) rename {demo-store-ios => App}/Info.plist (100%) rename {demo-store-ios/navigation => App/Navigation/Domain}/NavigationManager.swift (98%) rename {demo-store-ios/navigation => App/Navigation/Presentation/View}/BottomBarView.swift (97%) rename {demo-store-ios/Assets.xcassets => App/Preview Content/Preview Assets.xcassets}/Contents.json (100%) rename {demo-store-ios => App}/mainSubView/UiUtils.swift (100%) create mode 100644 Core/Core.h rename {demo-store-ios/di => Core/DI}/SdkManager.swift (96%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/AppIcon.appiconset/AppIcon.png (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {demo-store-ios/Assets.xcassets/Icons => Core/Resources/Assets.xcassets}/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CartIcon.imageset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CartTab.imageset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CartTab.imageset/cart.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf (100%) rename {demo-store-ios/Assets.xcassets/Logo => Core/Resources/Assets.xcassets/Icons}/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/MainTab.imageset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/MainTab.imageset/home.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf (100%) rename {demo-store-ios/Preview Content/Preview Assets.xcassets => Core/Resources/Assets.xcassets/Logo}/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf (100%) rename {demo-store-ios => Core/Resources}/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf (100%) rename {resources => Core/Resources}/Localizable.xcstrings (100%) rename {demo-store-ios/utils => Core/Utils}/RatingConverter.swift (100%) rename {demo-store-ios/utils => Core/Utils}/RemoteImageLoader.swift (100%) rename {data => Data}/data.h (100%) rename {data => Data}/mappers/RecommendedProductMapper.swift (100%) rename {data => Data}/models/CategoryDto.swift (100%) rename {data => Data}/models/ProductCartItemDto.swift (100%) rename {data => Data}/models/RecommendedProductDto.swift (100%) rename {data => Data}/models/RecommenderResponse.swift (100%) rename {data => Data}/models/SearchResponseDto.swift (100%) rename {common/feature/cart/repository => Feature/Cart/Domain/Repository}/CartRepository.swift (100%) rename {demo-store-ios/features/cart => Feature/Cart/Presentation/View}/CartScreenView.swift (100%) rename {common/feature/cart/presentation => Feature/Cart/Presentation/ViewModel}/CartViewModel.swift (100%) create mode 100644 Feature/Feature.h rename {common/useCases => Feature/Home/Domain/UseCase}/GetRecommendationsUseCase.swift (100%) rename {demo-store-ios/mainSubView => Feature/Home/Presentation/View}/DetailsToolbar.swift (100%) rename {demo-store-ios/features/home/discover => Feature/Home/Presentation/View/Discover}/MainDiscoverView.swift (100%) rename {demo-store-ios/features/home => Feature/Home/Presentation/View}/HomeScreenView.swift (100%) rename {demo-store-ios/features/home/recommendation => Feature/Home/Presentation/View/Recommendation}/FullRecommendationListView.swift (100%) rename {demo-store-ios/features/home/recommendation => Feature/Home/Presentation/View/Recommendation}/ProductListItemView.swift (98%) rename {demo-store-ios/features/home/recommendation => Feature/Home/Presentation/View/Recommendation}/ShortRecommendationListView.swift (100%) rename {demo-store-ios/mainSubView => Feature/Home/Presentation/View}/SectionHeaderView.swift (100%) rename {demo-store-ios/features/home/stories/controller => Feature/Home/Presentation/View/Stories/Controller}/StoriesViewController.swift (100%) rename {demo-store-ios/features/home/stories => Feature/Home/Presentation/View/Stories}/HomeStoriesContainerView.swift (100%) rename {demo-store-ios/mainSubView => Feature/Home/Presentation/View}/ToolbarView.swift (100%) rename {common/feature/home/presentation => Feature/Home/Presentation/ViewModel}/HomeViewModel.swift (100%) rename demo-store-ios/features/catalog/CatalogScreenView.swift => Feature/Product/Presentation/View/ProductsScreenView.swift (99%) rename {demo-store-ios/features/search => Feature/Search/Presentation/View}/SearchResultView.swift (100%) rename {demo-store-ios/features/search => Feature/Search/Presentation/View}/SearchScreenView.swift (100%) rename {common/feature/search/presentation => Feature/Search/Presentation/ViewModel}/SearchViewModel.swift (100%) rename {demo-store-ios/features/settings => Feature/Settings/Presentation/View}/SettingsErrroScreenView.swift (100%) rename {demo-store-ios/features/settings => Feature/Settings/Presentation/View}/SettingsInputCodeView.swift (100%) rename {demo-store-ios/features/settings => Feature/Settings/Presentation/View}/SettingsScreenView.swift (100%) rename demo-store-ios/features/splash/LaunchScreen.swift => Feature/Splash/Presentation/Controller/LaunchScreenController.swift (100%) rename {demo-store-ios/features/splash => Feature/Splash/Presentation}/SplashScreenView.swift (100%) delete mode 100644 common/common.h delete mode 100644 commonTests/commonTests.swift create mode 100644 demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme diff --git a/demo-store-ios/AppDelegate.swift b/App/AppDelegate.swift similarity index 100% rename from demo-store-ios/AppDelegate.swift rename to App/AppDelegate.swift diff --git a/demo-store-ios/ContentView.swift b/App/ContentView.swift similarity index 100% rename from demo-store-ios/ContentView.swift rename to App/ContentView.swift diff --git a/demo-store-ios/DemoStoreApp.swift b/App/DemoStoreApp.swift similarity index 100% rename from demo-store-ios/DemoStoreApp.swift rename to App/DemoStoreApp.swift diff --git a/demo-store-ios/Info.plist b/App/Info.plist similarity index 100% rename from demo-store-ios/Info.plist rename to App/Info.plist diff --git a/demo-store-ios/navigation/NavigationManager.swift b/App/Navigation/Domain/NavigationManager.swift similarity index 98% rename from demo-store-ios/navigation/NavigationManager.swift rename to App/Navigation/Domain/NavigationManager.swift index 5ec2243..b2946df 100644 --- a/demo-store-ios/navigation/NavigationManager.swift +++ b/App/Navigation/Domain/NavigationManager.swift @@ -24,7 +24,7 @@ class NavigationManager: ObservableObject { switch screen { case is HomeScreenView: self.currentScreenType = .main - case is CatalogScreenView: + case is ProductsScreenView: self.currentScreenType = .catalog case is CartScreenView: self.currentScreenType = .cart diff --git a/demo-store-ios/navigation/BottomBarView.swift b/App/Navigation/Presentation/View/BottomBarView.swift similarity index 97% rename from demo-store-ios/navigation/BottomBarView.swift rename to App/Navigation/Presentation/View/BottomBarView.swift index 206d444..c74dfcc 100644 --- a/demo-store-ios/navigation/BottomBarView.swift +++ b/App/Navigation/Presentation/View/BottomBarView.swift @@ -22,7 +22,7 @@ struct BottomBarView: View { TabBarButton(image: "CatalogTab", isSelected: selectedTab == .catalog) .onTapGesture { selectedTab = .catalog - navigationManager.navigateTo(screen: AnyView(CatalogScreenView()), selectedTab: .catalog) + navigationManager.navigateTo(screen: AnyView(ProductsScreenView()), selectedTab: .catalog) } Spacer() diff --git a/demo-store-ios/Assets.xcassets/Contents.json b/App/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Contents.json rename to App/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/demo-store-ios/mainSubView/UiUtils.swift b/App/mainSubView/UiUtils.swift similarity index 100% rename from demo-store-ios/mainSubView/UiUtils.swift rename to App/mainSubView/UiUtils.swift diff --git a/Core/Core.h b/Core/Core.h new file mode 100644 index 0000000..b35997f --- /dev/null +++ b/Core/Core.h @@ -0,0 +1,18 @@ +// +// Core.h +// Core +// +// Created by Daniel Green on 2024-07-18. +// + +#import + +//! Project version number for Core. +FOUNDATION_EXPORT double CoreVersionNumber; + +//! Project version string for Core. +FOUNDATION_EXPORT const unsigned char CoreVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/demo-store-ios/di/SdkManager.swift b/Core/DI/SdkManager.swift similarity index 96% rename from demo-store-ios/di/SdkManager.swift rename to Core/DI/SdkManager.swift index 76202d9..2023e33 100644 --- a/demo-store-ios/di/SdkManager.swift +++ b/Core/DI/SdkManager.swift @@ -35,7 +35,6 @@ class SDKManager { print("SDK Initialization succeeded") if let sessionId = self.sdk?.getSession() { print("SDK Session ID: \(sessionId)") -// self.suggestProducts() } else { print("Failed to retrieve SDK session ID") } diff --git a/demo-store-ios/Assets.xcassets/AccentColor.colorset/Contents.json b/Core/Resources/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/AccentColor.colorset/Contents.json rename to Core/Resources/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/Core/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png similarity index 100% rename from demo-store-ios/Assets.xcassets/AppIcon.appiconset/AppIcon.png rename to Core/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png diff --git a/demo-store-ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/Core/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Core/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/Contents.json b/Core/Resources/Assets.xcassets/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/Contents.json rename to Core/Resources/Assets.xcassets/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Contents.json b/Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Contents.json rename to Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf b/Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf rename to Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf b/Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf rename to Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf b/Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf rename to Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/Contents.json b/Core/Resources/Assets.xcassets/Icons/CartTab.imageset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/Contents.json rename to Core/Resources/Assets.xcassets/Icons/CartTab.imageset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf b/Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf rename to Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf b/Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf rename to Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart.pdf b/Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CartTab.imageset/cart.pdf rename to Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json b/Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json rename to Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf b/Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf rename to Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf b/Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf rename to Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf b/Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf rename to Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf diff --git a/demo-store-ios/Assets.xcassets/Logo/Contents.json b/Core/Resources/Assets.xcassets/Icons/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Logo/Contents.json rename to Core/Resources/Assets.xcassets/Icons/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/Contents.json b/Core/Resources/Assets.xcassets/Icons/MainTab.imageset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/Contents.json rename to Core/Resources/Assets.xcassets/Icons/MainTab.imageset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf b/Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf rename to Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf b/Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf rename to Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home.pdf b/Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/MainTab.imageset/home.pdf rename to Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json b/Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json rename to Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf b/Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf rename to Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf b/Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf rename to Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf b/Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf rename to Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json b/Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json rename to Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf b/Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf rename to Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf b/Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf rename to Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf b/Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf rename to Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json b/Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json rename to Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf b/Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf rename to Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf b/Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf rename to Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf diff --git a/demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf b/Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf rename to Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf diff --git a/demo-store-ios/Preview Content/Preview Assets.xcassets/Contents.json b/Core/Resources/Assets.xcassets/Logo/Contents.json similarity index 100% rename from demo-store-ios/Preview Content/Preview Assets.xcassets/Contents.json rename to Core/Resources/Assets.xcassets/Logo/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json b/Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json rename to Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf b/Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf rename to Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf diff --git a/demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf b/Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf rename to Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf diff --git a/demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf b/Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf rename to Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf diff --git a/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json b/Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json similarity index 100% rename from demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json rename to Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json diff --git a/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf b/Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf rename to Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf diff --git a/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf b/Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf rename to Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf diff --git a/demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf b/Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf similarity index 100% rename from demo-store-ios/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf rename to Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf diff --git a/resources/Localizable.xcstrings b/Core/Resources/Localizable.xcstrings similarity index 100% rename from resources/Localizable.xcstrings rename to Core/Resources/Localizable.xcstrings diff --git a/demo-store-ios/utils/RatingConverter.swift b/Core/Utils/RatingConverter.swift similarity index 100% rename from demo-store-ios/utils/RatingConverter.swift rename to Core/Utils/RatingConverter.swift diff --git a/demo-store-ios/utils/RemoteImageLoader.swift b/Core/Utils/RemoteImageLoader.swift similarity index 100% rename from demo-store-ios/utils/RemoteImageLoader.swift rename to Core/Utils/RemoteImageLoader.swift diff --git a/data/data.h b/Data/data.h similarity index 100% rename from data/data.h rename to Data/data.h diff --git a/data/mappers/RecommendedProductMapper.swift b/Data/mappers/RecommendedProductMapper.swift similarity index 100% rename from data/mappers/RecommendedProductMapper.swift rename to Data/mappers/RecommendedProductMapper.swift diff --git a/data/models/CategoryDto.swift b/Data/models/CategoryDto.swift similarity index 100% rename from data/models/CategoryDto.swift rename to Data/models/CategoryDto.swift diff --git a/data/models/ProductCartItemDto.swift b/Data/models/ProductCartItemDto.swift similarity index 100% rename from data/models/ProductCartItemDto.swift rename to Data/models/ProductCartItemDto.swift diff --git a/data/models/RecommendedProductDto.swift b/Data/models/RecommendedProductDto.swift similarity index 100% rename from data/models/RecommendedProductDto.swift rename to Data/models/RecommendedProductDto.swift diff --git a/data/models/RecommenderResponse.swift b/Data/models/RecommenderResponse.swift similarity index 100% rename from data/models/RecommenderResponse.swift rename to Data/models/RecommenderResponse.swift diff --git a/data/models/SearchResponseDto.swift b/Data/models/SearchResponseDto.swift similarity index 100% rename from data/models/SearchResponseDto.swift rename to Data/models/SearchResponseDto.swift diff --git a/common/feature/cart/repository/CartRepository.swift b/Feature/Cart/Domain/Repository/CartRepository.swift similarity index 100% rename from common/feature/cart/repository/CartRepository.swift rename to Feature/Cart/Domain/Repository/CartRepository.swift diff --git a/demo-store-ios/features/cart/CartScreenView.swift b/Feature/Cart/Presentation/View/CartScreenView.swift similarity index 100% rename from demo-store-ios/features/cart/CartScreenView.swift rename to Feature/Cart/Presentation/View/CartScreenView.swift diff --git a/common/feature/cart/presentation/CartViewModel.swift b/Feature/Cart/Presentation/ViewModel/CartViewModel.swift similarity index 100% rename from common/feature/cart/presentation/CartViewModel.swift rename to Feature/Cart/Presentation/ViewModel/CartViewModel.swift diff --git a/Feature/Feature.h b/Feature/Feature.h new file mode 100644 index 0000000..c766412 --- /dev/null +++ b/Feature/Feature.h @@ -0,0 +1,18 @@ +// +// Feature.h +// Feature +// +// Created by Daniel Green on 2024-07-18. +// + +#import + +//! Project version number for Feature. +FOUNDATION_EXPORT double FeatureVersionNumber; + +//! Project version string for Feature. +FOUNDATION_EXPORT const unsigned char FeatureVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/common/useCases/GetRecommendationsUseCase.swift b/Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift similarity index 100% rename from common/useCases/GetRecommendationsUseCase.swift rename to Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift diff --git a/demo-store-ios/mainSubView/DetailsToolbar.swift b/Feature/Home/Presentation/View/DetailsToolbar.swift similarity index 100% rename from demo-store-ios/mainSubView/DetailsToolbar.swift rename to Feature/Home/Presentation/View/DetailsToolbar.swift diff --git a/demo-store-ios/features/home/discover/MainDiscoverView.swift b/Feature/Home/Presentation/View/Discover/MainDiscoverView.swift similarity index 100% rename from demo-store-ios/features/home/discover/MainDiscoverView.swift rename to Feature/Home/Presentation/View/Discover/MainDiscoverView.swift diff --git a/demo-store-ios/features/home/HomeScreenView.swift b/Feature/Home/Presentation/View/HomeScreenView.swift similarity index 100% rename from demo-store-ios/features/home/HomeScreenView.swift rename to Feature/Home/Presentation/View/HomeScreenView.swift diff --git a/demo-store-ios/features/home/recommendation/FullRecommendationListView.swift b/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift similarity index 100% rename from demo-store-ios/features/home/recommendation/FullRecommendationListView.swift rename to Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift diff --git a/demo-store-ios/features/home/recommendation/ProductListItemView.swift b/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift similarity index 98% rename from demo-store-ios/features/home/recommendation/ProductListItemView.swift rename to Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift index f07484a..60ee5a3 100644 --- a/demo-store-ios/features/home/recommendation/ProductListItemView.swift +++ b/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift @@ -72,7 +72,7 @@ struct ProductListItemView: View { .onTapGesture { navigationManager.navigateTo( screen: AnyView( - CatalogScreenView( + ProductsScreenView( product: product ) ), diff --git a/demo-store-ios/features/home/recommendation/ShortRecommendationListView.swift b/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift similarity index 100% rename from demo-store-ios/features/home/recommendation/ShortRecommendationListView.swift rename to Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift diff --git a/demo-store-ios/mainSubView/SectionHeaderView.swift b/Feature/Home/Presentation/View/SectionHeaderView.swift similarity index 100% rename from demo-store-ios/mainSubView/SectionHeaderView.swift rename to Feature/Home/Presentation/View/SectionHeaderView.swift diff --git a/demo-store-ios/features/home/stories/controller/StoriesViewController.swift b/Feature/Home/Presentation/View/Stories/Controller/StoriesViewController.swift similarity index 100% rename from demo-store-ios/features/home/stories/controller/StoriesViewController.swift rename to Feature/Home/Presentation/View/Stories/Controller/StoriesViewController.swift diff --git a/demo-store-ios/features/home/stories/HomeStoriesContainerView.swift b/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift similarity index 100% rename from demo-store-ios/features/home/stories/HomeStoriesContainerView.swift rename to Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift diff --git a/demo-store-ios/mainSubView/ToolbarView.swift b/Feature/Home/Presentation/View/ToolbarView.swift similarity index 100% rename from demo-store-ios/mainSubView/ToolbarView.swift rename to Feature/Home/Presentation/View/ToolbarView.swift diff --git a/common/feature/home/presentation/HomeViewModel.swift b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift similarity index 100% rename from common/feature/home/presentation/HomeViewModel.swift rename to Feature/Home/Presentation/ViewModel/HomeViewModel.swift diff --git a/demo-store-ios/features/catalog/CatalogScreenView.swift b/Feature/Product/Presentation/View/ProductsScreenView.swift similarity index 99% rename from demo-store-ios/features/catalog/CatalogScreenView.swift rename to Feature/Product/Presentation/View/ProductsScreenView.swift index e3b85d3..324ae81 100644 --- a/demo-store-ios/features/catalog/CatalogScreenView.swift +++ b/Feature/Product/Presentation/View/ProductsScreenView.swift @@ -1,6 +1,6 @@ import SwiftUI -struct CatalogScreenView: View { +struct ProductsScreenView: View { var product: RecommendedProduct? @EnvironmentObject var navigationManager: NavigationManager diff --git a/demo-store-ios/features/search/SearchResultView.swift b/Feature/Search/Presentation/View/SearchResultView.swift similarity index 100% rename from demo-store-ios/features/search/SearchResultView.swift rename to Feature/Search/Presentation/View/SearchResultView.swift diff --git a/demo-store-ios/features/search/SearchScreenView.swift b/Feature/Search/Presentation/View/SearchScreenView.swift similarity index 100% rename from demo-store-ios/features/search/SearchScreenView.swift rename to Feature/Search/Presentation/View/SearchScreenView.swift diff --git a/common/feature/search/presentation/SearchViewModel.swift b/Feature/Search/Presentation/ViewModel/SearchViewModel.swift similarity index 100% rename from common/feature/search/presentation/SearchViewModel.swift rename to Feature/Search/Presentation/ViewModel/SearchViewModel.swift diff --git a/demo-store-ios/features/settings/SettingsErrroScreenView.swift b/Feature/Settings/Presentation/View/SettingsErrroScreenView.swift similarity index 100% rename from demo-store-ios/features/settings/SettingsErrroScreenView.swift rename to Feature/Settings/Presentation/View/SettingsErrroScreenView.swift diff --git a/demo-store-ios/features/settings/SettingsInputCodeView.swift b/Feature/Settings/Presentation/View/SettingsInputCodeView.swift similarity index 100% rename from demo-store-ios/features/settings/SettingsInputCodeView.swift rename to Feature/Settings/Presentation/View/SettingsInputCodeView.swift diff --git a/demo-store-ios/features/settings/SettingsScreenView.swift b/Feature/Settings/Presentation/View/SettingsScreenView.swift similarity index 100% rename from demo-store-ios/features/settings/SettingsScreenView.swift rename to Feature/Settings/Presentation/View/SettingsScreenView.swift diff --git a/demo-store-ios/features/splash/LaunchScreen.swift b/Feature/Splash/Presentation/Controller/LaunchScreenController.swift similarity index 100% rename from demo-store-ios/features/splash/LaunchScreen.swift rename to Feature/Splash/Presentation/Controller/LaunchScreenController.swift diff --git a/demo-store-ios/features/splash/SplashScreenView.swift b/Feature/Splash/Presentation/SplashScreenView.swift similarity index 100% rename from demo-store-ios/features/splash/SplashScreenView.swift rename to Feature/Splash/Presentation/SplashScreenView.swift diff --git a/common/common.h b/common/common.h deleted file mode 100644 index d837ac7..0000000 --- a/common/common.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// common.h -// common -// -// Created by Daniel Green on 2024-07-16. -// - -#import - -//! Project version number for common. -FOUNDATION_EXPORT double commonVersionNumber; - -//! Project version string for common. -FOUNDATION_EXPORT const unsigned char commonVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/commonTests/commonTests.swift b/commonTests/commonTests.swift deleted file mode 100644 index ab94c1f..0000000 --- a/commonTests/commonTests.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// commonTests.swift -// commonTests -// -// Created by Daniel Green on 2024-07-16. -// - -import XCTest -@testable import common - -final class commonTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - // Any test you write for XCTest can be annotated as throws and async. - // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. - // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. - } - - func testPerformanceExample() throws { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 24cc0a5..551b45f 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -18,14 +18,11 @@ 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.swift */; }; 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */; }; 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */; }; - 752F1D792C46F493002D4AC3 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 752F1D782C46F493002D4AC3 /* common.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 752F1D7C2C46F493002D4AC3 /* common.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D762C46F493002D4AC3 /* common.framework */; }; - 752F1D7D2C46F493002D4AC3 /* common.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D762C46F493002D4AC3 /* common.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 752F1D8F2C46F5D7002D4AC3 /* data.h in Headers */ = {isa = PBXBuildFile; fileRef = 752F1D8E2C46F5D7002D4AC3 /* data.h */; settings = {ATTRIBUTES = (Public, ); }; }; 752F1D922C46F5D7002D4AC3 /* data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D8C2C46F5D7002D4AC3 /* data.framework */; }; 752F1D932C46F5D7002D4AC3 /* data.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D8C2C46F5D7002D4AC3 /* data.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; - 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreen.swift */; }; + 755944A12C35822700C274C9 /* LaunchScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreenController.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */; }; 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE52C3D295F007FAB88 /* SdkManager.swift */; }; @@ -53,8 +50,14 @@ 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */; }; 75E1C8ED2C3EACDA005018B4 /* DetailsToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */; }; 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */; }; + 75E979862C4935170081B069 /* Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 75E979852C4935170081B069 /* Core.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75E979892C4935170081B069 /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979832C4935170081B069 /* Core.framework */; }; + 75E9798A2C4935170081B069 /* Core.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979832C4935170081B069 /* Core.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 75E979962C49561B0081B069 /* Feature.h in Headers */ = {isa = PBXBuildFile; fileRef = 75E979952C49561B0081B069 /* Feature.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75E979992C49561B0081B069 /* Feature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979932C49561B0081B069 /* Feature.framework */; }; + 75E9799A2C49561B0081B069 /* Feature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979932C49561B0081B069 /* Feature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */; }; - 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */; }; + 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */; }; 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */; }; @@ -62,13 +65,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 752F1D7A2C46F493002D4AC3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 75B9354B2C3564360063E814 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 752F1D752C46F493002D4AC3; - remoteInfo = common; - }; 752F1D902C46F5D7002D4AC3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 75B9354B2C3564360063E814 /* Project object */; @@ -90,6 +86,20 @@ remoteGlobalIDString = 75B935522C3564360063E814; remoteInfo = "demo-store-ios"; }; + 75E979872C4935170081B069 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75B9354B2C3564360063E814 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 75E979822C4935170081B069; + remoteInfo = Core; + }; + 75E979972C49561B0081B069 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 75B9354B2C3564360063E814 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 75E979922C49561B0081B069; + remoteInfo = Feature; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -100,7 +110,8 @@ dstSubfolderSpec = 10; files = ( 752F1D932C46F5D7002D4AC3 /* data.framework in Embed Frameworks */, - 752F1D7D2C46F493002D4AC3 /* common.framework in Embed Frameworks */, + 75E9799A2C49561B0081B069 /* Feature.framework in Embed Frameworks */, + 75E9798A2C4935170081B069 /* Core.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -119,13 +130,10 @@ 752F1D482C459680002D4AC3 /* SearchScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.swift; sourceTree = ""; }; 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResponseDto.swift; sourceTree = ""; }; 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; - 752F1D632C46F411002D4AC3 /* commonTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = commonTests.swift; sourceTree = ""; }; - 752F1D762C46F493002D4AC3 /* common.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = common.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 752F1D782C46F493002D4AC3 /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; 752F1D8C2C46F5D7002D4AC3 /* data.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = data.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 752F1D8E2C46F5D7002D4AC3 /* data.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = data.h; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; - 755944A02C35822700C274C9 /* LaunchScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreen.swift; sourceTree = ""; }; + 755944A02C35822700C274C9 /* LaunchScreenController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreenController.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStoriesContainerView.swift; sourceTree = ""; }; 75674CE52C3D295F007FAB88 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; @@ -157,8 +165,12 @@ 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.swift; sourceTree = ""; }; 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbar.swift; sourceTree = ""; }; 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.swift; sourceTree = ""; }; + 75E979832C4935170081B069 /* Core.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Core.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 75E979852C4935170081B069 /* Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Core.h; sourceTree = ""; }; + 75E979932C49561B0081B069 /* Feature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Feature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 75E979952C49561B0081B069 /* Feature.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Feature.h; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; - 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CatalogScreenView.swift; sourceTree = ""; }; + 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenView.swift; sourceTree = ""; }; 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; @@ -172,13 +184,6 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 752F1D732C46F493002D4AC3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 752F1D892C46F5D7002D4AC3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -192,7 +197,8 @@ files = ( 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */, 752F1D922C46F5D7002D4AC3 /* data.framework in Frameworks */, - 752F1D7C2C46F493002D4AC3 /* common.framework in Frameworks */, + 75E979992C49561B0081B069 /* Feature.framework in Frameworks */, + 75E979892C4935170081B069 /* Core.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -212,363 +218,498 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 75E979802C4935170081B069 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75E979902C49561B0081B069 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 752F1D3D2C41E1C6002D4AC3 /* presentation */ = { + 752F1D8D2C46F5D7002D4AC3 /* Data */ = { isa = PBXGroup; children = ( - 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */, + 75674CFA2C3D9957007FAB88 /* mappers */, + 75674CF32C3D92B0007FAB88 /* models */, + 752F1D8E2C46F5D7002D4AC3 /* data.h */, ); - path = presentation; + path = Data; sourceTree = ""; }; - 752F1D3E2C41E5AC002D4AC3 /* repository */ = { + 75674CEA2C3D2E32007FAB88 /* Stories */ = { isa = PBXGroup; children = ( - 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */, + 75674CED2C3D39E8007FAB88 /* Controller */, + 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */, ); - path = repository; + path = Stories; sourceTree = ""; }; - 752F1D412C457790002D4AC3 /* useCases */ = { + 75674CEC2C3D2E45007FAB88 /* Discover */ = { isa = PBXGroup; children = ( - 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */, + 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */, ); - path = useCases; + path = Discover; sourceTree = ""; }; - 752F1D442C45952C002D4AC3 /* search */ = { + 75674CED2C3D39E8007FAB88 /* Controller */ = { isa = PBXGroup; children = ( - 752F1D482C459680002D4AC3 /* SearchScreenView.swift */, - 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */, + 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */, ); - path = search; + path = Controller; sourceTree = ""; }; - 752F1D452C459539002D4AC3 /* presentation */ = { + 75674CF02C3D787A007FAB88 /* Recommendation */ = { isa = PBXGroup; children = ( - 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */, + 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */, + 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */, + 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */, ); - path = presentation; + path = Recommendation; sourceTree = ""; }; - 752F1D622C46F411002D4AC3 /* commonTests */ = { + 75674CF32C3D92B0007FAB88 /* models */ = { isa = PBXGroup; children = ( - 752F1D632C46F411002D4AC3 /* commonTests.swift */, + 75674CF42C3D92CC007FAB88 /* CategoryDto.swift */, + 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */, + 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */, + 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */, ); - path = commonTests; + path = models; sourceTree = ""; }; - 752F1D772C46F493002D4AC3 /* common */ = { + 75674CFA2C3D9957007FAB88 /* mappers */ = { isa = PBXGroup; children = ( - 752F1D412C457790002D4AC3 /* useCases */, - 752F1D812C46F4B1002D4AC3 /* feature */, - 752F1D782C46F493002D4AC3 /* common.h */, + 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */, ); - path = common; + path = mappers; sourceTree = ""; }; - 752F1D812C46F4B1002D4AC3 /* feature */ = { + 75674CFF2C3DA0EC007FAB88 /* Utils */ = { isa = PBXGroup; children = ( - 752F1D862C46F503002D4AC3 /* catalog */, - 752F1D852C46F4FD002D4AC3 /* search */, - 752F1D842C46F4F7002D4AC3 /* settings */, - 752F1D832C46F4F2002D4AC3 /* cart */, - 752F1D822C46F4EB002D4AC3 /* home */, + 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */, + 75674D022C3DA14F007FAB88 /* RatingConverter.swift */, ); - path = feature; + path = Utils; sourceTree = ""; }; - 752F1D822C46F4EB002D4AC3 /* home */ = { + 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( - 75674CE92C3D29BF007FAB88 /* presentation */, + 75E979842C4935170081B069 /* Core */, + 75B935552C3564360063E814 /* App */, + 75E979942C49561B0081B069 /* Feature */, + 752F1D8D2C46F5D7002D4AC3 /* Data */, + 75B935662C3564370063E814 /* demo-store-iosTests */, + 75B935702C3564370063E814 /* demo-store-iosUITests */, + 75B935542C3564360063E814 /* Products */, + 8FED5CC7CDC6607CEFB8FDC9 /* Pods */, + ECE8154AB54931A903490932 /* Frameworks */, ); - path = home; sourceTree = ""; }; - 752F1D832C46F4F2002D4AC3 /* cart */ = { + 75B935542C3564360063E814 /* Products */ = { isa = PBXGroup; children = ( - 752F1D3D2C41E1C6002D4AC3 /* presentation */, - 752F1D3E2C41E5AC002D4AC3 /* repository */, + 75B935532C3564360063E814 /* demo-store-ios.app */, + 75B935632C3564370063E814 /* demo-store-iosTests.xctest */, + 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */, + 752F1D8C2C46F5D7002D4AC3 /* data.framework */, + 75E979832C4935170081B069 /* Core.framework */, + 75E979932C49561B0081B069 /* Feature.framework */, ); - path = cart; + name = Products; sourceTree = ""; }; - 752F1D842C46F4F7002D4AC3 /* settings */ = { + 75B935552C3564360063E814 /* App */ = { isa = PBXGroup; children = ( + 75A3F4212C3828A400AAC175 /* Info.plist */, + 75ECCD182C36F92A00D6D346 /* Navigation */, + 75B935562C3564360063E814 /* DemoStoreApp.swift */, + 75A3F41D2C38065000AAC175 /* AppDelegate.swift */, + 75B935582C3564360063E814 /* ContentView.swift */, + 75B9355C2C3564370063E814 /* Preview Content */, ); - path = settings; + path = App; sourceTree = ""; }; - 752F1D852C46F4FD002D4AC3 /* search */ = { + 75B9355C2C3564370063E814 /* Preview Content */ = { isa = PBXGroup; children = ( - 752F1D452C459539002D4AC3 /* presentation */, + 75B9355D2C3564370063E814 /* Preview Assets.xcassets */, ); - path = search; + path = "Preview Content"; sourceTree = ""; }; - 752F1D862C46F503002D4AC3 /* catalog */ = { + 75B935662C3564370063E814 /* demo-store-iosTests */ = { isa = PBXGroup; children = ( + 75B935672C3564370063E814 /* DemoStoreTests.swift */, ); - path = catalog; + path = "demo-store-iosTests"; sourceTree = ""; }; - 752F1D8D2C46F5D7002D4AC3 /* data */ = { + 75B935702C3564370063E814 /* demo-store-iosUITests */ = { isa = PBXGroup; children = ( - 75674CFA2C3D9957007FAB88 /* mappers */, - 75674CF32C3D92B0007FAB88 /* models */, - 752F1D8E2C46F5D7002D4AC3 /* data.h */, + 75B935712C3564370063E814 /* DemoStoreUITests.swift */, + 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */, ); - path = data; + path = "demo-store-iosUITests"; sourceTree = ""; }; - 7559449C2C357E1800C274C9 /* features */ = { + 75E979842C4935170081B069 /* Core */ = { isa = PBXGroup; children = ( - 752F1D442C45952C002D4AC3 /* search */, - 75ECCD0E2C36BE1000D6D346 /* settings */, - 75ECCD0D2C36BE0600D6D346 /* cart */, - 75ECCD0C2C36BDFF00D6D346 /* catalog */, - 755944A22C35858C00C274C9 /* home */, - 7559449D2C357E4300C274C9 /* splash */, - ); - path = features; + 75ECCD1B2C37F09100D6D346 /* DI */, + 75674CFF2C3DA0EC007FAB88 /* Utils */, + 75ECCD152C36D6B400D6D346 /* Resources */, + 75E979852C4935170081B069 /* Core.h */, + ); + path = Core; sourceTree = ""; }; - 7559449D2C357E4300C274C9 /* splash */ = { + 75E979942C49561B0081B069 /* Feature */ = { isa = PBXGroup; children = ( - 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */, - 755944A02C35822700C274C9 /* LaunchScreen.swift */, + 75E979AB2C4957720081B069 /* Splash */, + 75E979A62C4956CD0081B069 /* Search */, + 75E9799E2C4956400081B069 /* Home */, + 75E9799F2C4956470081B069 /* Product */, + 75E979A02C4956520081B069 /* Cart */, + 75E979A12C4956580081B069 /* Settings */, + 75E979952C49561B0081B069 /* Feature.h */, + ); + path = Feature; + sourceTree = ""; + }; + 75E9799E2C4956400081B069 /* Home */ = { + isa = PBXGroup; + children = ( + 75E979A52C4956A30081B069 /* Presentation */, + 75E979A42C49569D0081B069 /* Domain */, + 75E979A32C4956900081B069 /* Data */, + 75E979A22C49568B0081B069 /* DI */, ); - path = splash; + path = Home; sourceTree = ""; }; - 755944A22C35858C00C274C9 /* home */ = { + 75E9799F2C4956470081B069 /* Product */ = { isa = PBXGroup; children = ( - 75674CF02C3D787A007FAB88 /* recommendation */, - 75674CEC2C3D2E45007FAB88 /* discover */, - 75674CEA2C3D2E32007FAB88 /* stories */, - 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */, + 75E979BC2C4959F50081B069 /* Presentation */, ); - path = home; + path = Product; sourceTree = ""; }; - 755944A32C35883F00C274C9 /* mainSubView */ = { + 75E979A02C4956520081B069 /* Cart */ = { isa = PBXGroup; children = ( - 75A3F4282C38593800AAC175 /* ToolbarView.swift */, - 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */, - 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */, + 75E979B22C4958A90081B069 /* Presentation */, + 75E979B52C4958F20081B069 /* Domain */, ); - path = mainSubView; + path = Cart; sourceTree = ""; }; - 75674CE92C3D29BF007FAB88 /* presentation */ = { + 75E979A12C4956580081B069 /* Settings */ = { isa = PBXGroup; children = ( - 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */, + 75E979BE2C495A130081B069 /* Presentation */, ); - path = presentation; + path = Settings; sourceTree = ""; }; - 75674CEA2C3D2E32007FAB88 /* stories */ = { + 75E979A22C49568B0081B069 /* DI */ = { isa = PBXGroup; children = ( - 75674CED2C3D39E8007FAB88 /* controller */, - 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */, ); - path = stories; + path = DI; sourceTree = ""; }; - 75674CEC2C3D2E45007FAB88 /* discover */ = { + 75E979A32C4956900081B069 /* Data */ = { isa = PBXGroup; children = ( - 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */, ); - path = discover; + path = Data; sourceTree = ""; }; - 75674CED2C3D39E8007FAB88 /* controller */ = { + 75E979A42C49569D0081B069 /* Domain */ = { isa = PBXGroup; children = ( - 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */, + 75E979B12C4958850081B069 /* UseCase */, ); - path = controller; + path = Domain; sourceTree = ""; }; - 75674CF02C3D787A007FAB88 /* recommendation */ = { + 75E979A52C4956A30081B069 /* Presentation */ = { isa = PBXGroup; children = ( - 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */, - 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */, - 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */, + 75E979B82C49593E0081B069 /* ViewModel */, + 75E979B72C4959250081B069 /* View */, ); - path = recommendation; + path = Presentation; sourceTree = ""; }; - 75674CF32C3D92B0007FAB88 /* models */ = { + 75E979A62C4956CD0081B069 /* Search */ = { isa = PBXGroup; children = ( - 75674CF42C3D92CC007FAB88 /* CategoryDto.swift */, - 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */, - 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */, - 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */, + 75E979AA2C4956F30081B069 /* Presentation */, + 75E979A92C4956EE0081B069 /* Domain */, + 75E979A82C4956E60081B069 /* Data */, + 75E979A72C4956DE0081B069 /* DI */, ); - path = models; + path = Search; sourceTree = ""; }; - 75674CFA2C3D9957007FAB88 /* mappers */ = { + 75E979A72C4956DE0081B069 /* DI */ = { isa = PBXGroup; children = ( - 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */, ); - path = mappers; + path = DI; sourceTree = ""; }; - 75674CFF2C3DA0EC007FAB88 /* utils */ = { + 75E979A82C4956E60081B069 /* Data */ = { isa = PBXGroup; children = ( - 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */, - 75674D022C3DA14F007FAB88 /* RatingConverter.swift */, ); - path = utils; + path = Data; sourceTree = ""; }; - 75B9354A2C3564360063E814 = { + 75E979A92C4956EE0081B069 /* Domain */ = { isa = PBXGroup; children = ( - 75ECCD152C36D6B400D6D346 /* resources */, - 75B935552C3564360063E814 /* demo-store-ios */, - 75B935662C3564370063E814 /* demo-store-iosTests */, - 75B935702C3564370063E814 /* demo-store-iosUITests */, - 752F1D622C46F411002D4AC3 /* commonTests */, - 752F1D772C46F493002D4AC3 /* common */, - 752F1D8D2C46F5D7002D4AC3 /* data */, - 75B935542C3564360063E814 /* Products */, - 8FED5CC7CDC6607CEFB8FDC9 /* Pods */, - ECE8154AB54931A903490932 /* Frameworks */, ); + path = Domain; sourceTree = ""; }; - 75B935542C3564360063E814 /* Products */ = { + 75E979AA2C4956F30081B069 /* Presentation */ = { isa = PBXGroup; children = ( - 75B935532C3564360063E814 /* demo-store-ios.app */, - 75B935632C3564370063E814 /* demo-store-iosTests.xctest */, - 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */, - 752F1D762C46F493002D4AC3 /* common.framework */, - 752F1D8C2C46F5D7002D4AC3 /* data.framework */, + 75E979B02C4958720081B069 /* ViewModel */, + 75E979AF2C49586D0081B069 /* View */, ); - name = Products; + path = Presentation; sourceTree = ""; }; - 75B935552C3564360063E814 /* demo-store-ios */ = { + 75E979AB2C4957720081B069 /* Splash */ = { isa = PBXGroup; children = ( - 75674CFF2C3DA0EC007FAB88 /* utils */, - 75A3F4212C3828A400AAC175 /* Info.plist */, - 75ECCD1B2C37F09100D6D346 /* di */, - 75ECCD182C36F92A00D6D346 /* navigation */, - 755944A32C35883F00C274C9 /* mainSubView */, - 7559449C2C357E1800C274C9 /* features */, - 75B935562C3564360063E814 /* DemoStoreApp.swift */, - 75A3F41D2C38065000AAC175 /* AppDelegate.swift */, - 75B935582C3564360063E814 /* ContentView.swift */, - 75B9355A2C3564370063E814 /* Assets.xcassets */, - 75B9355C2C3564370063E814 /* Preview Content */, + 75E979AD2C4957960081B069 /* Presentation */, + 75E979AC2C4957910081B069 /* DI */, ); - path = "demo-store-ios"; + path = Splash; sourceTree = ""; }; - 75B9355C2C3564370063E814 /* Preview Content */ = { + 75E979AC2C4957910081B069 /* DI */ = { isa = PBXGroup; children = ( - 75B9355D2C3564370063E814 /* Preview Assets.xcassets */, ); - path = "Preview Content"; + path = DI; sourceTree = ""; }; - 75B935662C3564370063E814 /* demo-store-iosTests */ = { + 75E979AD2C4957960081B069 /* Presentation */ = { isa = PBXGroup; children = ( - 75B935672C3564370063E814 /* DemoStoreTests.swift */, + 75E979AE2C4957F30081B069 /* Controller */, + 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */, ); - path = "demo-store-iosTests"; + path = Presentation; sourceTree = ""; }; - 75B935702C3564370063E814 /* demo-store-iosUITests */ = { + 75E979AE2C4957F30081B069 /* Controller */ = { isa = PBXGroup; children = ( - 75B935712C3564370063E814 /* DemoStoreUITests.swift */, - 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */, + 755944A02C35822700C274C9 /* LaunchScreenController.swift */, ); - path = "demo-store-iosUITests"; + path = Controller; sourceTree = ""; }; - 75ECCD0C2C36BDFF00D6D346 /* catalog */ = { + 75E979AF2C49586D0081B069 /* View */ = { isa = PBXGroup; children = ( - 75ECCD0F2C36BE2000D6D346 /* CatalogScreenView.swift */, + 752F1D482C459680002D4AC3 /* SearchScreenView.swift */, + 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */, + ); + path = View; + sourceTree = ""; + }; + 75E979B02C4958720081B069 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 75E979B12C4958850081B069 /* UseCase */ = { + isa = PBXGroup; + children = ( + 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */, + ); + path = UseCase; + sourceTree = ""; + }; + 75E979B22C4958A90081B069 /* Presentation */ = { + isa = PBXGroup; + children = ( + 75E979B42C4958BB0081B069 /* ViewModel */, + 75E979B32C4958B20081B069 /* View */, ); - path = catalog; + path = Presentation; sourceTree = ""; }; - 75ECCD0D2C36BE0600D6D346 /* cart */ = { + 75E979B32C4958B20081B069 /* View */ = { isa = PBXGroup; children = ( 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, ); - path = cart; + path = View; + sourceTree = ""; + }; + 75E979B42C4958BB0081B069 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 75E979B52C4958F20081B069 /* Domain */ = { + isa = PBXGroup; + children = ( + 75E979B62C4958FD0081B069 /* Repository */, + ); + path = Domain; + sourceTree = ""; + }; + 75E979B62C4958FD0081B069 /* Repository */ = { + isa = PBXGroup; + children = ( + 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */, + ); + path = Repository; + sourceTree = ""; + }; + 75E979B72C4959250081B069 /* View */ = { + isa = PBXGroup; + children = ( + 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */, + 75A3F4282C38593800AAC175 /* ToolbarView.swift */, + 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */, + 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */, + 75674CEA2C3D2E32007FAB88 /* Stories */, + 75674CF02C3D787A007FAB88 /* Recommendation */, + 75674CEC2C3D2E45007FAB88 /* Discover */, + ); + path = View; + sourceTree = ""; + }; + 75E979B82C49593E0081B069 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 75E979B92C4959710081B069 /* Presentation */ = { + isa = PBXGroup; + children = ( + 75E979BA2C4959790081B069 /* View */, + ); + path = Presentation; + sourceTree = ""; + }; + 75E979BA2C4959790081B069 /* View */ = { + isa = PBXGroup; + children = ( + 75ECCD192C36F94800D6D346 /* BottomBarView.swift */, + ); + path = View; + sourceTree = ""; + }; + 75E979BB2C4959850081B069 /* Domain */ = { + isa = PBXGroup; + children = ( + 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */, + ); + path = Domain; + sourceTree = ""; + }; + 75E979BC2C4959F50081B069 /* Presentation */ = { + isa = PBXGroup; + children = ( + 75E979BD2C4959FC0081B069 /* View */, + ); + path = Presentation; + sourceTree = ""; + }; + 75E979BD2C4959FC0081B069 /* View */ = { + isa = PBXGroup; + children = ( + 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */, + ); + path = View; + sourceTree = ""; + }; + 75E979BE2C495A130081B069 /* Presentation */ = { + isa = PBXGroup; + children = ( + 75E979BF2C495A1B0081B069 /* View */, + ); + path = Presentation; sourceTree = ""; }; - 75ECCD0E2C36BE1000D6D346 /* settings */ = { + 75E979BF2C495A1B0081B069 /* View */ = { isa = PBXGroup; children = ( 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */, 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */, 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */, ); - path = settings; + path = View; sourceTree = ""; }; - 75ECCD152C36D6B400D6D346 /* resources */ = { + 75ECCD152C36D6B400D6D346 /* Resources */ = { isa = PBXGroup; children = ( + 75B9355A2C3564370063E814 /* Assets.xcassets */, 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */, ); - path = resources; + path = Resources; sourceTree = ""; }; - 75ECCD182C36F92A00D6D346 /* navigation */ = { + 75ECCD182C36F92A00D6D346 /* Navigation */ = { isa = PBXGroup; children = ( - 75ECCD192C36F94800D6D346 /* BottomBarView.swift */, - 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */, + 75E979BB2C4959850081B069 /* Domain */, + 75E979B92C4959710081B069 /* Presentation */, ); - path = navigation; + path = Navigation; sourceTree = ""; }; - 75ECCD1B2C37F09100D6D346 /* di */ = { + 75ECCD1B2C37F09100D6D346 /* DI */ = { isa = PBXGroup; children = ( 75674CE52C3D295F007FAB88 /* SdkManager.swift */, ); - path = di; + path = DI; sourceTree = ""; }; 8FED5CC7CDC6607CEFB8FDC9 /* Pods */ = { @@ -597,43 +738,33 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 752F1D712C46F493002D4AC3 /* Headers */ = { + 752F1D872C46F5D7002D4AC3 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 752F1D792C46F493002D4AC3 /* common.h in Headers */, + 752F1D8F2C46F5D7002D4AC3 /* data.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 752F1D872C46F5D7002D4AC3 /* Headers */ = { + 75E9797E2C4935170081B069 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 752F1D8F2C46F5D7002D4AC3 /* data.h in Headers */, + 75E979862C4935170081B069 /* Core.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75E9798E2C49561B0081B069 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 75E979962C49561B0081B069 /* Feature.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 752F1D752C46F493002D4AC3 /* common */ = { - isa = PBXNativeTarget; - buildConfigurationList = 752F1D7E2C46F493002D4AC3 /* Build configuration list for PBXNativeTarget "common" */; - buildPhases = ( - 752F1D712C46F493002D4AC3 /* Headers */, - 752F1D722C46F493002D4AC3 /* Sources */, - 752F1D732C46F493002D4AC3 /* Frameworks */, - 752F1D742C46F493002D4AC3 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = common; - productName = common; - productReference = 752F1D762C46F493002D4AC3 /* common.framework */; - productType = "com.apple.product-type.framework"; - }; 752F1D8B2C46F5D7002D4AC3 /* data */ = { isa = PBXNativeTarget; buildConfigurationList = 752F1D942C46F5D7002D4AC3 /* Build configuration list for PBXNativeTarget "data" */; @@ -666,8 +797,9 @@ buildRules = ( ); dependencies = ( - 752F1D7B2C46F493002D4AC3 /* PBXTargetDependency */, 752F1D912C46F5D7002D4AC3 /* PBXTargetDependency */, + 75E979882C4935170081B069 /* PBXTargetDependency */, + 75E979982C49561B0081B069 /* PBXTargetDependency */, ); name = "demo-store-ios"; productName = "demo-store-ios"; @@ -713,6 +845,42 @@ productReference = 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; + 75E979822C4935170081B069 /* Core */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75E9798B2C4935170081B069 /* Build configuration list for PBXNativeTarget "Core" */; + buildPhases = ( + 75E9797E2C4935170081B069 /* Headers */, + 75E9797F2C4935170081B069 /* Sources */, + 75E979802C4935170081B069 /* Frameworks */, + 75E979812C4935170081B069 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Core; + productName = Core; + productReference = 75E979832C4935170081B069 /* Core.framework */; + productType = "com.apple.product-type.framework"; + }; + 75E979922C49561B0081B069 /* Feature */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75E9799B2C49561B0081B069 /* Build configuration list for PBXNativeTarget "Feature" */; + buildPhases = ( + 75E9798E2C49561B0081B069 /* Headers */, + 75E9798F2C49561B0081B069 /* Sources */, + 75E979902C49561B0081B069 /* Frameworks */, + 75E979912C49561B0081B069 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Feature; + productName = Feature; + productReference = 75E979932C49561B0081B069 /* Feature.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -723,9 +891,6 @@ LastSwiftUpdateCheck = 1540; LastUpgradeCheck = 1540; TargetAttributes = { - 752F1D752C46F493002D4AC3 = { - CreatedOnToolsVersion = 15.4; - }; 752F1D8B2C46F5D7002D4AC3 = { CreatedOnToolsVersion = 15.4; }; @@ -740,6 +905,12 @@ CreatedOnToolsVersion = 15.4; TestTargetID = 75B935522C3564360063E814; }; + 75E979822C4935170081B069 = { + CreatedOnToolsVersion = 15.4; + }; + 75E979922C49561B0081B069 = { + CreatedOnToolsVersion = 15.4; + }; }; }; buildConfigurationList = 75B9354E2C3564360063E814 /* Build configuration list for PBXProject "demo-store-ios" */; @@ -758,45 +929,53 @@ 75B935522C3564360063E814 /* demo-store-ios */, 75B935622C3564370063E814 /* demo-store-iosTests */, 75B9356C2C3564370063E814 /* demo-store-iosUITests */, - 752F1D752C46F493002D4AC3 /* common */, 752F1D8B2C46F5D7002D4AC3 /* data */, + 75E979822C4935170081B069 /* Core */, + 75E979922C49561B0081B069 /* Feature */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 752F1D742C46F493002D4AC3 /* Resources */ = { + 752F1D8A2C46F5D7002D4AC3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 752F1D8A2C46F5D7002D4AC3 /* Resources */ = { + 75B935512C3564360063E814 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */, + 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */, + 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75B935612C3564370063E814 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 75B935512C3564360063E814 /* Resources */ = { + 75B9356B2C3564370063E814 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */, - 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */, - 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 75B935612C3564370063E814 /* Resources */ = { + 75E979812C4935170081B069 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 75B9356B2C3564370063E814 /* Resources */ = { + 75E979912C49561B0081B069 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -909,13 +1088,6 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 752F1D722C46F493002D4AC3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 752F1D882C46F5D7002D4AC3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -934,11 +1106,11 @@ 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */, 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */, - 75ECCD102C36BE2000D6D346 /* CatalogScreenView.swift in Sources */, + 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */, 75674CF72C3D92E0007FAB88 /* RecommendedProductDto.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, - 755944A12C35822700C274C9 /* LaunchScreen.swift in Sources */, + 755944A12C35822700C274C9 /* LaunchScreenController.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */, @@ -984,14 +1156,23 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 75E9797F2C4935170081B069 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 75E9798F2C49561B0081B069 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 752F1D7B2C46F493002D4AC3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 752F1D752C46F493002D4AC3 /* common */; - targetProxy = 752F1D7A2C46F493002D4AC3 /* PBXContainerItemProxy */; - }; 752F1D912C46F5D7002D4AC3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 752F1D8B2C46F5D7002D4AC3 /* data */; @@ -1007,82 +1188,19 @@ target = 75B935522C3564360063E814 /* demo-store-ios */; targetProxy = 75B9356E2C3564370063E814 /* PBXContainerItemProxy */; }; + 75E979882C4935170081B069 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 75E979822C4935170081B069 /* Core */; + targetProxy = 75E979872C4935170081B069 /* PBXContainerItemProxy */; + }; + 75E979982C49561B0081B069 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 75E979922C49561B0081B069 /* Feature */; + targetProxy = 75E979972C49561B0081B069 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 752F1D7F2C46F493002D4AC3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUILD_LIBRARY_FOR_DISTRIBUTION = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "demo-store.common"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 752F1D802C46F493002D4AC3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUILD_LIBRARY_FOR_DISTRIBUTION = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "demo-store.common"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 752F1D952C46F5D7002D4AC3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1283,10 +1401,10 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_ASSET_PATHS = "\"demo-store-ios/Preview Content\""; + DEVELOPMENT_ASSET_PATHS = "\"App/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "demo-store-ios/Info.plist"; + INFOPLIST_FILE = App/Info.plist; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -1313,10 +1431,10 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_ASSET_PATHS = "\"demo-store-ios/Preview Content\""; + DEVELOPMENT_ASSET_PATHS = "\"App/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = "demo-store-ios/Info.plist"; + INFOPLIST_FILE = App/Info.plist; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -1411,18 +1529,155 @@ }; name = Release; }; + 75E9798C2C4935170081B069 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.Core"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 75E9798D2C4935170081B069 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.Core"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 75E9799C2C49561B0081B069 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.Feature"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 75E9799D2C49561B0081B069 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = "demo-store.Feature"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 752F1D7E2C46F493002D4AC3 /* Build configuration list for PBXNativeTarget "common" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 752F1D7F2C46F493002D4AC3 /* Debug */, - 752F1D802C46F493002D4AC3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 752F1D942C46F5D7002D4AC3 /* Build configuration list for PBXNativeTarget "data" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1468,6 +1723,24 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 75E9798B2C4935170081B069 /* Build configuration list for PBXNativeTarget "Core" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75E9798C2C4935170081B069 /* Debug */, + 75E9798D2C4935170081B069 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 75E9799B2C49561B0081B069 /* Build configuration list for PBXNativeTarget "Feature" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75E9799C2C49561B0081B069 /* Debug */, + 75E9799D2C49561B0081B069 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 75B9354B2C3564360063E814 /* Project object */; diff --git a/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme new file mode 100644 index 0000000..d1c2e67 --- /dev/null +++ b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist index 994e1e1..86f792a 100644 --- a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,20 +4,48 @@ SchemeUserState + Core.xcscheme_^#shared#^_ + + orderHint + 10 + + Feature.xcscheme_^#shared#^_ + + orderHint + 11 + common.xcscheme_^#shared#^_ orderHint - 7 + 8 data.xcscheme_^#shared#^_ orderHint - 9 + 7 demo-store-ios.xcscheme_^#shared#^_ orderHint - 8 + 9 + + + SuppressBuildableAutocreation + + 75B935522C3564360063E814 + + primary + + + 75B935622C3564370063E814 + + primary + + + 75B9356C2C3564370063E814 + + primary + From 37a26d3394f811231b9fa6bffe3d65f2ed2b7f2e Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 18 Jul 2024 16:20:24 +0200 Subject: [PATCH 52/85] refactor: Delete AppDelegate.swift, move models in data layer --- App/AppDelegate.swift | 54 ---- Data/data.h | 18 -- .../Cart/Data/Model}/ProductCartItemDto.swift | 0 .../Mapper}/RecommendedProductMapper.swift | 2 +- .../Product/Data/Model/ProductDto.swift | 2 +- .../Data/Model}/RecommendedProductDto.swift | 2 +- .../Data/Model}/SearchResponseDto.swift | 0 demo-store-ios.xcodeproj/project.pbxproj | 247 ++++-------------- 8 files changed, 59 insertions(+), 266 deletions(-) delete mode 100644 App/AppDelegate.swift delete mode 100644 Data/data.h rename {Data/models => Feature/Cart/Data/Model}/ProductCartItemDto.swift (100%) rename {Data/mappers => Feature/Product/Data/Mapper}/RecommendedProductMapper.swift (98%) rename Data/models/CategoryDto.swift => Feature/Product/Data/Model/ProductDto.swift (86%) rename {Data/models => Feature/Product/Data/Model}/RecommendedProductDto.swift (96%) rename {Data/models => Feature/Search/Data/Model}/SearchResponseDto.swift (100%) diff --git a/App/AppDelegate.swift b/App/AppDelegate.swift deleted file mode 100644 index 84b1981..0000000 --- a/App/AppDelegate.swift +++ /dev/null @@ -1,54 +0,0 @@ -import UIKit -import REES46 - -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - private let SHOP_ID = "357382bf66ac0ce2f1722677c59511" - private let API_DOMAIN = "https://api.rees46.ru/" - private let USER_EMAIL: String? = nil - private let USER_PHONE: String? = nil - private let USER_LOYALTY_ID: String? = nil - private let SDK_STREAM = "ios" - - private let NOTIFICATION_TYPE = "DEMO NOTIFICATION TYPE" - private let NOTIFICATION_ID = "DEMO NOTIFICATION ID" - - var sdk: PersonalizationSDK? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - - // Initialize SDK - initializeSDK() - - return true - } - - func initializeSDK() { - sdk = createPersonalizationSDK( - shopId: SHOP_ID, - userEmail: USER_EMAIL, - userPhone: USER_PHONE, - userLoyaltyId: USER_LOYALTY_ID, - apiDomain: API_DOMAIN, - stream: SDK_STREAM, - enableLogs: true, - autoSendPushToken: true - ) { error in - if let error = error { - print("SDK Initialization failed: \(error.localizedDescription)") - // Handle the initialization failure appropriately - // For example, retry initialization or show an error message - } else { - print("SDK Initialization succeeded") - // SDK is initialized, you can access its session or perform other actions - if let sessionId = self.sdk?.getSession() { - print("SDK Session ID: \(sessionId)") - } else { - print("Failed to retrieve SDK session ID") - } - } - } - } -} diff --git a/Data/data.h b/Data/data.h deleted file mode 100644 index 0f27c24..0000000 --- a/Data/data.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// data.h -// data -// -// Created by Daniel Green on 2024-07-16. -// - -#import - -//! Project version number for data. -FOUNDATION_EXPORT double dataVersionNumber; - -//! Project version string for data. -FOUNDATION_EXPORT const unsigned char dataVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/Data/models/ProductCartItemDto.swift b/Feature/Cart/Data/Model/ProductCartItemDto.swift similarity index 100% rename from Data/models/ProductCartItemDto.swift rename to Feature/Cart/Data/Model/ProductCartItemDto.swift diff --git a/Data/mappers/RecommendedProductMapper.swift b/Feature/Product/Data/Mapper/RecommendedProductMapper.swift similarity index 98% rename from Data/mappers/RecommendedProductMapper.swift rename to Feature/Product/Data/Mapper/RecommendedProductMapper.swift index 0fcebbb..d59f398 100644 --- a/Data/mappers/RecommendedProductMapper.swift +++ b/Feature/Product/Data/Mapper/RecommendedProductMapper.swift @@ -17,7 +17,7 @@ class RecommendedProductMapper { url: recommended.url, deeplinkIos: recommended.deeplinkIos, categories: recommended.categories.map { category in - Category( + ProductDto( id: category.id, name: category.name, url: category.url, diff --git a/Data/models/CategoryDto.swift b/Feature/Product/Data/Model/ProductDto.swift similarity index 86% rename from Data/models/CategoryDto.swift rename to Feature/Product/Data/Model/ProductDto.swift index 163e183..1086c4c 100644 --- a/Data/models/CategoryDto.swift +++ b/Feature/Product/Data/Model/ProductDto.swift @@ -1,6 +1,6 @@ import Foundation -struct Category { +struct ProductDto { let id: String let name: String let url: String? diff --git a/Data/models/RecommendedProductDto.swift b/Feature/Product/Data/Model/RecommendedProductDto.swift similarity index 96% rename from Data/models/RecommendedProductDto.swift rename to Feature/Product/Data/Model/RecommendedProductDto.swift index e78b230..95202c3 100644 --- a/Data/models/RecommendedProductDto.swift +++ b/Feature/Product/Data/Model/RecommendedProductDto.swift @@ -12,7 +12,7 @@ struct RecommendedProduct { let resizedImageUrl: String let url: String let deeplinkIos: String - let categories: [Category] + let categories: [ProductDto] let locations: [REES46.Location] let price: Double let priceFormatted: String? diff --git a/Data/models/SearchResponseDto.swift b/Feature/Search/Data/Model/SearchResponseDto.swift similarity index 100% rename from Data/models/SearchResponseDto.swift rename to Feature/Search/Data/Model/SearchResponseDto.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 551b45f..1b749a5 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -18,9 +18,6 @@ 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.swift */; }; 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */; }; 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */; }; - 752F1D8F2C46F5D7002D4AC3 /* data.h in Headers */ = {isa = PBXBuildFile; fileRef = 752F1D8E2C46F5D7002D4AC3 /* data.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 752F1D922C46F5D7002D4AC3 /* data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D8C2C46F5D7002D4AC3 /* data.framework */; }; - 752F1D932C46F5D7002D4AC3 /* data.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 752F1D8C2C46F5D7002D4AC3 /* data.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 755944A12C35822700C274C9 /* LaunchScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreenController.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; @@ -29,13 +26,12 @@ 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */; }; 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; - 75674CF52C3D92CC007FAB88 /* CategoryDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* CategoryDto.swift */; }; + 75674CF52C3D92CC007FAB88 /* ProductDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* ProductDto.swift */; }; 75674CF72C3D92E0007FAB88 /* RecommendedProductDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */; }; 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */; }; 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */; }; 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D022C3DA14F007FAB88 /* RatingConverter.swift */; }; - 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F41D2C38065000AAC175 /* AppDelegate.swift */; }; 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */; }; 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */; }; @@ -65,13 +61,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 752F1D902C46F5D7002D4AC3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 75B9354B2C3564360063E814 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 752F1D8B2C46F5D7002D4AC3; - remoteInfo = data; - }; 75B935642C3564370063E814 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 75B9354B2C3564360063E814 /* Project object */; @@ -109,7 +98,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 752F1D932C46F5D7002D4AC3 /* data.framework in Embed Frameworks */, 75E9799A2C49561B0081B069 /* Feature.framework in Embed Frameworks */, 75E9798A2C4935170081B069 /* Core.framework in Embed Frameworks */, ); @@ -130,8 +118,6 @@ 752F1D482C459680002D4AC3 /* SearchScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.swift; sourceTree = ""; }; 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResponseDto.swift; sourceTree = ""; }; 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; - 752F1D8C2C46F5D7002D4AC3 /* data.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = data.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 752F1D8E2C46F5D7002D4AC3 /* data.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = data.h; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 755944A02C35822700C274C9 /* LaunchScreenController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreenController.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; @@ -140,13 +126,12 @@ 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; - 75674CF42C3D92CC007FAB88 /* CategoryDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryDto.swift; sourceTree = ""; }; + 75674CF42C3D92CC007FAB88 /* ProductDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDto.swift; sourceTree = ""; }; 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductDto.swift; sourceTree = ""; }; 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortRecommendationListView.swift; sourceTree = ""; }; 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageLoader.swift; sourceTree = ""; }; 75674D022C3DA14F007FAB88 /* RatingConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingConverter.swift; sourceTree = ""; }; - 75A3F41D2C38065000AAC175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.swift; sourceTree = ""; }; 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrroScreenView.swift; sourceTree = ""; }; @@ -184,19 +169,11 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 752F1D892C46F5D7002D4AC3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 75B935502C3564360063E814 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */, - 752F1D922C46F5D7002D4AC3 /* data.framework in Frameworks */, 75E979992C49561B0081B069 /* Feature.framework in Frameworks */, 75E979892C4935170081B069 /* Core.framework in Frameworks */, ); @@ -235,16 +212,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 752F1D8D2C46F5D7002D4AC3 /* Data */ = { - isa = PBXGroup; - children = ( - 75674CFA2C3D9957007FAB88 /* mappers */, - 75674CF32C3D92B0007FAB88 /* models */, - 752F1D8E2C46F5D7002D4AC3 /* data.h */, - ); - path = Data; - sourceTree = ""; - }; 75674CEA2C3D2E32007FAB88 /* Stories */ = { isa = PBXGroup; children = ( @@ -280,25 +247,6 @@ path = Recommendation; sourceTree = ""; }; - 75674CF32C3D92B0007FAB88 /* models */ = { - isa = PBXGroup; - children = ( - 75674CF42C3D92CC007FAB88 /* CategoryDto.swift */, - 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */, - 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */, - 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */, - ); - path = models; - sourceTree = ""; - }; - 75674CFA2C3D9957007FAB88 /* mappers */ = { - isa = PBXGroup; - children = ( - 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */, - ); - path = mappers; - sourceTree = ""; - }; 75674CFF2C3DA0EC007FAB88 /* Utils */ = { isa = PBXGroup; children = ( @@ -314,7 +262,6 @@ 75E979842C4935170081B069 /* Core */, 75B935552C3564360063E814 /* App */, 75E979942C49561B0081B069 /* Feature */, - 752F1D8D2C46F5D7002D4AC3 /* Data */, 75B935662C3564370063E814 /* demo-store-iosTests */, 75B935702C3564370063E814 /* demo-store-iosUITests */, 75B935542C3564360063E814 /* Products */, @@ -329,7 +276,6 @@ 75B935532C3564360063E814 /* demo-store-ios.app */, 75B935632C3564370063E814 /* demo-store-iosTests.xctest */, 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */, - 752F1D8C2C46F5D7002D4AC3 /* data.framework */, 75E979832C4935170081B069 /* Core.framework */, 75E979932C49561B0081B069 /* Feature.framework */, ); @@ -342,7 +288,6 @@ 75A3F4212C3828A400AAC175 /* Info.plist */, 75ECCD182C36F92A00D6D346 /* Navigation */, 75B935562C3564360063E814 /* DemoStoreApp.swift */, - 75A3F41D2C38065000AAC175 /* AppDelegate.swift */, 75B935582C3564360063E814 /* ContentView.swift */, 75B9355C2C3564370063E814 /* Preview Content */, ); @@ -414,6 +359,7 @@ isa = PBXGroup; children = ( 75E979BC2C4959F50081B069 /* Presentation */, + 75E979C22C495B780081B069 /* Data */, ); path = Product; sourceTree = ""; @@ -423,6 +369,7 @@ children = ( 75E979B22C4958A90081B069 /* Presentation */, 75E979B52C4958F20081B069 /* Domain */, + 75E979C02C495B1D0081B069 /* Data */, ); path = Cart; sourceTree = ""; @@ -487,6 +434,7 @@ 75E979A82C4956E60081B069 /* Data */ = { isa = PBXGroup; children = ( + 75E979C42C495BAA0081B069 /* Model */, ); path = Data; sourceTree = ""; @@ -686,6 +634,56 @@ path = View; sourceTree = ""; }; + 75E979C02C495B1D0081B069 /* Data */ = { + isa = PBXGroup; + children = ( + 75E979C12C495B660081B069 /* Model */, + ); + path = Data; + sourceTree = ""; + }; + 75E979C12C495B660081B069 /* Model */ = { + isa = PBXGroup; + children = ( + 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */, + ); + path = Model; + sourceTree = ""; + }; + 75E979C22C495B780081B069 /* Data */ = { + isa = PBXGroup; + children = ( + 75E979C32C495B7E0081B069 /* Model */, + 75E979C52C495BC30081B069 /* Mapper */, + ); + path = Data; + sourceTree = ""; + }; + 75E979C32C495B7E0081B069 /* Model */ = { + isa = PBXGroup; + children = ( + 75674CF42C3D92CC007FAB88 /* ProductDto.swift */, + 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */, + ); + path = Model; + sourceTree = ""; + }; + 75E979C42C495BAA0081B069 /* Model */ = { + isa = PBXGroup; + children = ( + 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */, + ); + path = Model; + sourceTree = ""; + }; + 75E979C52C495BC30081B069 /* Mapper */ = { + isa = PBXGroup; + children = ( + 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */, + ); + path = Mapper; + sourceTree = ""; + }; 75ECCD152C36D6B400D6D346 /* Resources */ = { isa = PBXGroup; children = ( @@ -738,14 +736,6 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 752F1D872C46F5D7002D4AC3 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 752F1D8F2C46F5D7002D4AC3 /* data.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 75E9797E2C4935170081B069 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -765,24 +755,6 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 752F1D8B2C46F5D7002D4AC3 /* data */ = { - isa = PBXNativeTarget; - buildConfigurationList = 752F1D942C46F5D7002D4AC3 /* Build configuration list for PBXNativeTarget "data" */; - buildPhases = ( - 752F1D872C46F5D7002D4AC3 /* Headers */, - 752F1D882C46F5D7002D4AC3 /* Sources */, - 752F1D892C46F5D7002D4AC3 /* Frameworks */, - 752F1D8A2C46F5D7002D4AC3 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = data; - productName = data; - productReference = 752F1D8C2C46F5D7002D4AC3 /* data.framework */; - productType = "com.apple.product-type.framework"; - }; 75B935522C3564360063E814 /* demo-store-ios */ = { isa = PBXNativeTarget; buildConfigurationList = 75B935772C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-ios" */; @@ -797,7 +769,6 @@ buildRules = ( ); dependencies = ( - 752F1D912C46F5D7002D4AC3 /* PBXTargetDependency */, 75E979882C4935170081B069 /* PBXTargetDependency */, 75E979982C49561B0081B069 /* PBXTargetDependency */, ); @@ -891,9 +862,6 @@ LastSwiftUpdateCheck = 1540; LastUpgradeCheck = 1540; TargetAttributes = { - 752F1D8B2C46F5D7002D4AC3 = { - CreatedOnToolsVersion = 15.4; - }; 75B935522C3564360063E814 = { CreatedOnToolsVersion = 15.4; }; @@ -929,7 +897,6 @@ 75B935522C3564360063E814 /* demo-store-ios */, 75B935622C3564370063E814 /* demo-store-iosTests */, 75B9356C2C3564370063E814 /* demo-store-iosUITests */, - 752F1D8B2C46F5D7002D4AC3 /* data */, 75E979822C4935170081B069 /* Core */, 75E979922C49561B0081B069 /* Feature */, ); @@ -937,13 +904,6 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 752F1D8A2C46F5D7002D4AC3 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 75B935512C3564360063E814 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1088,13 +1048,6 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 752F1D882C46F5D7002D4AC3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 75B9354F2C3564360063E814 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1128,14 +1081,13 @@ 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, - 75A3F41E2C38065000AAC175 /* AppDelegate.swift in Sources */, 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */, 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, - 75674CF52C3D92CC007FAB88 /* CategoryDto.swift in Sources */, + 75674CF52C3D92CC007FAB88 /* ProductDto.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1173,11 +1125,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 752F1D912C46F5D7002D4AC3 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 752F1D8B2C46F5D7002D4AC3 /* data */; - targetProxy = 752F1D902C46F5D7002D4AC3 /* PBXContainerItemProxy */; - }; 75B935652C3564370063E814 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 75B935522C3564360063E814 /* demo-store-ios */; @@ -1201,79 +1148,6 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 752F1D952C46F5D7002D4AC3 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUILD_LIBRARY_FOR_DISTRIBUTION = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "demo-store.data"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 752F1D962C46F5D7002D4AC3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUILD_LIBRARY_FOR_DISTRIBUTION = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; - MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = "demo-store.data"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_INSTALL_OBJC_HEADER = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 75B935752C3564370063E814 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1678,15 +1552,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 752F1D942C46F5D7002D4AC3 /* Build configuration list for PBXNativeTarget "data" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 752F1D952C46F5D7002D4AC3 /* Debug */, - 752F1D962C46F5D7002D4AC3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 75B9354E2C3564360063E814 /* Build configuration list for PBXProject "demo-store-ios" */ = { isa = XCConfigurationList; buildConfigurations = ( From d48ee5f4b2a800ca1a680e282d1fc91022c5aa12 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 18 Jul 2024 16:22:56 +0200 Subject: [PATCH 53/85] refactor: Remove unused testing packages and classes --- demo-store-ios.xcodeproj/project.pbxproj | 314 +----------------- demo-store-iosTests/DemoStoreTests.swift | 30 -- demo-store-iosUITests/DemoStoreUITests.swift | 35 -- .../DemoStoreUITestsLaunchTests.swift | 26 -- 4 files changed, 4 insertions(+), 401 deletions(-) delete mode 100644 demo-store-iosTests/DemoStoreTests.swift delete mode 100644 demo-store-iosUITests/DemoStoreUITests.swift delete mode 100644 demo-store-iosUITests/DemoStoreUITestsLaunchTests.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 1b749a5..e5ea275 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -8,8 +8,6 @@ /* Begin PBXBuildFile section */ 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */; }; - 452CB1BD95293EB9465F6C4C /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF343FE4C1EB44258E4142CD /* Pods_demo_store_ios_demo_store_iosUITests.framework */; }; - 748A7C58839E67C62D21DB52 /* Pods_demo_store_iosTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */; }; 752F1D3A2C41E01D002D4AC3 /* ProductCartItemDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */; }; 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */; }; 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */; }; @@ -40,9 +38,6 @@ 75B935592C3564360063E814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355D2C3564370063E814 /* Preview Assets.xcassets */; }; - 75B935682C3564370063E814 /* DemoStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935672C3564370063E814 /* DemoStoreTests.swift */; }; - 75B935722C3564370063E814 /* DemoStoreUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935712C3564370063E814 /* DemoStoreUITests.swift */; }; - 75B935742C3564370063E814 /* DemoStoreUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */; }; 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */; }; 75E1C8ED2C3EACDA005018B4 /* DetailsToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */; }; 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */; }; @@ -61,20 +56,6 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 75B935642C3564370063E814 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 75B9354B2C3564360063E814 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 75B935522C3564360063E814; - remoteInfo = "demo-store-ios"; - }; - 75B9356E2C3564370063E814 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 75B9354B2C3564360063E814 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 75B935522C3564360063E814; - remoteInfo = "demo-store-ios"; - }; 75E979872C4935170081B069 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 75B9354B2C3564360063E814 /* Project object */; @@ -142,11 +123,6 @@ 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 75B9355A2C3564370063E814 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 75B9355D2C3564370063E814 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 75B935632C3564370063E814 /* demo-store-iosTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "demo-store-iosTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 75B935672C3564370063E814 /* DemoStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreTests.swift; sourceTree = ""; }; - 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "demo-store-iosUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 75B935712C3564370063E814 /* DemoStoreUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreUITests.swift; sourceTree = ""; }; - 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreUITestsLaunchTests.swift; sourceTree = ""; }; 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.swift; sourceTree = ""; }; 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbar.swift; sourceTree = ""; }; 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.swift; sourceTree = ""; }; @@ -179,22 +155,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 75B935602C3564370063E814 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 748A7C58839E67C62D21DB52 /* Pods_demo_store_iosTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 75B9356A2C3564370063E814 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 452CB1BD95293EB9465F6C4C /* Pods_demo_store_ios_demo_store_iosUITests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 75E979802C4935170081B069 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -262,8 +222,6 @@ 75E979842C4935170081B069 /* Core */, 75B935552C3564360063E814 /* App */, 75E979942C49561B0081B069 /* Feature */, - 75B935662C3564370063E814 /* demo-store-iosTests */, - 75B935702C3564370063E814 /* demo-store-iosUITests */, 75B935542C3564360063E814 /* Products */, 8FED5CC7CDC6607CEFB8FDC9 /* Pods */, ECE8154AB54931A903490932 /* Frameworks */, @@ -274,8 +232,6 @@ isa = PBXGroup; children = ( 75B935532C3564360063E814 /* demo-store-ios.app */, - 75B935632C3564370063E814 /* demo-store-iosTests.xctest */, - 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */, 75E979832C4935170081B069 /* Core.framework */, 75E979932C49561B0081B069 /* Feature.framework */, ); @@ -302,23 +258,6 @@ path = "Preview Content"; sourceTree = ""; }; - 75B935662C3564370063E814 /* demo-store-iosTests */ = { - isa = PBXGroup; - children = ( - 75B935672C3564370063E814 /* DemoStoreTests.swift */, - ); - path = "demo-store-iosTests"; - sourceTree = ""; - }; - 75B935702C3564370063E814 /* demo-store-iosUITests */ = { - isa = PBXGroup; - children = ( - 75B935712C3564370063E814 /* DemoStoreUITests.swift */, - 75B935732C3564370063E814 /* DemoStoreUITestsLaunchTests.swift */, - ); - path = "demo-store-iosUITests"; - sourceTree = ""; - }; 75E979842C4935170081B069 /* Core */ = { isa = PBXGroup; children = ( @@ -777,45 +716,6 @@ productReference = 75B935532C3564360063E814 /* demo-store-ios.app */; productType = "com.apple.product-type.application"; }; - 75B935622C3564370063E814 /* demo-store-iosTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 75B9357A2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosTests" */; - buildPhases = ( - 251E42C90244B36005A0714D /* [CP] Check Pods Manifest.lock */, - 75B9355F2C3564370063E814 /* Sources */, - 75B935602C3564370063E814 /* Frameworks */, - 75B935612C3564370063E814 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 75B935652C3564370063E814 /* PBXTargetDependency */, - ); - name = "demo-store-iosTests"; - productName = "demo-store-iosTests"; - productReference = 75B935632C3564370063E814 /* demo-store-iosTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 75B9356C2C3564370063E814 /* demo-store-iosUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 75B9357D2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosUITests" */; - buildPhases = ( - 015848CBDF21FD718DE7DB55 /* [CP] Check Pods Manifest.lock */, - 75B935692C3564370063E814 /* Sources */, - 75B9356A2C3564370063E814 /* Frameworks */, - 75B9356B2C3564370063E814 /* Resources */, - C5E77A6A7EE6A0583845799D /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 75B9356F2C3564370063E814 /* PBXTargetDependency */, - ); - name = "demo-store-iosUITests"; - productName = "demo-store-iosUITests"; - productReference = 75B9356D2C3564370063E814 /* demo-store-iosUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; 75E979822C4935170081B069 /* Core */ = { isa = PBXNativeTarget; buildConfigurationList = 75E9798B2C4935170081B069 /* Build configuration list for PBXNativeTarget "Core" */; @@ -865,14 +765,6 @@ 75B935522C3564360063E814 = { CreatedOnToolsVersion = 15.4; }; - 75B935622C3564370063E814 = { - CreatedOnToolsVersion = 15.4; - TestTargetID = 75B935522C3564360063E814; - }; - 75B9356C2C3564370063E814 = { - CreatedOnToolsVersion = 15.4; - TestTargetID = 75B935522C3564360063E814; - }; 75E979822C4935170081B069 = { CreatedOnToolsVersion = 15.4; }; @@ -895,8 +787,6 @@ projectRoot = ""; targets = ( 75B935522C3564360063E814 /* demo-store-ios */, - 75B935622C3564370063E814 /* demo-store-iosTests */, - 75B9356C2C3564370063E814 /* demo-store-iosUITests */, 75E979822C4935170081B069 /* Core */, 75E979922C49561B0081B069 /* Feature */, ); @@ -914,20 +804,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 75B935612C3564370063E814 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 75B9356B2C3564370063E814 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 75E979812C4935170081B069 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -945,50 +821,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 015848CBDF21FD718DE7DB55 /* [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-demo-store-ios-demo-store-iosUITests-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; - }; - 251E42C90244B36005A0714D /* [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-demo-store-iosTests-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; - }; 2ADA2F5588F90BD1D09FAC65 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1028,23 +860,6 @@ 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; }; - C5E77A6A7EE6A0583845799D /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1091,23 +906,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 75B9355F2C3564370063E814 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 75B935682C3564370063E814 /* DemoStoreTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 75B935692C3564370063E814 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 75B935722C3564370063E814 /* DemoStoreUITests.swift in Sources */, - 75B935742C3564370063E814 /* DemoStoreUITestsLaunchTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 75E9797F2C4935170081B069 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1125,16 +923,6 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 75B935652C3564370063E814 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 75B935522C3564360063E814 /* demo-store-ios */; - targetProxy = 75B935642C3564370063E814 /* PBXContainerItemProxy */; - }; - 75B9356F2C3564370063E814 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 75B935522C3564360063E814 /* demo-store-ios */; - targetProxy = 75B9356E2C3564370063E814 /* PBXContainerItemProxy */; - }; 75E979882C4935170081B069 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 75E979822C4935170081B069 /* Core */; @@ -1327,82 +1115,6 @@ }; name = Release; }; - 75B9357B2C3564370063E814 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1274DEF2C4D166945251575B /* Pods-demo-store-iosTests.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-iosTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/demo-store-ios.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/demo-store-ios"; - }; - name = Debug; - }; - 75B9357C2C3564370063E814 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C9E9C6394B2311130D8A51BB /* Pods-demo-store-iosTests.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-iosTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/demo-store-ios.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/demo-store-ios"; - }; - name = Release; - }; - 75B9357E2C3564370063E814 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A34899C8C386A23282313E5B /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-iosUITests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = "demo-store-ios"; - }; - name = Debug; - }; - 75B9357F2C3564370063E814 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = "demo-store.demo-store-iosUITests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = "demo-store-ios"; - }; - name = Release; - }; 75E9798C2C4935170081B069 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1418,7 +1130,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1455,7 +1167,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1491,7 +1203,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1528,7 +1240,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 17.5; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1570,24 +1282,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 75B9357A2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 75B9357B2C3564370063E814 /* Debug */, - 75B9357C2C3564370063E814 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 75B9357D2C3564370063E814 /* Build configuration list for PBXNativeTarget "demo-store-iosUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 75B9357E2C3564370063E814 /* Debug */, - 75B9357F2C3564370063E814 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 75E9798B2C4935170081B069 /* Build configuration list for PBXNativeTarget "Core" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/demo-store-iosTests/DemoStoreTests.swift b/demo-store-iosTests/DemoStoreTests.swift deleted file mode 100644 index 0fc8597..0000000 --- a/demo-store-iosTests/DemoStoreTests.swift +++ /dev/null @@ -1,30 +0,0 @@ - -import XCTest -@testable import demo_store_ios - -final class DemoStoreTests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - // Any test you write for XCTest can be annotated as throws and async. - // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. - // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. - } - - func testPerformanceExample() throws { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/demo-store-iosUITests/DemoStoreUITests.swift b/demo-store-iosUITests/DemoStoreUITests.swift deleted file mode 100644 index 43ac13c..0000000 --- a/demo-store-iosUITests/DemoStoreUITests.swift +++ /dev/null @@ -1,35 +0,0 @@ - -import XCTest - -final class DemoStoreUITests: XCTestCase { - - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - - // In UI tests it is usually best to stop immediately when a failure occurs. - continueAfterFailure = false - - // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - func testExample() throws { - // UI tests must launch the application that they test. - let app = XCUIApplication() - app.launch() - - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testLaunchPerformance() throws { - if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { - // This measures how long it takes to launch your application. - measure(metrics: [XCTApplicationLaunchMetric()]) { - XCUIApplication().launch() - } - } - } -} diff --git a/demo-store-iosUITests/DemoStoreUITestsLaunchTests.swift b/demo-store-iosUITests/DemoStoreUITestsLaunchTests.swift deleted file mode 100644 index d46d95c..0000000 --- a/demo-store-iosUITests/DemoStoreUITestsLaunchTests.swift +++ /dev/null @@ -1,26 +0,0 @@ - -import XCTest - -final class DemoStoreUITestsLaunchTests: XCTestCase { - - override class var runsForEachTargetApplicationUIConfiguration: Bool { - true - } - - override func setUpWithError() throws { - continueAfterFailure = false - } - - func testLaunch() throws { - let app = XCUIApplication() - app.launch() - - // Insert steps here to perform after app launch but before taking a screenshot, - // such as logging into a test account or navigating somewhere in the app - - let attachment = XCTAttachment(screenshot: app.screenshot()) - attachment.name = "Launch Screen" - attachment.lifetime = .keepAlways - add(attachment) - } -} From 32df8d0ebcda20621a1427cfb8fab0e357e7cea4 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 18 Jul 2024 16:48:29 +0200 Subject: [PATCH 54/85] refactor: Change injecting sdk manager --- Core/DI/SdkManager.swift | 7 ++-- .../ViewModel/HomeViewModel.swift | 33 +++++++++++-------- .../ViewModel/SearchViewModel.swift | 8 +++-- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/Core/DI/SdkManager.swift b/Core/DI/SdkManager.swift index 2023e33..33e3569 100644 --- a/Core/DI/SdkManager.swift +++ b/Core/DI/SdkManager.swift @@ -1,6 +1,10 @@ import REES46 -class SDKManager { +protocol SDKManaging { + var sdk: PersonalizationSDK? { get } +} + +class SDKManager: SDKManaging { static let shared = SDKManager() var sdk: PersonalizationSDK? @@ -41,5 +45,4 @@ class SDKManager { } } } - } diff --git a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift index 805060c..533ffb3 100644 --- a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift +++ b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift @@ -9,31 +9,38 @@ class HomeViewModel: ObservableObject { @Published var arrivalsProducts: [RecommendedProduct] = [] @Published var topTrendProducts: [RecommendedProduct] = [] @Published var recommenderProducts: [RecommendedProduct] = [] - let sdkManager = SDKManager.shared - @Published var isLoading = true - private let cartRepository = CartRepository.shared - private let getRecommendationsUseCase = GetRecommendationsUseCase() + private let cartRepository: CartRepository + private let getRecommendationsUseCase: GetRecommendationsUseCase + private let sdkManager: SDKManaging + + init(sdkManager: SDKManaging = SDKManager.shared, + cartRepository: CartRepository = CartRepository.shared, + getRecommendationsUseCase: GetRecommendationsUseCase = GetRecommendationsUseCase()) { + self.sdkManager = sdkManager + self.cartRepository = cartRepository + self.getRecommendationsUseCase = getRecommendationsUseCase + } func loadArrivalsRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in - self.arrivalsProducts = products - self.isLoading = false + getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { [weak self] products in + self?.arrivalsProducts = products + self?.isLoading = false } } func loadTopTrendRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in - self.topTrendProducts = products - self.isLoading = false + getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { [weak self] products in + self?.topTrendProducts = products + self?.isLoading = false } } func loadRecommenderRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in - self.recommenderProducts = products - self.isLoading = false + getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { [weak self] products in + self?.recommenderProducts = products + self?.isLoading = false } } diff --git a/Feature/Search/Presentation/ViewModel/SearchViewModel.swift b/Feature/Search/Presentation/ViewModel/SearchViewModel.swift index 36463ff..9f5f55c 100644 --- a/Feature/Search/Presentation/ViewModel/SearchViewModel.swift +++ b/Feature/Search/Presentation/ViewModel/SearchViewModel.swift @@ -3,7 +3,8 @@ import Combine import REES46 class SearchViewModel: ObservableObject { - let sdkManager = SDKManager.shared + + private let sdkManager: SDKManaging @Published var searchText: String = "" @Published var searchResults: LocalSearchResponse? = nil @@ -15,7 +16,9 @@ class SearchViewModel: ObservableObject { private var cancellables = Set() - init() { + init(sdkManager: SDKManaging = SDKManager.shared) { + self.sdkManager = sdkManager + $searchText .debounce(for: .milliseconds(300), scheduler: RunLoop.main) .sink { [weak self] searchText in @@ -89,5 +92,4 @@ class SearchViewModel: ObservableObject { func clearSearchText() { searchText = "" } - } From ef4c5d894c5aa8986a5d019722d07fd530730471 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Thu, 18 Jul 2024 18:07:12 +0200 Subject: [PATCH 55/85] feat: Add home and cart resolvers --- App/DemoStoreApp.swift | 6 +- .../Presentation/View/BottomBarView.swift | 1 + Core/Resources/Localizable.xcstrings | 3 - Feature/Cart/DI/CartResolver.swift | 22 +++++ .../Cart/Presentation/View/CartItemView.swift | 63 +++++++++++++ .../Cart/Presentation/View/CartListView.swift | 20 +++++ .../Presentation/View/CartScreenView.swift | 89 ++----------------- .../ViewModel/CartViewModel.swift | 24 ++--- Feature/Home/DI/HomeResolver.swift | 23 +++++ .../Presentation/View/HomeScreenView.swift | 6 +- .../Stories/HomeStoriesContainerView.swift | 3 +- .../ViewModel/HomeViewModel.swift | 8 +- demo-store-ios.xcodeproj/project.pbxproj | 32 +++++++ 13 files changed, 192 insertions(+), 108 deletions(-) create mode 100644 Feature/Cart/DI/CartResolver.swift create mode 100644 Feature/Cart/Presentation/View/CartItemView.swift create mode 100644 Feature/Cart/Presentation/View/CartListView.swift create mode 100644 Feature/Home/DI/HomeResolver.swift diff --git a/App/DemoStoreApp.swift b/App/DemoStoreApp.swift index c7dbc0a..823e224 100644 --- a/App/DemoStoreApp.swift +++ b/App/DemoStoreApp.swift @@ -2,10 +2,7 @@ import SwiftUI @main struct DemoStoreApp: App { - - @StateObject private var sdkViewModel = HomeViewModel() - - + @State private var showSplash = true var body: some Scene { @@ -22,7 +19,6 @@ struct DemoStoreApp: App { } } else { ContentView() - .environmentObject(sdkViewModel) } } } diff --git a/App/Navigation/Presentation/View/BottomBarView.swift b/App/Navigation/Presentation/View/BottomBarView.swift index c74dfcc..fa9650b 100644 --- a/App/Navigation/Presentation/View/BottomBarView.swift +++ b/App/Navigation/Presentation/View/BottomBarView.swift @@ -1,6 +1,7 @@ import SwiftUI struct BottomBarView: View { + @EnvironmentObject var navigationManager: NavigationManager @State private var selectedTab: ScreenType? = .main diff --git a/Core/Resources/Localizable.xcstrings b/Core/Resources/Localizable.xcstrings index b3472d4..07724ad 100644 --- a/Core/Resources/Localizable.xcstrings +++ b/Core/Resources/Localizable.xcstrings @@ -383,9 +383,6 @@ } } } - }, - "Stories" : { - }, "stories_title" : { "extractionState" : "manual", diff --git a/Feature/Cart/DI/CartResolver.swift b/Feature/Cart/DI/CartResolver.swift new file mode 100644 index 0000000..de3054c --- /dev/null +++ b/Feature/Cart/DI/CartResolver.swift @@ -0,0 +1,22 @@ +import Foundation + +class CartResolver { + static let shared = CartResolver() + + private init() {} + + func resolveCartViewModel() -> CartViewModel { + return CartViewModel( + cartRepository: resolveCartRepository(), + getRecommendationsUseCase: resolveGetRecommendationsUseCase() + ) + } + + func resolveCartRepository() -> CartRepository { + return CartRepository.shared + } + + func resolveGetRecommendationsUseCase() -> GetRecommendationsUseCase { + return GetRecommendationsUseCase() + } +} diff --git a/Feature/Cart/Presentation/View/CartItemView.swift b/Feature/Cart/Presentation/View/CartItemView.swift new file mode 100644 index 0000000..5b17f2e --- /dev/null +++ b/Feature/Cart/Presentation/View/CartItemView.swift @@ -0,0 +1,63 @@ + +import SwiftUI + +struct CartItemView: View { + var cartItem: ProductCartItem + var removeFromCart: () -> Void + + var body: some View { + VStack(spacing: 0) { + HStack(spacing: 16) { + RemoteImageView( + urlString: cartItem.product.imageUrl, + width: 64, + height: 64, + contentMode: .fit, + showBorder: false + ) + + VStack(alignment: .leading, spacing: 4) { + Text(cartItem.product.brand) + .font(.system(size: 12)) + .foregroundColor(.gray) + + Text(cartItem.product.name) + .font(.system(size: 16)) + .foregroundColor(.black) + .lineLimit(1) + .truncationMode(.tail) + + Text(String(format: NSLocalizedString("quantity_title", comment: ""), "\(cartItem.quantity)")) + .font(.system(size: 14)) + .foregroundColor(.black) + } + .frame(maxWidth: .infinity, alignment: .leading) + + Text(cartItem.product.priceFormatted ?? "") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding(.trailing, 12) + + Button( + action: { + removeFromCart() + } + ) { + Image(systemName: "xmark") + .foregroundColor(.white) + .frame(width: 24, height: 24) + .background(Color.gray) + .clipShape(Circle()) + } + .buttonStyle(BorderlessButtonStyle()) + } + .padding(.vertical, 8) + .background(Color.white) + + Divider() + } + .listRowInsets(EdgeInsets()) + .background(Color.clear) + .padding(.horizontal) + } +} diff --git a/Feature/Cart/Presentation/View/CartListView.swift b/Feature/Cart/Presentation/View/CartListView.swift new file mode 100644 index 0000000..fc88acc --- /dev/null +++ b/Feature/Cart/Presentation/View/CartListView.swift @@ -0,0 +1,20 @@ +import SwiftUI + +struct CartListView: View { + var cartItems: [ProductCartItem] + var removeFromCart: (String) -> Void + + var body: some View { + List { + ForEach(cartItems) { cartItem in + CartItemView( + cartItem: cartItem, + removeFromCart: { + removeFromCart(cartItem.product.id) + } + ) + } + } + .listStyle(PlainListStyle()) + } +} diff --git a/Feature/Cart/Presentation/View/CartScreenView.swift b/Feature/Cart/Presentation/View/CartScreenView.swift index f7ec276..3fbaf11 100644 --- a/Feature/Cart/Presentation/View/CartScreenView.swift +++ b/Feature/Cart/Presentation/View/CartScreenView.swift @@ -1,12 +1,15 @@ import SwiftUI struct CartScreenView: View { - @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var cartViewModel = CartViewModel() + @ObservedObject var cartViewModel: CartViewModel @State private var isLoading = true + init(cartViewModel: CartViewModel = CartResolver.shared.resolveCartViewModel()) { + self.cartViewModel = cartViewModel + } + var totalPrice: Int { let total = cartViewModel.cartItems.reduce(0) { (result, cartItem) in if let priceString = cartItem.product.priceFormatted, @@ -52,7 +55,7 @@ struct CartScreenView: View { ) } - if !isLoading{ + if !isLoading { RecommendationSection(recommendedProducts: cartViewModel.recommenderProducts) } } @@ -79,86 +82,6 @@ struct EmptyCartView: View { } } -struct CartListView: View { - var cartItems: [ProductCartItem] - var removeFromCart: (String) -> Void - - var body: some View { - List { - ForEach(cartItems) { cartItem in - CartItemView( - cartItem: cartItem, - removeFromCart: { - removeFromCart(cartItem.product.id) - } - ) - } - } - .listStyle(PlainListStyle()) - } -} - -struct CartItemView: View { - var cartItem: ProductCartItem - var removeFromCart: () -> Void - - var body: some View { - VStack(spacing: 0) { - HStack(spacing: 16) { - RemoteImageView( - urlString: cartItem.product.imageUrl, - width: 64, - height: 64, - contentMode: .fit, - showBorder: false - ) - - VStack(alignment: .leading, spacing: 4) { - Text(cartItem.product.brand) - .font(.system(size: 12)) - .foregroundColor(.gray) - - Text(cartItem.product.name) - .font(.system(size: 16)) - .foregroundColor(.black) - .lineLimit(1) - .truncationMode(.tail) - - Text(String(format: NSLocalizedString("quantity_title", comment: ""), "\(cartItem.quantity)")) - .font(.system(size: 14)) - .foregroundColor(.black) - } - .frame(maxWidth: .infinity, alignment: .leading) - - Text(cartItem.product.priceFormatted ?? "") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding(.trailing, 12) - - Button( - action: { - removeFromCart() - } - ) { - Image(systemName: "xmark") - .foregroundColor(.white) - .frame(width: 24, height: 24) - .background(Color.gray) - .clipShape(Circle()) - } - .buttonStyle(BorderlessButtonStyle()) - } - .padding(.vertical, 8) - .background(Color.white) - - Divider() - } - .listRowInsets(EdgeInsets()) - .background(Color.clear) - .padding(.horizontal) - } -} - struct RecommendationSection: View { var recommendedProducts: [RecommendedProduct] diff --git a/Feature/Cart/Presentation/ViewModel/CartViewModel.swift b/Feature/Cart/Presentation/ViewModel/CartViewModel.swift index 13f854d..74810fd 100644 --- a/Feature/Cart/Presentation/ViewModel/CartViewModel.swift +++ b/Feature/Cart/Presentation/ViewModel/CartViewModel.swift @@ -2,18 +2,20 @@ import Foundation import Combine class CartViewModel: ObservableObject { - @Published var cartItems: [ProductCartItem] = [] @Published var recommenderProducts: [RecommendedProduct] = [] @Published var isLoading: Bool = true - - private let getRecommendationsUseCase = GetRecommendationsUseCase() - private let cartRepository = CartRepository.shared + + private let getRecommendationsUseCase: GetRecommendationsUseCase + private let cartRepository: CartRepository private var cancellables = Set() - + private let blockId = "977cb67194a72fdc7b424f49d69a862d" - - init() { + + init(cartRepository: CartRepository, getRecommendationsUseCase: GetRecommendationsUseCase) { + self.cartRepository = cartRepository + self.getRecommendationsUseCase = getRecommendationsUseCase + cartRepository.$cartItems .sink { [weak self] cartItems in self?.cartItems = cartItems @@ -21,19 +23,19 @@ class CartViewModel: ObservableObject { } .store(in: &cancellables) } - + func addToCart(product: RecommendedProduct, quantity: Int) { cartRepository.addToCart(product: product, quantity: quantity) } - + func updateCartItem(productId: String, quantity: Int) { cartRepository.updateCartItem(productId: productId, quantity: quantity) } - + func removeFromCart(productId: String) { cartRepository.removeFromCart(productId: productId) } - + func loadRecommenderRecommendations(currentProductId: String) { getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in self.recommenderProducts = products diff --git a/Feature/Home/DI/HomeResolver.swift b/Feature/Home/DI/HomeResolver.swift new file mode 100644 index 0000000..9459f3d --- /dev/null +++ b/Feature/Home/DI/HomeResolver.swift @@ -0,0 +1,23 @@ +import Foundation + +class HomeResolver { + static let shared = HomeResolver() + + private init() {} + + func resolve() -> T { + if T.self == HomeViewModel.self { + return HomeViewModel() as! T + } + if T.self == CartRepository.self { + return CartRepository.shared as! T + } + if T.self == GetRecommendationsUseCase.self { + return GetRecommendationsUseCase() as! T + } + if T.self == SDKManaging.self { + return SDKManager.shared as! T + } + fatalError("Unsupported type") + } +} diff --git a/Feature/Home/Presentation/View/HomeScreenView.swift b/Feature/Home/Presentation/View/HomeScreenView.swift index a8e06a7..53ba1f1 100644 --- a/Feature/Home/Presentation/View/HomeScreenView.swift +++ b/Feature/Home/Presentation/View/HomeScreenView.swift @@ -2,10 +2,14 @@ import SwiftUI struct HomeScreenView: View { @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var viewModel = HomeViewModel() + @ObservedObject var viewModel: HomeViewModel @State private var isLoading = true + init(viewModel: HomeViewModel = HomeResolver.shared.resolve()) { + self.viewModel = viewModel + } + var body: some View { NavigationView { ScrollView { diff --git a/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift b/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift index 0535d6d..4992e63 100644 --- a/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift +++ b/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift @@ -2,9 +2,10 @@ import SwiftUI import UIKit struct HomeStoriesContainerView: View { + var body: some View { VStack(alignment: .leading, spacing: 16) { - Text("Stories") + Text("stories_title") .font(.system(size: 24)) .foregroundColor(.black) .padding(.horizontal) diff --git a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift index 533ffb3..6bb6f6d 100644 --- a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift +++ b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift @@ -13,11 +13,11 @@ class HomeViewModel: ObservableObject { private let cartRepository: CartRepository private let getRecommendationsUseCase: GetRecommendationsUseCase - private let sdkManager: SDKManaging + let sdkManager: SDKManaging - init(sdkManager: SDKManaging = SDKManager.shared, - cartRepository: CartRepository = CartRepository.shared, - getRecommendationsUseCase: GetRecommendationsUseCase = GetRecommendationsUseCase()) { + init(sdkManager: SDKManaging = HomeResolver.shared.resolve(), + cartRepository: CartRepository = HomeResolver.shared.resolve(), + getRecommendationsUseCase: GetRecommendationsUseCase = HomeResolver.shared.resolve()) { self.sdkManager = sdkManager self.cartRepository = cartRepository self.getRecommendationsUseCase = getRecommendationsUseCase diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index e5ea275..655ab1b 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -47,6 +47,10 @@ 75E979962C49561B0081B069 /* Feature.h in Headers */ = {isa = PBXBuildFile; fileRef = 75E979952C49561B0081B069 /* Feature.h */; settings = {ATTRIBUTES = (Public, ); }; }; 75E979992C49561B0081B069 /* Feature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979932C49561B0081B069 /* Feature.framework */; }; 75E9799A2C49561B0081B069 /* Feature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979932C49561B0081B069 /* Feature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979C62C496E1C0081B069 /* HomeResolver.swift */; }; + 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979CB2C4973DA0081B069 /* CartResolver.swift */; }; + 75E979D02C4974440081B069 /* CartListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979CF2C4974440081B069 /* CartListView.swift */; }; + 75E979D42C4974660081B069 /* CartItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979D32C4974660081B069 /* CartItemView.swift */; }; 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */; }; 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; @@ -130,6 +134,10 @@ 75E979852C4935170081B069 /* Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Core.h; sourceTree = ""; }; 75E979932C49561B0081B069 /* Feature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Feature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 75E979952C49561B0081B069 /* Feature.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Feature.h; sourceTree = ""; }; + 75E979C62C496E1C0081B069 /* HomeResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeResolver.swift; sourceTree = ""; }; + 75E979CB2C4973DA0081B069 /* CartResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartResolver.swift; sourceTree = ""; }; + 75E979CF2C4974440081B069 /* CartListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartListView.swift; sourceTree = ""; }; + 75E979D32C4974660081B069 /* CartItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartItemView.swift; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; @@ -306,6 +314,7 @@ 75E979A02C4956520081B069 /* Cart */ = { isa = PBXGroup; children = ( + 75E979CA2C4973CF0081B069 /* DI */, 75E979B22C4958A90081B069 /* Presentation */, 75E979B52C4958F20081B069 /* Domain */, 75E979C02C495B1D0081B069 /* Data */, @@ -324,6 +333,7 @@ 75E979A22C49568B0081B069 /* DI */ = { isa = PBXGroup; children = ( + 75E979C62C496E1C0081B069 /* HomeResolver.swift */, ); path = DI; sourceTree = ""; @@ -464,6 +474,8 @@ 75E979B32C4958B20081B069 /* View */ = { isa = PBXGroup; children = ( + 75E979D32C4974660081B069 /* CartItemView.swift */, + 75E979CF2C4974440081B069 /* CartListView.swift */, 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, ); path = View; @@ -623,6 +635,14 @@ path = Mapper; sourceTree = ""; }; + 75E979CA2C4973CF0081B069 /* DI */ = { + isa = PBXGroup; + children = ( + 75E979CB2C4973DA0081B069 /* CartResolver.swift */, + ); + path = DI; + sourceTree = ""; + }; 75ECCD152C36D6B400D6D346 /* Resources */ = { isa = PBXGroup; children = ( @@ -767,9 +787,11 @@ }; 75E979822C4935170081B069 = { CreatedOnToolsVersion = 15.4; + LastSwiftMigration = 1540; }; 75E979922C49561B0081B069 = { CreatedOnToolsVersion = 15.4; + LastSwiftMigration = 1540; }; }; }; @@ -878,11 +900,13 @@ 75674CF72C3D92E0007FAB88 /* RecommendedProductDto.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, + 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */, 755944A12C35822700C274C9 /* LaunchScreenController.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */, 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */, + 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */, 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */, 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */, @@ -897,6 +921,8 @@ 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, + 75E979D02C4974440081B069 /* CartListView.swift in Sources */, + 75E979D42C4974660081B069 /* CartItemView.swift in Sources */, 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */, 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, @@ -1119,6 +1145,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -1145,6 +1172,7 @@ SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -1156,6 +1184,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -1192,6 +1221,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -1218,6 +1248,7 @@ SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -1229,6 +1260,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; From e548326951a4be2b3572a1a0a2fa08ca5a7cce47 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 19 Jul 2024 18:26:32 +0200 Subject: [PATCH 56/85] refactor: remove useless testing files and packages --- .../NavigationManager.swift | 0 Pods/Pods.xcodeproj/project.pbxproj | 2578 ++++------------- ...store-ios-demo-store-iosUITests-Info.plist | 26 - ...store-iosUITests-acknowledgements.markdown | 73 - ...mo-store-iosUITests-acknowledgements.plist | 117 - ...mo-store-ios-demo-store-iosUITests-dummy.m | 5 - ...ts-frameworks-Debug-input-files.xcfilelist | 4 - ...s-frameworks-Debug-output-files.xcfilelist | 3 - ...-frameworks-Release-input-files.xcfilelist | 4 - ...frameworks-Release-output-files.xcfilelist | 3 - ...re-ios-demo-store-iosUITests-frameworks.sh | 190 -- ...store-ios-demo-store-iosUITests-umbrella.h | 16 - ...e-ios-demo-store-iosUITests.debug.xcconfig | 15 - ...-store-ios-demo-store-iosUITests.modulemap | 6 - ...ios-demo-store-iosUITests.release.xcconfig | 15 - .../Pods-demo-store-iosTests-Info.plist | 26 - ...o-store-iosTests-acknowledgements.markdown | 3 - ...demo-store-iosTests-acknowledgements.plist | 29 - .../Pods-demo-store-iosTests-dummy.m | 5 - .../Pods-demo-store-iosTests-umbrella.h | 16 - .../Pods-demo-store-iosTests.debug.xcconfig | 11 - .../Pods-demo-store-iosTests.modulemap | 6 - .../Pods-demo-store-iosTests.release.xcconfig | 11 - demo-store-ios.xcodeproj/project.pbxproj | 18 +- .../xcschemes/xcschememanagement.plist | 6 +- 25 files changed, 520 insertions(+), 2666 deletions(-) rename App/Navigation/{Domain => Presentation}/NavigationManager.swift (100%) delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-dummy.m delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist delete mode 100755 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-umbrella.h delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap delete mode 100644 Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig delete mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist delete mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.markdown delete mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.plist delete mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-dummy.m delete mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-umbrella.h delete mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig delete mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap delete mode 100644 Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig diff --git a/App/Navigation/Domain/NavigationManager.swift b/App/Navigation/Presentation/NavigationManager.swift similarity index 100% rename from App/Navigation/Domain/NavigationManager.swift rename to App/Navigation/Presentation/NavigationManager.swift diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index d9e1b9c..f5b391c 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,774 +7,335 @@ objects = { /* Begin PBXBuildFile section */ - 000B92572AB3BA2EF78F29FC06720F72 /* FontFamily.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3608D39B06183B948806E8EF8CC4845 /* FontFamily.swift */; }; - 00E4A44ED57BE79A80742EFB71221A8F /* Coverable+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBE7BB19A4817A68FC4C4F6FD47397D4 /* Coverable+UIKit.swift */; }; - 0170EE86BA8B1D7872B62745E0C01BBE /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A4C76575F957CF7FF3972130D58A634 /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 023934AA4CE4DC87CF03A03C73ECA714 /* SDDisplayLink.m in Sources */ = {isa = PBXBuildFile; fileRef = B9D73BB06718EE0ED3AA135424012A3E /* SDDisplayLink.m */; }; - 0334759C415B8CF146E61AB99FE69227 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5CD261183F527F9CCEE033F6D042CCB3 /* Assets.xcassets */; }; - 03FE09B9F7504CA3AE5116F1AA698DD7 /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = A7CCF7778104AADB2758AF4CEBDA340C /* SDWebImageError.m */; }; - 03FFFE029584CC21DD2FDC4369224B1E /* NotificationHandlingServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3A4DBF13FAB22ACF605B960D791CCDB /* NotificationHandlingServiceImpl.swift */; }; - 04FE5E229D14053DDD6AC83FC3D9AFC6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; - 0529F5E309FEF38A1C578FBC56EE042E /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 609A44AA239B50B276698311810DF46C /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 05438BA0424A6EACD940A12BADEA800A /* UIFont+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6882D4A05CE1AEF7EBD19E019E3D1D9 /* UIFont+FontInjector.swift */; }; - 05921ED246B06FE8677425ED82B6C032 /* TBTextConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2158DADDE006E15A6B82206F7E1E5A /* TBTextConfiguration.swift */; }; - 06DEC5667C8AD8AD090B5B3817193625 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = D557FCA56AFC2021F32B40BC6AE7328F /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 077CADF6F924345A3E25E7D7003BBD5E /* URLSessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E55C9080F6947D033E6CE6E6A43847C /* URLSessionQueue.swift */; }; - 07863507770757C4059FD22123EB757D /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 81A7464CC9CCCD0F6CEAB02954C74B71 /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 08A9406F1F5800998D7CD7C1C4DF870E /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = D60D48DCE60F43070C743D0563F167BC /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 091DF2ED562F9F9107EF807638E22662 /* SearchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C0EEC89204EC719332D585D5E222E61 /* SearchResponse.swift */; }; - 09BDBBF0B88B52D2ACBB454BDBA94CAB /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = 65C49FAC640F96CEADE5484866E0FC4E /* UIImage+MemoryCacheCost.m */; }; - 0A1E121A8F4DAFDFBA2C6551AED0B082 /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFA328C3A9F9D9DA68AF6E8DC309DDB4 /* SDImageCachesManager.m */; }; - 0A45B5FE1BE72B7672F5B52CD2DD67FB /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = B8531EA1CC88039F9D35056BBDB103A7 /* PrivacyInfo.xcprivacy */; }; - 0C24DB1B347FCDCDA9B579CBEA896B7F /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = A9E9CD98B980FB05A787A2A69CFBF17D /* SDWebImageTransition.m */; }; - 0CFFB84337D831CA8EF3617D7DB3772E /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31C677B04BBC412F101723A7541968AE /* Loader.swift */; }; - 0DDBFF7516C2F40018EB5DEDADAA268E /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B38071E71CDBC65FB0D4D71CF0F240A7 /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0E3E4B48C26FF73290F17C1EFE6026DA /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CC320234FBEEEB88843D7C10B8E7556D /* SDAnimatedImageView+WebCache.m */; }; - 0F2C8EDFFA5ADD894DC8D59811AB5B95 /* StateObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F374469A65E69F71CF1A960B8DE8DAE /* StateObject.swift */; }; - 0F50D04988DAEFAB5D74706EE6591588 /* StoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78AC9897341C6AD6139546E65E3C671B /* StoryViewController.swift */; }; - 0FC5A479554857FC38A3C8753351191E /* SDWebImage-SDWebImage in Resources */ = {isa = PBXBuildFile; fileRef = CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */; }; - 1016ABA1F6A6BFBDE0EA9FC87B86A858 /* ViewConfigService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42AB298A5E3CB9C3744EEB483D776066 /* ViewConfigService.swift */; }; - 107828081DC817509AEA4BC0755995CF /* Transition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D89D1669ADB46DF58317A31AA0D920 /* Transition.swift */; }; - 10DED49C2B45A5EA8FA6968F1AE7D28E /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E3BECA1A98E38D6A4281546005B73B48 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 116875A435A6C285919C97C0AE6DCA28 /* SDImageAWebPCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 913A2C2605A42A57859DA310AC8C704F /* SDImageAWebPCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 13EAE9F36834227AC6603F76D54DD1D4 /* SlideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A684C681F875FE1D6779FA17B5C84369 /* SlideViewController.swift */; }; - 14242A0D3156633A69FB084B10C60EDB /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 482071A65FE0E3F977402AE06FA26155 /* ImageLoader.swift */; }; - 142E1D597048C8800BFA18FD4A9DD701 /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = E557D339D8D4F28B0349B09C6C53DFCC /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 145165256BC172DDCDC0575DC1D6D3F3 /* SDAnimatedImagePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = F27900774BD5451523048BE1D45BA68C /* SDAnimatedImagePlayer.m */; }; - 149FDD80A26F399AFBD57325998EFDF6 /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 77DA9FAF14BC95865EB72E3778D3DD5E /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 14CD7E5A556FE8ED2CD06E81839F3B0E /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C823347DAB1A2B3C3EAEAFACF196622 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 14D4D1A202CB5C785E18D2ED9A93F81D /* StoriesSlideReloadIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2441B4F7FE69F4332827D34054B38A /* StoriesSlideReloadIndicator.swift */; }; - 1501440AF1C85CB575F269E26BCEC459 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = BA06266BAF144C3649CAA2E2C46C9386 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 155C4149B624787E4BAAA07B1D4EBD39 /* REES46-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A95D2D8B4A55B4954DFF4C2BE59121C /* REES46-dummy.m */; }; - 16E7B447883B3E6CD5DA0C0F799AEE09 /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 12FBF0A87753C1C15550A9EDE725073D /* SDImageCodersManager.m */; }; - 18BA7C889427497D1A009D85662C46CE /* SdkGlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1313A8AE0C4379298D7EF36BE6AA65F4 /* SdkGlobalHelper.swift */; }; - 1905EBF3E70183BFC8580F3819F692CC /* NotificationHandlingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5FB4BE9DAD06FEA5F98A303DCDA7ECA /* NotificationHandlingService.swift */; }; - 19EF8FDECF0A3B0DDF44ED4B7393C865 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C4114AD9CA9739A7AFF00200C9E5FF /* Indicator.swift */; }; - 1AC07A8630B73493200FD547678823F9 /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 72BAC27599E684B921A906800DBB9B3E /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 1B6FDB2F5513BFAA3FB1BB1B851B236F /* SdkImageReloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0CB1CDEA4C5E4895994FB47085D4E3 /* SdkImageReloader.swift */; }; - 1C778D789F4B0897A6037CB978826072 /* RecommendResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9917CE73936AE2F6F9845457B644BFDB /* RecommendResponse.swift */; }; - 1D0FCF6225378C95A3246107F648C538 /* TexBlockConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505853D80AB9D71C6B962F6B106CA899 /* TexBlockConfiguration.swift */; }; - 1D361EE4E09C00F9148CE67CCD306D29 /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DD3508B88FE26F6A3F11E3592EABE76 /* SDWebImageCacheKeyFilter.m */; }; - 1DABF66E97AD95FCF260BA3176E86685 /* TrackingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F8EDA1E36291EC7D5833D2F1347675F /* TrackingService.swift */; }; - 1E35871E2E937C15DD42093DF742998B /* RecommendationsWidgetViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8530AFBFB841B3BC722B46A2526C34AA /* RecommendationsWidgetViewCell.swift */; }; - 1EADA61A88A52EBF1F841282FB177F9D /* SDCallbackQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = F7F41EC0C09AF0533629C82C319871A2 /* SDCallbackQueue.m */; }; - 1EC1EB5F3B98D4BCB6A057344815682C /* SDWebImageTransitionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 50CE6E565037959B2AC4CEB87052B390 /* SDWebImageTransitionInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 1F215B81847B4CD4B36342CE793CF473 /* RegisterNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE2DC5138E439FCCEC29C8B4AD17B2D /* RegisterNotification.swift */; }; - 20AED63279F202C3174FE802C696B9A1 /* VideoDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACC7F80B4FA266A86011287DD80262CC /* VideoDownloadManager.swift */; }; - 20FBF01A41A066522B5DEDF65AE31666 /* SearchWidgetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 884C25BFA10C3C4A63320C3A5B7797EE /* SearchWidgetExtension.swift */; }; - 210280AA598517CF989A582413B25FCB /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEF1E5F2C7F33C39B10991E4C2386C7E /* NotificationService.swift */; }; - 216F659702FE03B7987F7AE153DC0185 /* ColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D18ACE031C79021DEEF21AB4FA0A05 /* ColorExtensions.swift */; }; - 217043CCF240C170FBA603D1CD39C65A /* TrackServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCAB701B1958806B999110D217BE4269 /* TrackServiceImpl.swift */; }; - 2177290E4AC6DAFDD746C8BA7EEF8B45 /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B0B4109307136D655FFB5991A75A5DC /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 21A6687D0BA31E63C8800D2C9F20CC70 /* ImageLoaderError.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABC60206222E6A71DE4443E593C4CBD1 /* ImageLoaderError.swift */; }; - 2420216F493F3D0E2038DDF1E8E8C7C6 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 65AE02622EA56AB3A84F2D7776259B6F /* UIImageView+WebCache.m */; }; - 246ABC711084B7E4CC7B4A27989AB69E /* PushTokenNotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EB8ED5238870DEA90CCE8D421113FC2 /* PushTokenNotificationService.swift */; }; - 24A6C06C7F607033FE51591F7D66A682 /* SdkStyleCustomColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AFB98DB5CEBD45082FDCFAE8E610335 /* SdkStyleCustomColorSchemeAwareViewController.swift */; }; - 25476F441F2CCC8C9608477DE5A0A44A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C58E5652FE52EBEEC8CFECDDAB7690EA /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */; }; - 267E6BB583A54AA6BB91C1AAA9109BC2 /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C410EC9FA1D242644C94FD5BB0DCC7F /* SDAnimatedImageView.m */; }; - 2868EA3EDB5D52CB4B54C1C280421595 /* StoriesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD12F79A7009CE1C816858354BB28B16 /* StoriesView.swift */; }; - 289E24AFFFBE57287ADD4AB22F17A4B9 /* SdkDynamicFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4145512C78F59C07A8ADA786E0C0D0AE /* SdkDynamicFont.swift */; }; - 28F8EF2658BA628CA99983594C415D09 /* RecommendationsWidgetConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = A918F55072B1534B417AA4F202B62150 /* RecommendationsWidgetConstants.swift */; }; - 2953DE694482D1C43BBCDE5F4B7492C1 /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB1FB349361E086596E4A2F0DB86B38 /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2A3ACC61257E4E88DE782C3CD1BC0CCE /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = E212E372E7728F282D004A4FE04E8399 /* Assets.swift */; }; - 2A72F0DC1AF8897A89626C3E81B611F5 /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 65A52C786ED0456F2DD0D7E95F90F8B8 /* NSImage+Compatibility.m */; }; - 2D32B1BFDFC57E7BAFF6B73C30F42DFC /* NetworkStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC6D190307998671654651402F1CE476 /* NetworkStatus.swift */; }; - 2D521703994D252F0E6D24F7D5D53F2E /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 029A00422820699B153B476831592226 /* SDWebImage-dummy.m */; }; - 2ED0D7AE2F2531563EBC0135C853AE8E /* Pods-demo-store-iosTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FB9E93A5A045ADF557378B54D551DDE /* Pods-demo-store-iosTests-dummy.m */; }; - 2F0830F8256C8DC58F0919A5D5C07C06 /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 93852F96F75724CE63ED467E5C544270 /* SDAsyncBlockOperation.m */; }; - 2FA9B480039C913FD3352BFF4DDCAEFC /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 7180342E0BEDD11728D7A13F83122F1A /* SDWebImageDownloader.m */; }; - 31454EEA78669CAFA2CFD0E18609F80D /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 94A8EBE7ECE2DEB427F6FEE4AFAFCA25 /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 317A2085CE162CFE3EC3ED9FB3514201 /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = C2480646E98913D695E05C0FD776B508 /* SDImageHEICCoder.m */; }; - 31C998E878D5A0F686B187864A236183 /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = B8DAA896D2C34C91B3625C9591FA0310 /* SDWebImageCacheSerializer.m */; }; - 34EF675DD2AB530F8C16D96F7D198E33 /* RecommendationsWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A872CADF5D680724A3A6EFB82C356231 /* RecommendationsWidgetView.swift */; }; - 3728D15DC1AE882F703003FDF14D52F0 /* SdkStyleColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE1161FDAF59CC1A383B889BA00AA0DB /* SdkStyleColorSchemeAwareViewController.swift */; }; - 387C8094E1C055C789587185E97E18E4 /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C03EC13E1567E28D939C4CB1E36878E5 /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 38AFD9246E6995657D1EDE99EBC6CEE5 /* RWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A24CFBF01D0409EB666BB081480520E /* RWebViewController.swift */; }; - 38E10CECD2C6C59C0CCCEB0A78D40CC1 /* SDFileAttributeHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = CBD844A1FA21892ABF089EC57D9B69A0 /* SDFileAttributeHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 39AE9A2AD1B349F39699B3578E56BF00 /* SdkStyleCustomColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EA0880546F5C765AE10ECC6D442C87E /* SdkStyleCustomColorScheme.swift */; }; - 39B39F80D3373C1F6C7BAB344310A1C9 /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = A18B7AA27C00B2187B45D6ED87A6451F /* UIView+WebCache.m */; }; - 3C0BFC786BED0FA23523678B73728154 /* RWebViewController_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 249102CF81952267B123A666190DF430 /* RWebViewController_Extensions.swift */; }; - 3DC4D729B8A196329EA5A3DE5EFA370F /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 39D601084E48E12065CB0FB34E2814BF /* SDImageCache.m */; }; - 4146EC26D7DDF32ECAE445B119479D30 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = C4975126590177D7FBC347D4110732AB /* SDWebImageError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 41822CFDBD9C86FB87B351EBFEC58073 /* ProductsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5A6FA54151953B32A9EE306274468A /* ProductsButton.swift */; }; - 41FF38113D3DE2C65D63D29AD0055EA1 /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E5615848B998FCBF7B3C601180F6533 /* SDImageGraphics.m */; }; - 42089E46D48B162B0AC3566F846764BE /* NSBezierPath+SDRoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = 828C3606A950C4AAE88974C9EEB6B09E /* NSBezierPath+SDRoundedCorners.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 421344238409756CF07372155FC3421C /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 05D020DF7555623CE56D7342B92089D6 /* SDImageFrame.m */; }; - 4262A44B8089903161C54AD186379ABA /* SDDisplayLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D6FDAFF796C99AED706D3F44F4A7B8F /* SDDisplayLink.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 42962685B499575129CDFF254E8FEE4F /* SDAnimatedImagePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = BB5652D277DB8F8932201F454562E551 /* SDAnimatedImagePlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 42C4319E1A92EB4B2BB51E51D1E14D1F /* SdkQueryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B17D8267AF1AFF8A10E7F8F01C219FBE /* SdkQueryBuilder.swift */; }; - 43DA4C5AD87FBD2334FEED50DD133D4F /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5120A81E18A4375BE2C935A99E02B5 /* UIView+WebCacheOperation.m */; }; - 43F93ED54EC176295EF366A740E01172 /* SDDeviceHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E6864BAD54FAD2C378EF2E1230E626AD /* SDDeviceHelper.m */; }; - 449F6DDFDA01061F0B001BCB31ED4455 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 119A30548ED1F294262DAA76E2314B8F /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 44D5997FBA69F54DF6D3B0D068C7953D /* ImageLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72B32CD662708347A951F5E371409877 /* ImageLoading.swift */; }; - 44E68CF722456B675ABF6D715C514AC6 /* SdkStyleCustomFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3973838B69DCC92B65F9C777E03C51 /* SdkStyleCustomFonts.swift */; }; - 45C47D2E7DC2AC0332CDD2323355F483 /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0BDF6EBE4794388029C368DD323927 /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 45EB33BB9930BD56B2C0E09F8F7598DE /* VideoDownloadObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 677CA2D06DDE5144350FEB4B400D5B12 /* VideoDownloadObject.swift */; }; - 4624831E1C1A912E31BA028AD4C1FA7C /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BAFD4926F5BEF0E7D2592ACDAEA47F3 /* SDWebImageDownloaderConfig.m */; }; - 46DCEDA235C161852B926A0EF943EACC /* Data+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 343136082AD2F8FDA2DECD6015D2A952 /* Data+ImageLoader.swift */; }; - 473ABA01905DAFFF8D07DEB476A9D75D /* SdkStyleCustomFontSizeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99BAC905278C2BD1A35C579C966CB859 /* SdkStyleCustomFontSizeAwareViewController.swift */; }; - 480C90679D30599E736F886A01D5EC27 /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C625FCC124326FD82C5D1D495462CBA /* SDImageLoadersManager.m */; }; - 480EB117CA823BBA38F531F048DC5D9B /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = EE16E01FB33A81A9861F1386657A95E2 /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 48A2019E7B6882B3B0C6BFF5A49E2C24 /* StoryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9895A84C8FC7A836604C935D35C99AC6 /* StoryCollectionViewCell.swift */; }; - 48F66F6D3C7386E5595633DE1311F129 /* UIImage+ExtendedCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = E8576C6FF926E093E1A16B8080253AED /* UIImage+ExtendedCacheData.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 49DEB29E8A22D8F5F67907D19A906F18 /* SearchWidgetTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C2819399D5A22E8D3E3D2E88DF6D2FE /* SearchWidgetTextField.swift */; }; - 49F80B73F8E31BDC1CD2986181817AD5 /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EC2D0B5064579CD0BF56EAFC0792E9A5 /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4A1C144BA28F389620F8656FF5DA412A /* SDWebImageSwiftUI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5ABAC2D6EBFC4451BB54CDBAB40DADA3 /* SDWebImageSwiftUI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4A88FAAE5AFA7650E7A2E1F1C31B4E0E /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E21105E533FF43048ACF1009CF05F4F /* SDWebImageIndicator.m */; }; - 4BC4C53C7CA74C73E4841FC2CD3E32C0 /* ActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BBD8F1415E27C7782213FF9A17A0355 /* ActivityIndicator.swift */; }; - 4C4F24464D027DE21E5FB02DEB40D8C0 /* ProgressIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01E4D39E9A3693888369174B21333E5A /* ProgressIndicator.swift */; }; - 4CAA295F8BB967445E2273FB5A53769E /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = CA91031AD1B1A421B1E129492D976C39 /* SDImageLoader.m */; }; - 4CBB873363589E883524864FFBFE17D2 /* CarouselConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD4ACEF0B3F4E25B59359F4A0C563E1 /* CarouselConstants.swift */; }; - 4DF1CC4FC7EAEB5C38F32AA1C39C5A07 /* PushTokenHandlerImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C3BF456C51A01CDF0D5F36F822566AC /* PushTokenHandlerImpl.swift */; }; - 4DFCB3D9623FCA43D3E1BFDA528EB587 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C0B64B639FD80A20B3EEBE805B0C5B2 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4EC633971567BFD6384859B76E1276F1 /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C1D8A05C1E4B2166E04A020BADD37E6F /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4ED0BD508A169B5BD2FC92A540597F0F /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFC11AC8252C36F4B476D4E56652E41 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 50856AC35DAB64C96C34BC588BB0F7FE /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 01949FADB1DF51BC47166556FEBFE773 /* SDAnimatedImage.m */; }; - 51F93BB4A8A45852EB003139085145C4 /* UIView+WebCacheState.m in Sources */ = {isa = PBXBuildFile; fileRef = 50E032345F0385B49508C224E5FAB205 /* UIView+WebCacheState.m */; }; - 52304420361292CCFC74D707D76A89E6 /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0950384B82209DB75A156574D201B451 /* SDDiskCache.m */; }; - 53758A7E257766681ECCDFEE4288C35D /* UIFontDescriptorUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D34EFF0527DB3EBA71D8FB52A3425C9 /* UIFontDescriptorUsage.swift */; }; - 53FD279BE6D27EC46BF71734B84F51A8 /* SearchWidgetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 200E09C6F7210CD35EC2DFC6CDB47964 /* SearchWidgetViewController.swift */; }; - 56369E2C8C8213D51A72552106A9C264 /* ImageData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E25B0169BDF269969E4586C420B6160 /* ImageData.swift */; }; - 56B8E8C41883E4FC7F171F62949E04BD /* SdkStyleCustomColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9183AB97B95E41B7E371EC4DE2A2DF30 /* SdkStyleCustomColorSchemeAwareView.swift */; }; - 56ED612030120A0397156D40650605F1 /* UIImage+ExtendedCacheData.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C7BE26FDD9A42E5961777E59579165F /* UIImage+ExtendedCacheData.m */; }; - 59C42C2827C8752D9488E217C5DDD820 /* SDWebImageDownloaderDecryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = CD162A74396D56FCB345484D359792F2 /* SDWebImageDownloaderDecryptor.m */; }; - 5A234484C926A75BA80099AEC8CC4611 /* SearchWidgetObjectification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017C9D4AD83B9F48EC84C7462F77C1C2 /* SearchWidgetObjectification.swift */; }; - 5D9A37A8D628C6BB9FCA2EF74E352C9C /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 721D6D167B5F76DE3399711D8B8F1980 /* SDWebImageDefine.m */; }; - 5DCEC664244099368ABFA62172F815C6 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DBCC89758D18BE019ACCF9F4FB1DA29 /* UIColor+Extension.swift */; }; - 5E8FB1E21260A9D830B33A759E4627F6 /* UIViewController+PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26642982FB2133E4B543A2C337BA2E9D /* UIViewController+PromocodeBanner.swift */; }; - 5EC172A3A600E629AF4AD75C304DA2C9 /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E75A98569DB590F251712101F570DDF /* SDImageIOCoder.m */; }; - 61BF5909F8FFEC516CA898FDBD838959 /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = A7ABCAC767B04BBD3402CDF2E10D7BA2 /* SDImageCachesManagerOperation.m */; }; - 62796BA9266A3343CDB31913D051B1F2 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 967A3684F3A19FB31E7EEDBCEE8E376D /* SDWebImageCompat.m */; }; - 62B9FB2BAB0F70C3705B33D50FEEFBD2 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 22AD885D3D57E81A6E96E0E72504B6C8 /* ImageIO.framework */; }; - 63266AB53E590025F95E8472A2A75E66 /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 385D24232663F9F21F5D0C0F0DA7A763 /* SDImageCoderHelper.m */; }; - 6447E67AD574E06A2B69690B0B29BC89 /* SdkActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 742684B14C7933490E61EE78305318F0 /* SdkActivityIndicator.swift */; }; - 65550AE399A68358D1031A676C06A364 /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 48F8626ED92FAA27298CB92425BE0288 /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6581039AAD4BF84784812194E353F279 /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E183E61E8F24778ED0F299E9CDF7098 /* SDInternalMacros.m */; }; - 66724EBA9152FA748810F92BAF9F80DC /* SubscriptionServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF5C7C77DE2A108B989B598603A71255 /* SubscriptionServiceImpl.swift */; }; - 67752F2EB4D3E1F9BC130046FB76BCE4 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 3DA2EDB38D52E3A594FD04DDF1FC4DD8 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 67EAF96CF5371E0EDF2F1976BA0A8DA4 /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = BA7C2D0D5068F1BBBF48D4DECAD5B3F9 /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 681A5A71427454B12747295ECDD0D24C /* NetworkRadioType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CA7AD6F6144B1897DD6FED6EF086315 /* NetworkRadioType.swift */; }; - 688EBC4BD1F3F76ECA4C72FEC494D84D /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = B2B17F5BDD1F69B5C7C4A70BF44675BE /* NSData+ImageContentType.m */; }; - 6B2576EF432DFDD2422B66193CED0582 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 89E336EB6E5CA8CBA413FD162AC5E781 /* SDWeakProxy.m */; }; - 6D117033384F7B7E733B92455725CFA0 /* ImageViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBDC88DD3BCA0C8036016944005827F /* ImageViewWrapper.swift */; }; - 6D98092F5BB4629EA76E90BB0D5A3A1E /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 95A5032C5249239170C6C56B8BEC1620 /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6DEFEFA0016D535ADBAD7B823B156E7D /* SdkFontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE98821C5B55540B75A1E35C0113ED01 /* SdkFontInjector.swift */; }; - 6E6B81FC768C9444F194B10B259FA696 /* SdkStyleUIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A915682692C4576BD1B3382EDD4A31 /* SdkStyleUIApplication.swift */; }; - 6E8F67D76FD92D5C1136F15A50BF9EB5 /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B3CD2DB27E7FF6985AF2F043DFBA34BF /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 702044FE1045183AEA5C6DD23E0741A4 /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 63BAD4815E80530574567C6C941B7D35 /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 71A9026CA64F36A0A121DD4060BB5BB9 /* PushTokenNotificationServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0452D8A6588B9906902D3781A81B7E02 /* PushTokenNotificationServiceImpl.swift */; }; - 71CDDF6B42C2D0D1CC5A94AB0BE99E23 /* UIBezierPath+Circle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37D29315E37F8FAAC6F6BA17562D6B51 /* UIBezierPath+Circle.swift */; }; - 72A17042882104723E9CA92A14D80CC1 /* URLLiteralConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA90567D2B0F1D5538610C5715BF9684 /* URLLiteralConvertible.swift */; }; - 73BBCA8BA8E0D143006C01813759AC18 /* SdkStyleColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9686077291842E1BE3E92A4CBB2D01D5 /* SdkStyleColorScheme.swift */; }; - 78AF773DEA2008B6FE70C40246E48D18 /* TBAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8EA8AFF4FC1C0B82EF0EC412051B3A /* TBAppearanceConfiguration.swift */; }; - 78DB4B4F958566E37A72D04F973FEBED /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = DA1EBEE93335802768CDDA7AEF9A60AA /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 79D2610CEAF017AD0332D7F90672483A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; - 7A5E9FDF0D7B71DDA61A79F171D0DBDE /* SwiftUICompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A8808B6DC1E046BFF8C17824E0A56D3 /* SwiftUICompatibility.swift */; }; - 7ACAFB8878D787E4FB3D716750C91E8C /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 36F5D2A790ECA81D45F8B61225A715D5 /* UIImage+MultiFormat.m */; }; - 7B10C150677B6261882D5C0C1297F00F /* StoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C54D76765D76345DEE85C2577A0BE71C /* StoryButton.swift */; }; - 7B48B4E11B3E9E10BDD274DC84A27DE5 /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CFA6F80E28B127534C67C258F67330D /* SDDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7B6078F9AEBF848D77F519AF8FBC77E2 /* SDGraphicsImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EF2C06F474A7E1365D101FD38EDD192 /* SDGraphicsImageRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7CA7335FA31F5B8BF6A8FFA433CEE3AE /* CGSize+Min.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9192461900ECBFD6FCBF2CD9D32503F /* CGSize+Min.swift */; }; - 7EB26E79BA128D1E2F994D902036286C /* SearchWidgetListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3698F76D18FEE0AB0114FA9A9D14C380 /* SearchWidgetListView.swift */; }; - 81091327D041DE2EDC26B207E3584D0E /* UIBezierPath+ImagePlaceholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAB1F97077878093D8E2B46380CF317E /* UIBezierPath+ImagePlaceholder.swift */; }; - 8150F3F396A29D249217B5B1BEF13E50 /* SDImageAWebPCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BF55A80D900FC0E395B74E5440155DA /* SDImageAWebPCoder.m */; }; - 81D05C82B68E50B5E348E31B16402F53 /* SDAssociatedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = E57F4AF8733A55E946FD8FB15751E71A /* SDAssociatedObject.m */; }; - 82239DAE4AFBA4142974FBD8EB4620BF /* SDWebImageSwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 146D16A186D47FCB0B2ABB8F0506282D /* SDWebImageSwiftUI.swift */; }; - 835A6430B8B241FF5E042D4415103DDD /* RView_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BDF4C10853BB55579BDCA649F2DE846 /* RView_Extensions.swift */; }; - 85F13CDCA1FADE0ACF2BE361CAB99E0C /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = D45C11F2FD76BEC707586E6425FF78E0 /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 86AA5A87E46FE0919A0A19BA722F4AAC /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 085AEFC7C28A15F206741200F820F38B /* SDWebImageOperation.m */; }; - 8A626CEC7CBA9E3859A3FD8B147ECB90 /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 779D3AACB3FFC5D21447E5995A7D8169 /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8AE54E966BB7B8583BF5B5BD952BDF0A /* UIImageView+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 243098A6435E355225C685FEBB0EA576 /* UIImageView+ImageLoader.swift */; }; - 8B15040F27C854C43BE632FB8D86B683 /* TextBlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2F28C758806CA9B47233D61569AC4AE /* TextBlockView.swift */; }; - 8BACD88871220B13AB285BC476A7F194 /* StoryCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8E029187C788F90556669DD25F177EB0 /* StoryCollectionViewCell.xib */; }; - 8BFA637561CFFFD755077574D42FD312 /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = CB360C271FF5A9ACB1881BD995CD3EA9 /* SDWebImageDownloaderRequestModifier.m */; }; - 8C1057083C31FF842CEEEF864911D1A4 /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0563BCB9D5C982E10E671FD25E79729B /* UserSettings.swift */; }; - 8CE4BF9FB621CF956CB6262F53B07C83 /* NetworkStatusObserverUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7327B126F904459685ACAB5BB188BA92 /* NetworkStatusObserverUI.swift */; }; - 8D05D7544E96EB065022900C06BD8BDA /* ReloadButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 166CAE72B58135935C298B971F0E810A /* ReloadButton.swift */; }; - 8D05ED41A2FF6C70B78706F15F6098FE /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7640F97184806A9AE6D038E779EA1B9B /* Image.swift */; }; - 8D50E5745C533C21E8EAE239F4E59FC3 /* PromoCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE90C578EE2F80BD131A4785E590A767 /* PromoCodeView.swift */; }; - 8D739A0E851C00DBE71DB9A2667D4588 /* SDImageFramePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 66FC775DB87F1F5E3A252D7C0DB818ED /* SDImageFramePool.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 90547932EA32076C22D800BDAD445A1F /* SearchWidgetCategoriesButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3739778E07523A3175EF42603E6D8CD /* SearchWidgetCategoriesButton.swift */; }; - 90E9C7C7189370C95BEE1EB205BB4CDB /* WebImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51DD1AEB1ED0805DAE2DB69242F0495A /* WebImage.swift */; }; - 91218968238F58BBB3E84DC5C8A25854 /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 693D0696C64D9BB4F4BCC7D548564FB8 /* SDImageLoader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 92A408FEDAA401A41A7A235717062F82 /* SDWebImageSwiftUI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 19D828BE41B227FC99AB956B45805E0D /* SDWebImageSwiftUI-dummy.m */; }; - 92E5F181D61E15ACB5931E80F5DDBBDB /* Stories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C45D4459990807F360105B4C2BD6B5B /* Stories.swift */; }; - 937D6966FD44A9A799ED6574EC78CC4F /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = B7144CB0515E7DD6254EBD33FB925996 /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 93C9B6D59CF164493225BB90330ED9CB /* SubscriptionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A5C1DEACE9944682E1C538D1E696FE /* SubscriptionService.swift */; }; - 9550440BCB953E622CC97EFB797E3C07 /* StoriesImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 182B458C0DB3AF459F99260B902F1E3B /* StoriesImageLoader.swift */; }; - 959F820757DC746FDF7A3CD739523627 /* OnChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16A84119C929C7999C74B194789C2339 /* OnChange.swift */; }; - 95D0B99765E4BDDF38FF3BAFE1B1395E /* Pods-demo-store-ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C72C00B34C83096ED3147E8AAAD8EAE /* Pods-demo-store-ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9653EFA6AC3DDF7D0F90B549C485C9F9 /* RequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4726050844C07463EDF54E7B9C36FD61 /* RequestOperation.swift */; }; - 96A5AC180E6F93402E7E57E2F592A3E8 /* ImageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC2860E468BFF18CAD7EED73F4C53D8 /* ImageManager.swift */; }; - 96F98929440C537CC83107C3747D6480 /* CarouselCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C131B5AD1AE17B1E7669FF4AD7F634F2 /* CarouselCollectionView.swift */; }; - 978A73763500D7A9A4A0F878716CAC12 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; - 9997384531CF394E13FCDB94F6354C9A /* SessionDataTaskProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4839081A2EE7970A91843BDFB777B4F /* SessionDataTaskProtocol.swift */; }; - 99B5996FC38567CF3ED494041F3E3BF1 /* Operative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9560E66C017A7924466F9F2ED43805A9 /* Operative.swift */; }; - 9A19F8AF4CE027DF5271D2DAF670014C /* ImagePlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E474B6985E4834A59099E70AE48070CD /* ImagePlayer.swift */; }; - 9AF09A8AF1301B3B97DA1E5B76A19645 /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = FED305701BEF72D8FA302970F6C0F799 /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9D19EE689D681F8493419C2CA1FB6D5E /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9B08A53140D0BE71718A5F3E03BE881 /* UserDefaultsExtension.swift */; }; - 9E1DDCCA92AF0B9F1D1C6A670877FF59 /* AnimatedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43C26A9ABBBD30D24AAC918843657EC /* AnimatedImage.swift */; }; - 9E2500E6DDD2ADAF4D773649B7A360C9 /* Pods-demo-store-iosTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E23C6A0C21CCDEEED0DAC1168FC8DE30 /* Pods-demo-store-iosTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9EB6CDD8F5E5570798DE4D2C6D9EEAAA /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = DDADBA9A1CB5524DE20EC11A40E0AD62 /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9EF20C969A3D26AFF74A35A376270C62 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BC56B47FC5C9CC44C3585CA3C9561D9 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9F9BC40A239CEA83F849DDC2C4F375A7 /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = B9453C5A02D3E773A8845189A2EF3E5B /* UIImage+Metadata.m */; }; - A02EEFC96DF92AB78F933CBC0CBAFD92 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 19CB0A67BA30881F8E68E3431B761F02 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A09249CC7461C9EC873C4AB82C16124B /* SdkFontInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2238B2DE53D04D375D323CDE28F19A0F /* SdkFontInstaller.swift */; }; - A150E969EA20BF59B3CF070A4240F180 /* HashStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6F7531755893C43B30BF9E19D560519 /* HashStorage.swift */; }; - A1623A8868E9AC8BBEAAB9BC0421F463 /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = CF3EEBF138E337F258E50A3999B2C0D4 /* SDImageCacheDefine.m */; }; - A1BE35C271D2217C0B4232D0AB0C8DA3 /* StoriesCollectionViewPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2B921ED7BF87B51971BDCC684F43C49 /* StoriesCollectionViewPreviewCell.swift */; }; - A20FF0BB2984AC66216074B1EFBE8F98 /* RawRepresentable+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC97720D830D4D8C05B9307B8708AF6C /* RawRepresentable+FontInjector.swift */; }; - A2D682E7527D83413A35CA870AF7B766 /* SdkApperanceViewScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7CF07AF8F15177CC07ABE9749506EBE /* SdkApperanceViewScheme.swift */; }; - A2DCD1D36D93DFF9EBA04C27FD6523E8 /* SDAssociatedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 79161E2AE3EBB7A8C5037E3821873380 /* SDAssociatedObject.h */; settings = {ATTRIBUTES = (Private, ); }; }; - A4A3E992003457010F66F3D6BCC2A5C3 /* SDWebImageDownloaderResponseModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 446B5D79A9B5EFBF90DDBEC5B0006A76 /* SDWebImageDownloaderResponseModifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A4E7010E8D87921AE6F9D645B7CDA53A /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 24783625BE78E3C757479BA61BFAC0A6 /* SDImageAssetManager.m */; }; - A5234B6659FC63CB96F6BC93C9D05DB7 /* SimplePersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2391013284B0804D94D42F1224978E1 /* SimplePersonalizationSDK.swift */; }; - A5BBB698DF1D4480FD47F982C5252205 /* SDCallbackQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 66892A39AD576FB00A0E72D743C5B5F4 /* SDCallbackQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A84F0846ABE5B8D3E87FB73531F706A4 /* LoadingPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AB3A266BBA953A7F6B46B26085D6C56 /* LoadingPlaceholderView.swift */; }; - A8A9DA6C580EAE3E50B590CEDF0A45CC /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 791F99A8CC2762A65CBEF72F99CBB292 /* UIImageView+HighlightedWebCache.m */; }; - A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 768349C5A7EF0A50AC2FEACF23C4EFD5 /* REES46-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A969E1ACC2EEF44464751BAB8DEB684E /* InitResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB269F7C83AFFDDCF8E8834DA023EEF5 /* InitResponse.swift */; }; - ABCFB3FD321DE180968A5A0B2BB86A62 /* StoriesCollectionViewPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9BF3DE04FA1C4CA5110A837D4B2A26F5 /* StoriesCollectionViewPreviewCell.xib */; }; - AC146C49CFAC1C9EBDB2BAAF57FDD984 /* SettingsManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F269AE423D51077DA2EC0CD40577E5BF /* SettingsManageable.swift */; }; - AC32A22FA700A7C519DA105353C169C9 /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D093835AC080A50072C58F9D8F4E0A9B /* SDImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ACD7FED5646A645F3EDA3F2521156451 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F9E8DB46CE03201B31155CD1C20A209 /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ADDD26B99A6D54C00956C6BE7349D77E /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 054F9EA00DA4E6B7B90CA2D91C46007C /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AE7A9D612B96E5CADA59EFE4591DDB83 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DECD257A7D9712BFEF049E58533DD45 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AE87C2623409B5C7F73B12649F5B26E5 /* UIImage+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DE906CE80C33B4E27DCFC2A3F937122 /* UIImage+ImageLoader.swift */; }; - AEAA0FB549FD88F595F943D8CD4317DF /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 5AE0E2DC679FA76AFCBE4F10C002B5E8 /* SDWebImagePrefetcher.m */; }; - AEB0C53C27CB087C3215538B6F476A33 /* CartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D5B8E3E17032CC03AC3DA26F631C0A9 /* CartItem.swift */; }; - AF42AB272E74275D08F989B9111E045A /* SDGraphicsImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 05CB137A80B79559FF8A751F6E3C15B7 /* SDGraphicsImageRenderer.m */; }; - B08BD0363F34B4423E46FDBAB017A26C /* VideoFileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24AAE5386CBFCCFEDA6C8E44F6E48C3D /* VideoFileUtils.swift */; }; - B14B39DD5BE9A500B163EE27C544AA2B /* CAPropertyAnimation+Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC55D6A899A85EB0F0868B73A6F51F6 /* CAPropertyAnimation+Key.swift */; }; - B29CDD67B86238DFC22CB13179C4DAAA /* PersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3945BB4F984C8941E625264678DEC70C /* PersonalizationSDK.swift */; }; - B2C4ADFF7916C0CA794767779FCF79D6 /* CGRect+Center.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7E9A5DEA0D84EB96ABDCE752E5FE97 /* CGRect+Center.swift */; }; - B311644D4FB2B084755B97F9E62D0517 /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = BA638D7683BDDA60DC86AD84777743A4 /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B3768606656AAEE8FE776B7A823030B1 /* Coverable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 245CD06BD01C6A94F1C8153D1F912FCC /* Coverable.swift */; }; - B3C75BB3596FA47232F49322F2851860 /* SearchWidgetDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 567F0CCECCB2EFE5CF5E90BD862FC225 /* SearchWidgetDelegate.swift */; }; - B435123EA0DFB080DDF204A68B76B649 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FD013C1407EF41F0DB420AF3709D869 /* SDWebImageDownloaderOperation.m */; }; - B56C23C1C826628465D0881A71FC3346 /* SearchWidgetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7861E34249B83262CAAC89AE6B545E /* SearchWidgetModel.swift */; }; - B71EF2A111D54884A8BA6AA0E502B5C3 /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = ADC7B43237FE86C4ED670AA6A7264CB9 /* SDmetamacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; - B726740C01CEC8A342988863B3C6666D /* NSBezierPath+SDRoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = 58F71D4BD9974824651245DBC500E711 /* NSBezierPath+SDRoundedCorners.m */; }; - B7B3F548D939A885B87BC38F24AC9118 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = CE44DD5CCECDDF5CE93F504C6A95D0C4 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B80FCEF5ABC014B09963F4E65BDE3C41 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 156E069BEAD7BB288F1EAB97FDDD68F4 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B886B2522D2C093BBCE9844BBC2A84AE /* ViewConfigPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB6821FE781E61F57C7ABBEE79CD491 /* ViewConfigPlain.swift */; }; - BA66BD722D1029DB90B91889AE435938 /* SdkStyleColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E928DA9D56257D7E66B7FD04D4FBB6A /* SdkStyleColorSchemeAwareView.swift */; }; - BB31CC54186DDAAD89F139C89B93CA7C /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C4AC7B7715AD884E51877A463095BF1 /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BBCDC6622412DD3C491775830A55FE4D /* RecommendationsStarsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 784409CEDE904360420A93E233B1448E /* RecommendationsStarsView.swift */; }; - BCF0F618DE852A99D0E09482FE1AD6DB /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F054392BF6A08C9DBF6FB98AE4A633F3 /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BD49D731800904B988C8A771E0C1A9CC /* SdkStyleCustomFontSizeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AD6725039854C49B298640ED0545CE6 /* SdkStyleCustomFontSizeAwareView.swift */; }; - BDDD8451EC24E029EE5394AD6B29E479 /* UIColor+SDHexString.m in Sources */ = {isa = PBXBuildFile; fileRef = D33604BF63E7A1EEFE13AA897DC73B16 /* UIColor+SDHexString.m */; }; - BF0485F5C192F225E4B519B7F2793DFC /* NetworkConnectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6AE3B6A7C454F39D7DC1A21465B15CD /* NetworkConnectionType.swift */; }; - BF67904B4E6C8359A5540C1516DC35DD /* SDFileAttributeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 302A8EC471B54D588E44D73F09C36F82 /* SDFileAttributeHelper.m */; }; - BFC831FD30B89FC45404A6CBC78D2BEA /* NetworkConnectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38246598EB440279D380C257FCBCCA52 /* NetworkConnectionStatus.swift */; }; - BFD7143593CAF751E9C8344B20488F31 /* UISdkWrapLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A89615CA3748B4B574FF3BF0D984A51 /* UISdkWrapLabel.swift */; }; - C118334CFB7C43F8EFE615B0C66C1078 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 51BFD59F8F32B660DCC66F98EFD1A6CE /* UIImage+GIF.m */; }; - C204C6976B8B9ACE9797F222AA6ECCA5 /* GenericDataTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9A3B19D8F5A4D74B59E5858C18A89C7 /* GenericDataTask.swift */; }; - C2B0B7C3409DC4089F347C18C2C5218A /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = E7C26425398E790B8A16DE4A3A0F5B6F /* SDAnimatedImageRep.m */; }; - C35EED1B7854674B923283BF02AE95DC /* Pods-demo-store-ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 37529AFAE21E524BB5CF8528DBDBFF62 /* Pods-demo-store-ios-dummy.m */; }; - C3B214337422238B6F16DDD4D83FE86A /* SearchWidgetMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F180D6C6E0768F6A5BC4E1257E5AD297 /* SearchWidgetMainView.swift */; }; - C4F6E2A79BD3990086848911AC8B7F89 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 22E9C09EE96235DC612E7FDB70D8EB98 /* SDImageAPNGCoder.m */; }; - C56A825525BCBE955CFE58C7C747B754 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F1B596D47CB175EBED6915E6C02D2ED /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C737716F0120D6554E508ACD1ACA45C0 /* Overlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D5C931E8B3C42904FF08B0AA8E499A /* Overlay.swift */; }; - C77923E363A3C9D4829376BE0EB08DFC /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = C70EF61B85CB5E0C32E22E64A24C5419 /* SDWebImageOptionsProcessor.m */; }; - C800B58B3331444C8BB27C4F89D2CE44 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59F75F6EA505E9D0CB9B0B15D958665 /* Navigation.swift */; }; - C88C545BF7521C369D2602C552A551A8 /* TextBlockConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B13A2564427A5D3271A22CC081B485 /* TextBlockConstants.swift */; }; - C8A9EB5DED9F08B5FCD153955FC14E93 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C5299BDBCFF31D3A149189632F841108 /* UIButton+WebCache.m */; }; - C9042F117FB2359CFFAE2A484BCAD759 /* SearchWidgetHistoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24A037FFEC91A5918877DAF898310E6F /* SearchWidgetHistoryButton.swift */; }; - CBBF4F7A773A62DC87CF698A4CC9F272 /* UIView+WebCacheState.h in Headers */ = {isa = PBXBuildFile; fileRef = E9C5B9C0B9AC8F9C02C59534F887327F /* UIView+WebCacheState.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CBE2CD6C13ED59FC6DCA9AF08D1E2406 /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = FDF8837D160CBDE98E1A5352392752A4 /* SDImageCoder.m */; }; - CEDD87245EDA33E6EED478D04CFF3863 /* SdkConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CF075E9AF0C9F42704B25D11A12D16F /* SdkConfiguration.swift */; }; - CFD8696312B3334FF17C0412FB20CED6 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = AAC6B9F7A35D8F631BD99CED340CCC92 /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D0925D984A33493CBD8748EF9A3B91D3 /* Option.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD5541895541D62F5397A02BB8F31386 /* Option.swift */; }; - D0A994B97078D246BFD4805C729AC6FC /* SearchWidgetListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA1970B7E000CD93CD5ABDD9C90EF69D /* SearchWidgetListViewCell.swift */; }; - D0D410CA575CE4E459381557FDEFA3A5 /* StoryBlockImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C7FCEF6B42BE8D00A3F1BACC9822867 /* StoryBlockImageCache.swift */; }; - D0DBC5DD0A2D887A2940BA0329217484 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F6F6267F550D1B9B7ACD345C3E0668 /* NSButton+WebCache.m */; }; - D4316084185FD6513BC83544B2A45E82 /* SDDeviceHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C8C91A282536A9AD77BFAB844A8F376 /* SDDeviceHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D439144D48C9FE1BA35022F0A6A736C8 /* SDWebImageDownloaderDecryptor.h in Headers */ = {isa = PBXBuildFile; fileRef = D6079445C8FAC7E4FF570DA98DBD49E4 /* SDWebImageDownloaderDecryptor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D531DD839DFEF7D21041913C6B1BF95E /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DF5621E59EA431F7D24B338AF41DAF1 /* UIImage+Transform.m */; }; - D67C939C3709BFCC9711E3DAD0854801 /* SDWebImageDownloaderResponseModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = E74B0A47D66512282E1FA639A6693404 /* SDWebImageDownloaderResponseModifier.m */; }; - D727D42D3C6D75079100C9E2CDE45C59 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 31A27027A1324B45B2F6F5C9BFA7EE29 /* UIImage+ForceDecode.m */; }; - D9B862FA4640C84B16DF0E2AF96459D3 /* TBFontConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A25CA20AE6CA0E7F3C0889BC83B80448 /* TBFontConfiguration.swift */; }; - DA0591ACC058D6673CFC94A664BDD51B /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B7A6F0159639AD7880D2D68CF10C375F /* SDMemoryCache.m */; }; - DA1C286C34DC7C7148BFD027A80C9605 /* SDWebImageSwiftUI.h in Headers */ = {isa = PBXBuildFile; fileRef = FAA2A1D8B3E0092C5A2D6AACF916118C /* SDWebImageSwiftUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA38244A91BEB77E42BD4F150B807505 /* ManagedViewConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1501C7067A26F553918FA75C59C74AD1 /* ManagedViewConfig.swift */; }; - DB558A40B5AACA3DF4BDD7167C48CE71 /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9342870F1B17CE6B55C0E506E939EB84 /* SDImageGIFCoder.m */; }; - DD4972517202F35B26B7B659B095D40B /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = D7DD9C8AB753B4EE55CBE39498167210 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DEB27EE51D09D55258D69927B56120DB /* InitService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A0926E6B50E9D5ABA0EF2C4D5E88642 /* InitService.swift */; }; - DF480FFE4BD46226C855A72CD81E50E8 /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC817825B6B9D79C94B440B657997769 /* Backport.swift */; }; - E0B0ED3036DA4A0A5A0CA0FD17D1B9DF /* SessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ACDB23A88E6462C13BAA8CF2F5388C6 /* SessionQueue.swift */; }; - E0D4D74CF9A15AAB4D8EBA35D68449C0 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 0747F2B66D5854265EBF7A4B9CDCA0EC /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E0D9CD065B64C0D661B5FD42FEB79918 /* SdkStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2F7D9DCF90BD5C51C99013B92EAE9DB /* SdkStyle.swift */; }; - E35A96AD62BB29B7ABA3779606A3DB2B /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 14B77A4BA58A9F1E17C8E687B03430D5 /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - E377EFE16FB8C700C69171DD7AE4FFA9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; - E385668DBCD81215689D1543C955E46A /* SdkPopupAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27C3468CC76B2C7BB10CED3DE5EFCA58 /* SdkPopupAlertView.swift */; }; - E49668B0B739D147E3414D17D4A0BA0E /* SearchWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05955F66D9A388DB5300C283B9ED82E5 /* SearchWidgetView.swift */; }; - E501E0E956F164F9E90453CC10766DFA /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 965F1DCE80D5E47223972A8914CF7D2E /* SDImageIOAnimatedCoder.m */; }; - E5E9A039F53F6FD7F998A44451EFD9AF /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E7CAF23E69EC6B7DB7D7CDEFC96C5C6 /* SDWebImageManager.m */; }; - E761A05087F0E09F0DC407500FEE98E2 /* ProductsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCCC47E503FC830A95DAD71006D4257 /* ProductsResponse.swift */; }; - E77CB069D70FF4125B9E064B49C001D0 /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 79E8E12D344406C699B8AB3CC0B36E2C /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E7E128BBA990CA16D6C7D2E12C7451B3 /* CGImageSource+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 906C31FFD1D1B75E909C241295F4C0A2 /* CGImageSource+ImageLoader.swift */; }; - E9CC56086B144A2A4193EF27C59F6FB1 /* CarouselCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EC5479EE341C9CAE3AAC92B34E3BD4F /* CarouselCollectionViewCell.swift */; }; - EABA337CA83C9ED09E2DA7F54F501750 /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = B6DCA8DE902167DD220E0157EB047FD9 /* SDImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ED9F4F1DEDFDBEFCD5E129DA9755A705 /* PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 718751286835CE61DAC86CF985BEB152 /* PromocodeBanner.swift */; }; - F0171E13E25FD40D6B6F869966ED8B08 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FE7246FC198AE307DAD3891ADC5FE80 /* SDImageCacheConfig.m */; }; - F1F06EEE1B902B10F5D0CFD6F7A80DA1 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = EB8CA267F48ED012779151542F11CD03 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F2ACB8606ABB790DD64FE3D1C2A99AD7 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 153B813592BB94FAFB1B69B37EB2DED1 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F33A3ECCE1CA579C4ED9F9A2B3B90044 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EFEBEB2D698CB52B18D32D8A44CB117C /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F38F22B4A2A822E5BC40C664C5943FB9 /* Disk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 025A544F19BC6987E72A6A0A9B1726CA /* Disk.swift */; }; - F4ADCF115B337B7C483F9C0064646182 /* SDImageFramePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 764CCAEDDE803665E562352946EBBFA8 /* SDImageFramePool.m */; }; - F5AB8C4608DCCA8557A248A0EF9D3571 /* NetworkStatusObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 722820E2AECBDB9CE88DF1F28EDC4C2A /* NetworkStatusObserver.swift */; }; - F60F32E5C1B049086A5625B865FA75DF /* UIColor+SDHexString.h in Headers */ = {isa = PBXBuildFile; fileRef = 012F10698C136315708F93A29670131E /* UIColor+SDHexString.h */; settings = {ATTRIBUTES = (Private, ); }; }; - F685A237C47426370D2AC2956285C3E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; - F6B78FD74DB177217EB13A1C5F6E31E8 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C4A6E08625EBFD1238EB565499849E3 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F6DEE3FA2EF0113730454100EEE86756 /* StoriesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0886A006FB6D7A5B26FA5DD74922C871 /* StoriesView.xib */; }; - F83B27F3BA95658EAD242D8EC0FF4C91 /* SlideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16D28C22EDFBA5210E8F26B745E30C7F /* SlideView.swift */; }; - FA8B5D62D1F65F6083B7FF811EB32EBB /* SearchWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22DF9F8F7A569CC3F4DEB6EBC4102FE1 /* SearchWidget.swift */; }; - FACD362497B989F8C4445B5C7C340CDD /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BA417CE2D73128F66E80F6070CA08EE /* SDImageTransformer.m */; }; - FAE83A0A03CED37F7817A8B623A7734E /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 4546F55366F817C14243B677296A3BEB /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FF45293373DD3208E626AACA6EE03513 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */; }; - FF76EE2CCAF3321D9F471F7D3BC05971 /* SessionOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8239B94A327381F223C720106BF41938 /* SessionOperation.swift */; }; + 000B92572AB3BA2EF78F29FC06720F72 /* FontFamily.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */; }; + 00E4A44ED57BE79A80742EFB71221A8F /* Coverable+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */; }; + 0334759C415B8CF146E61AB99FE69227 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */; }; + 03FFFE029584CC21DD2FDC4369224B1E /* NotificationHandlingServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */; }; + 05438BA0424A6EACD940A12BADEA800A /* UIFont+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */; }; + 05921ED246B06FE8677425ED82B6C032 /* TBTextConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */; }; + 077CADF6F924345A3E25E7D7003BBD5E /* URLSessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */; }; + 091DF2ED562F9F9107EF807638E22662 /* SearchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */; }; + 0CFFB84337D831CA8EF3617D7DB3772E /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A791B748A86BE064FA80C12134F8E728 /* Loader.swift */; }; + 0F50D04988DAEFAB5D74706EE6591588 /* StoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */; }; + 1016ABA1F6A6BFBDE0EA9FC87B86A858 /* ViewConfigService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */; }; + 13EAE9F36834227AC6603F76D54DD1D4 /* SlideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */; }; + 14242A0D3156633A69FB084B10C60EDB /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */; }; + 14D4D1A202CB5C785E18D2ED9A93F81D /* StoriesSlideReloadIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */; }; + 155C4149B624787E4BAAA07B1D4EBD39 /* REES46-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */; }; + 18BA7C889427497D1A009D85662C46CE /* SdkGlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */; }; + 1905EBF3E70183BFC8580F3819F692CC /* NotificationHandlingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */; }; + 1B6FDB2F5513BFAA3FB1BB1B851B236F /* SdkImageReloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */; }; + 1C778D789F4B0897A6037CB978826072 /* RecommendResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */; }; + 1D0FCF6225378C95A3246107F648C538 /* TexBlockConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */; }; + 1DABF66E97AD95FCF260BA3176E86685 /* TrackingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */; }; + 1E35871E2E937C15DD42093DF742998B /* RecommendationsWidgetViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */; }; + 1F215B81847B4CD4B36342CE793CF473 /* RegisterNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */; }; + 20AED63279F202C3174FE802C696B9A1 /* VideoDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */; }; + 20FBF01A41A066522B5DEDF65AE31666 /* SearchWidgetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */; }; + 210280AA598517CF989A582413B25FCB /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */; }; + 216F659702FE03B7987F7AE153DC0185 /* ColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */; }; + 217043CCF240C170FBA603D1CD39C65A /* TrackServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */; }; + 21A6687D0BA31E63C8800D2C9F20CC70 /* ImageLoaderError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */; }; + 246ABC711084B7E4CC7B4A27989AB69E /* PushTokenNotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */; }; + 24A6C06C7F607033FE51591F7D66A682 /* SdkStyleCustomColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */; }; + 2868EA3EDB5D52CB4B54C1C280421595 /* StoriesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */; }; + 289E24AFFFBE57287ADD4AB22F17A4B9 /* SdkDynamicFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */; }; + 28F8EF2658BA628CA99983594C415D09 /* RecommendationsWidgetConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */; }; + 2A3ACC61257E4E88DE782C3CD1BC0CCE /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C82152B76290FC32122F96E2333F17 /* Assets.swift */; }; + 2D32B1BFDFC57E7BAFF6B73C30F42DFC /* NetworkStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */; }; + 34EF675DD2AB530F8C16D96F7D198E33 /* RecommendationsWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */; }; + 3726922467DD0501527002C0C31278E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 3728D15DC1AE882F703003FDF14D52F0 /* SdkStyleColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */; }; + 38AFD9246E6995657D1EDE99EBC6CEE5 /* RWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */; }; + 39AE9A2AD1B349F39699B3578E56BF00 /* SdkStyleCustomColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */; }; + 3C0BFC786BED0FA23523678B73728154 /* RWebViewController_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */; }; + 41822CFDBD9C86FB87B351EBFEC58073 /* ProductsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */; }; + 42C4319E1A92EB4B2BB51E51D1E14D1F /* SdkQueryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */; }; + 44D5997FBA69F54DF6D3B0D068C7953D /* ImageLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */; }; + 44E68CF722456B675ABF6D715C514AC6 /* SdkStyleCustomFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */; }; + 45EB33BB9930BD56B2C0E09F8F7598DE /* VideoDownloadObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */; }; + 469C92E04B9D2D4F8392EE02C7A39C69 /* Pods-demo-store-ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7116768E9395945F655A57DAECC1A933 /* Pods-demo-store-ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 46DCEDA235C161852B926A0EF943EACC /* Data+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */; }; + 473ABA01905DAFFF8D07DEB476A9D75D /* SdkStyleCustomFontSizeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */; }; + 48A2019E7B6882B3B0C6BFF5A49E2C24 /* StoryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */; }; + 49DEB29E8A22D8F5F67907D19A906F18 /* SearchWidgetTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */; }; + 4CBB873363589E883524864FFBFE17D2 /* CarouselConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */; }; + 4DF1CC4FC7EAEB5C38F32AA1C39C5A07 /* PushTokenHandlerImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */; }; + 53758A7E257766681ECCDFEE4288C35D /* UIFontDescriptorUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */; }; + 53FD279BE6D27EC46BF71734B84F51A8 /* SearchWidgetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */; }; + 56369E2C8C8213D51A72552106A9C264 /* ImageData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */; }; + 56B8E8C41883E4FC7F171F62949E04BD /* SdkStyleCustomColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */; }; + 5A234484C926A75BA80099AEC8CC4611 /* SearchWidgetObjectification.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */; }; + 5DCEC664244099368ABFA62172F815C6 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */; }; + 5E8FB1E21260A9D830B33A759E4627F6 /* UIViewController+PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */; }; + 6447E67AD574E06A2B69690B0B29BC89 /* SdkActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */; }; + 66724EBA9152FA748810F92BAF9F80DC /* SubscriptionServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */; }; + 681A5A71427454B12747295ECDD0D24C /* NetworkRadioType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */; }; + 6DEFEFA0016D535ADBAD7B823B156E7D /* SdkFontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */; }; + 6E6B81FC768C9444F194B10B259FA696 /* SdkStyleUIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */; }; + 71A9026CA64F36A0A121DD4060BB5BB9 /* PushTokenNotificationServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */; }; + 71CDDF6B42C2D0D1CC5A94AB0BE99E23 /* UIBezierPath+Circle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */; }; + 72A17042882104723E9CA92A14D80CC1 /* URLLiteralConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */; }; + 73BBCA8BA8E0D143006C01813759AC18 /* SdkStyleColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */; }; + 78AF773DEA2008B6FE70C40246E48D18 /* TBAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */; }; + 7B10C150677B6261882D5C0C1297F00F /* StoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */; }; + 7CA7335FA31F5B8BF6A8FFA433CEE3AE /* CGSize+Min.swift in Sources */ = {isa = PBXBuildFile; fileRef = F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */; }; + 7EB26E79BA128D1E2F994D902036286C /* SearchWidgetListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */; }; + 81091327D041DE2EDC26B207E3584D0E /* UIBezierPath+ImagePlaceholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */; }; + 835A6430B8B241FF5E042D4415103DDD /* RView_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */; }; + 8AE54E966BB7B8583BF5B5BD952BDF0A /* UIImageView+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */; }; + 8B15040F27C854C43BE632FB8D86B683 /* TextBlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */; }; + 8BACD88871220B13AB285BC476A7F194 /* StoryCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */; }; + 8C1057083C31FF842CEEEF864911D1A4 /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */; }; + 8CE4BF9FB621CF956CB6262F53B07C83 /* NetworkStatusObserverUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */; }; + 8D05D7544E96EB065022900C06BD8BDA /* ReloadButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */; }; + 8D50E5745C533C21E8EAE239F4E59FC3 /* PromoCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */; }; + 90547932EA32076C22D800BDAD445A1F /* SearchWidgetCategoriesButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */; }; + 92E5F181D61E15ACB5931E80F5DDBBDB /* Stories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */; }; + 93C9B6D59CF164493225BB90330ED9CB /* SubscriptionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */; }; + 9550440BCB953E622CC97EFB797E3C07 /* StoriesImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */; }; + 9653EFA6AC3DDF7D0F90B549C485C9F9 /* RequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */; }; + 96F98929440C537CC83107C3747D6480 /* CarouselCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */; }; + 9997384531CF394E13FCDB94F6354C9A /* SessionDataTaskProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */; }; + 99B5996FC38567CF3ED494041F3E3BF1 /* Operative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */; }; + 9D19EE689D681F8493419C2CA1FB6D5E /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */; }; + A09249CC7461C9EC873C4AB82C16124B /* SdkFontInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */; }; + A150E969EA20BF59B3CF070A4240F180 /* HashStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */; }; + A1BE35C271D2217C0B4232D0AB0C8DA3 /* StoriesCollectionViewPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */; }; + A20FF0BB2984AC66216074B1EFBE8F98 /* RawRepresentable+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */; }; + A2D682E7527D83413A35CA870AF7B766 /* SdkApperanceViewScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */; }; + A5234B6659FC63CB96F6BC93C9D05DB7 /* SimplePersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */; }; + A84F0846ABE5B8D3E87FB73531F706A4 /* LoadingPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */; }; + A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A969E1ACC2EEF44464751BAB8DEB684E /* InitResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */; }; + ABCFB3FD321DE180968A5A0B2BB86A62 /* StoriesCollectionViewPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */; }; + AC146C49CFAC1C9EBDB2BAAF57FDD984 /* SettingsManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */; }; + AE87C2623409B5C7F73B12649F5B26E5 /* UIImage+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */; }; + AEB0C53C27CB087C3215538B6F476A33 /* CartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */; }; + B08BD0363F34B4423E46FDBAB017A26C /* VideoFileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */; }; + B14B39DD5BE9A500B163EE27C544AA2B /* CAPropertyAnimation+Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */; }; + B1FF3AA160C3354557A6B38A48756E98 /* Pods-demo-store-ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D4FB2CBD68E89DAE39DADAE996D715 /* Pods-demo-store-ios-dummy.m */; }; + B29CDD67B86238DFC22CB13179C4DAAA /* PersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */; }; + B2C4ADFF7916C0CA794767779FCF79D6 /* CGRect+Center.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */; }; + B3768606656AAEE8FE776B7A823030B1 /* Coverable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */; }; + B3C75BB3596FA47232F49322F2851860 /* SearchWidgetDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */; }; + B56C23C1C826628465D0881A71FC3346 /* SearchWidgetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */; }; + B886B2522D2C093BBCE9844BBC2A84AE /* ViewConfigPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */; }; + BA66BD722D1029DB90B91889AE435938 /* SdkStyleColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */; }; + BBCDC6622412DD3C491775830A55FE4D /* RecommendationsStarsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */; }; + BD49D731800904B988C8A771E0C1A9CC /* SdkStyleCustomFontSizeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */; }; + BF0485F5C192F225E4B519B7F2793DFC /* NetworkConnectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */; }; + BFC831FD30B89FC45404A6CBC78D2BEA /* NetworkConnectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */; }; + BFD7143593CAF751E9C8344B20488F31 /* UISdkWrapLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */; }; + C204C6976B8B9ACE9797F222AA6ECCA5 /* GenericDataTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */; }; + C3B214337422238B6F16DDD4D83FE86A /* SearchWidgetMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */; }; + C800B58B3331444C8BB27C4F89D2CE44 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */; }; + C88C545BF7521C369D2602C552A551A8 /* TextBlockConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */; }; + C9042F117FB2359CFFAE2A484BCAD759 /* SearchWidgetHistoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */; }; + CEDD87245EDA33E6EED478D04CFF3863 /* SdkConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */; }; + D0925D984A33493CBD8748EF9A3B91D3 /* Option.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */; }; + D0A994B97078D246BFD4805C729AC6FC /* SearchWidgetListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */; }; + D0D410CA575CE4E459381557FDEFA3A5 /* StoryBlockImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */; }; + D9B862FA4640C84B16DF0E2AF96459D3 /* TBFontConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */; }; + DA38244A91BEB77E42BD4F150B807505 /* ManagedViewConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */; }; + DEB27EE51D09D55258D69927B56120DB /* InitService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */; }; + E0B0ED3036DA4A0A5A0CA0FD17D1B9DF /* SessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */; }; + E0D9CD065B64C0D661B5FD42FEB79918 /* SdkStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */; }; + E385668DBCD81215689D1543C955E46A /* SdkPopupAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */; }; + E49668B0B739D147E3414D17D4A0BA0E /* SearchWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */; }; + E761A05087F0E09F0DC407500FEE98E2 /* ProductsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */; }; + E7E128BBA990CA16D6C7D2E12C7451B3 /* CGImageSource+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */; }; + E9CC56086B144A2A4193EF27C59F6FB1 /* CarouselCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */; }; + ED9F4F1DEDFDBEFCD5E129DA9755A705 /* PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */; }; + F38F22B4A2A822E5BC40C664C5943FB9 /* Disk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */; }; + F5AB8C4608DCCA8557A248A0EF9D3571 /* NetworkStatusObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */; }; + F685A237C47426370D2AC2956285C3E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + F6DEE3FA2EF0113730454100EEE86756 /* StoriesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */; }; + F83B27F3BA95658EAD242D8EC0FF4C91 /* SlideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */; }; + FA8B5D62D1F65F6083B7FF811EB32EBB /* SearchWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */; }; + FF76EE2CCAF3321D9F471F7D3BC05971 /* SessionOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 2B029E60540F41DAED3EF429AB0F6B86 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; - remoteInfo = SDWebImage; - }; - 2C892BD4D849AC22F2605C37038732CF /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 92EBFA3E7005B4C18A9C0B44324EB80F; - remoteInfo = SDWebImageSwiftUI; - }; - 40A7CB4B0A15AA26A286237C3DC95BE1 /* PBXContainerItemProxy */ = { + 97FD9F25B8F6CE6ACEDF790C858E79E0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 0C03A6912D025B497528F2C7FFE2F1D5; remoteInfo = REES46; }; - 542A9B83BEF9F0BD938799CC124BE455 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0C03A6912D025B497528F2C7FFE2F1D5; - remoteInfo = REES46; - }; - 7097CE6E72D7582F22EAD3655DE54080 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 92EBFA3E7005B4C18A9C0B44324EB80F; - remoteInfo = SDWebImageSwiftUI; - }; - 8C40AB809AAB92156705FE0682FB8425 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; - remoteInfo = SDWebImage; - }; - A99F31A5E5D289319F21440CF2383E43 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 94CFBA7D633ECA58DF85C327B035E6A3; - remoteInfo = "SDWebImage-SDWebImage"; - }; - C11ED8B5E2E81E3D5DDCCC1AE1E2D4D4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; - remoteInfo = SDWebImage; - }; - F08BBAD3B89A5D7B7714C68348C87676 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 80CA65F514DD5B1DC5829F29295F6292; - remoteInfo = "Pods-demo-store-ios"; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 012F10698C136315708F93A29670131E /* UIColor+SDHexString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+SDHexString.h"; path = "SDWebImage/Private/UIColor+SDHexString.h"; sourceTree = ""; }; - 017C9D4AD83B9F48EC84C7462F77C1C2 /* SearchWidgetObjectification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetObjectification.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetObjectification.swift; sourceTree = ""; }; - 01949FADB1DF51BC47166556FEBFE773 /* SDAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImage.m; path = SDWebImage/Core/SDAnimatedImage.m; sourceTree = ""; }; - 01E4D39E9A3693888369174B21333E5A /* ProgressIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProgressIndicator.swift; path = SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift; sourceTree = ""; }; - 025A544F19BC6987E72A6A0A9B1726CA /* Disk.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disk.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift; sourceTree = ""; }; - 029A00422820699B153B476831592226 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; - 02BBB5AAB5F6B7B271D2A8880A71F724 /* ResourceBundle-SDWebImage-SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SDWebImage-SDWebImage-Info.plist"; sourceTree = ""; }; - 03F3E50CB0A6F2BD522C6FA9455BD747 /* REES46-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "REES46-Info.plist"; sourceTree = ""; }; - 0452D8A6588B9906902D3781A81B7E02 /* PushTokenNotificationServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationServiceImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift; sourceTree = ""; }; - 054F9EA00DA4E6B7B90CA2D91C46007C /* SDImageCacheDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheDefine.h; path = SDWebImage/Core/SDImageCacheDefine.h; sourceTree = ""; }; - 0563BCB9D5C982E10E671FD25E79729B /* UserSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserSettings.swift; path = REES46/Classes/Model/UserSettings.swift; sourceTree = ""; }; - 05955F66D9A388DB5300C283B9ED82E5 /* SearchWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift; sourceTree = ""; }; - 05CB137A80B79559FF8A751F6E3C15B7 /* SDGraphicsImageRenderer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDGraphicsImageRenderer.m; path = SDWebImage/Core/SDGraphicsImageRenderer.m; sourceTree = ""; }; - 05D020DF7555623CE56D7342B92089D6 /* SDImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFrame.m; path = SDWebImage/Core/SDImageFrame.m; sourceTree = ""; }; - 0747F2B66D5854265EBF7A4B9CDCA0EC /* SDWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImage.h; path = WebImage/SDWebImage.h; sourceTree = ""; }; - 085AEFC7C28A15F206741200F820F38B /* SDWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOperation.m; path = SDWebImage/Core/SDWebImageOperation.m; sourceTree = ""; }; - 0886A006FB6D7A5B26FA5DD74922C871 /* StoriesView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesView.xib; path = REES46/Classes/Resources/StoriesView.xib; sourceTree = ""; }; - 0950384B82209DB75A156574D201B451 /* SDDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDiskCache.m; path = SDWebImage/Core/SDDiskCache.m; sourceTree = ""; }; - 0ACDB23A88E6462C13BAA8CF2F5388C6 /* SessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/SessionQueue.swift; sourceTree = ""; }; - 0AE2DC5138E439FCCEC29C8B4AD17B2D /* RegisterNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegisterNotification.swift; path = REES46/Classes/services/notification/events/RegisterNotification.swift; sourceTree = ""; }; - 0BAFD4926F5BEF0E7D2592ACDAEA47F3 /* SDWebImageDownloaderConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderConfig.m; path = SDWebImage/Core/SDWebImageDownloaderConfig.m; sourceTree = ""; }; - 0BB49B831AF796BFD54D280D4E950744 /* Pods-demo-store-iosTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-Info.plist"; sourceTree = ""; }; - 0D5B8E3E17032CC03AC3DA26F631C0A9 /* CartItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CartItem.swift; path = REES46/Classes/Model/CartItem.swift; sourceTree = ""; }; - 0E5615848B998FCBF7B3C601180F6533 /* SDImageGraphics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGraphics.m; path = SDWebImage/Core/SDImageGraphics.m; sourceTree = ""; }; - 0FB6821FE781E61F57C7ABBEE79CD491 /* ViewConfigPlain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigPlain.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift; sourceTree = ""; }; - 119A30548ED1F294262DAA76E2314B8F /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; - 12FBF0A87753C1C15550A9EDE725073D /* SDImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCodersManager.m; path = SDWebImage/Core/SDImageCodersManager.m; sourceTree = ""; }; - 1313A8AE0C4379298D7EF36BE6AA65F4 /* SdkGlobalHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkGlobalHelper.swift; path = REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift; sourceTree = ""; }; - 146D16A186D47FCB0B2ABB8F0506282D /* SDWebImageSwiftUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SDWebImageSwiftUI.swift; path = SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift; sourceTree = ""; }; - 14B77A4BA58A9F1E17C8E687B03430D5 /* SDImageIOAnimatedCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoderInternal.h; path = SDWebImage/Private/SDImageIOAnimatedCoderInternal.h; sourceTree = ""; }; - 1501C7067A26F553918FA75C59C74AD1 /* ManagedViewConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ManagedViewConfig.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift; sourceTree = ""; }; - 153B813592BB94FAFB1B69B37EB2DED1 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/Core/NSData+ImageContentType.h"; sourceTree = ""; }; - 156E069BEAD7BB288F1EAB97FDDD68F4 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/Core/UIImage+GIF.h"; sourceTree = ""; }; - 166CAE72B58135935C298B971F0E810A /* ReloadButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReloadButton.swift; path = REES46/Classes/Button/ReloadButton.swift; sourceTree = ""; }; - 16A84119C929C7999C74B194789C2339 /* OnChange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnChange.swift; path = SDWebImageSwiftUI/Classes/Backports/OnChange.swift; sourceTree = ""; }; - 16D28C22EDFBA5210E8F26B745E30C7F /* SlideView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideView.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift; sourceTree = ""; }; - 182B458C0DB3AF459F99260B902F1E3B /* StoriesImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesImageLoader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift; sourceTree = ""; }; - 19CB0A67BA30881F8E68E3431B761F02 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - 19D828BE41B227FC99AB956B45805E0D /* SDWebImageSwiftUI-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImageSwiftUI-dummy.m"; sourceTree = ""; }; - 1A24CFBF01D0409EB666BB081480520E /* RWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController.swift; path = REES46/Classes/Stories/WebKit/RWebViewController.swift; sourceTree = ""; }; - 1B85BF16297242DA531FC69E93CF9CA5 /* Pods-demo-store-ios-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-Info.plist"; sourceTree = ""; }; - 1BBD8F1415E27C7782213FF9A17A0355 /* ActivityIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ActivityIndicator.swift; path = SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift; sourceTree = ""; }; - 1C0B64B639FD80A20B3EEBE805B0C5B2 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/Core/UIView+WebCacheOperation.h"; sourceTree = ""; }; - 1C72C00B34C83096ED3147E8AAAD8EAE /* Pods-demo-store-ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-umbrella.h"; sourceTree = ""; }; - 1D6FDAFF796C99AED706D3F44F4A7B8F /* SDDisplayLink.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDisplayLink.h; path = SDWebImage/Private/SDDisplayLink.h; sourceTree = ""; }; - 1E25B0169BDF269969E4586C420B6160 /* ImageData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageData.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift; sourceTree = ""; }; - 1E5120A81E18A4375BE2C935A99E02B5 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/Core/UIView+WebCacheOperation.m"; sourceTree = ""; }; - 200E09C6F7210CD35EC2DFC6CDB47964 /* SearchWidgetViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetViewController.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift; sourceTree = ""; }; - 2238B2DE53D04D375D323CDE28F19A0F /* SdkFontInstaller.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInstaller.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift; sourceTree = ""; }; - 22AD885D3D57E81A6E96E0E72504B6C8 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; - 22DF9F8F7A569CC3F4DEB6EBC4102FE1 /* SearchWidget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidget.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift; sourceTree = ""; }; - 22E9C09EE96235DC612E7FDB70D8EB98 /* SDImageAPNGCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAPNGCoder.m; path = SDWebImage/Core/SDImageAPNGCoder.m; sourceTree = ""; }; - 230186899B3D45050AC3C1511882C3B1 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; - 243098A6435E355225C685FEBB0EA576 /* UIImageView+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift"; sourceTree = ""; }; - 245CD06BD01C6A94F1C8153D1F912FCC /* Coverable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Coverable.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift; sourceTree = ""; }; - 24783625BE78E3C757479BA61BFAC0A6 /* SDImageAssetManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAssetManager.m; path = SDWebImage/Private/SDImageAssetManager.m; sourceTree = ""; }; - 249102CF81952267B123A666190DF430 /* RWebViewController_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController_Extensions.swift; path = REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift; sourceTree = ""; }; - 24A037FFEC91A5918877DAF898310E6F /* SearchWidgetHistoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetHistoryButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift; sourceTree = ""; }; - 24AAE5386CBFCCFEDA6C8E44F6E48C3D /* VideoFileUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoFileUtils.swift; path = REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift; sourceTree = ""; }; - 26642982FB2133E4B543A2C337BA2E9D /* UIViewController+PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+PromocodeBanner.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift"; sourceTree = ""; }; - 27C3468CC76B2C7BB10CED3DE5EFCA58 /* SdkPopupAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkPopupAlertView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift; sourceTree = ""; }; - 29D5B0FFB0FB808508AA9BDC2557AA03 /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = ""; }; - 2A368399C2160AC6329182F20B166F4E /* REES46.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.debug.xcconfig; sourceTree = ""; }; - 2A71319F6A963531ACFFF30BCBC6DDB2 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; - 2B0B4109307136D655FFB5991A75A5DC /* SDWebImageDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDefine.h; path = SDWebImage/Core/SDWebImageDefine.h; sourceTree = ""; }; - 2BA417CE2D73128F66E80F6070CA08EE /* SDImageTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageTransformer.m; path = SDWebImage/Core/SDImageTransformer.m; sourceTree = ""; }; - 2C823347DAB1A2B3C3EAEAFACF196622 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/Core/SDImageCacheConfig.h; sourceTree = ""; }; - 2DF5621E59EA431F7D24B338AF41DAF1 /* UIImage+Transform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Transform.m"; path = "SDWebImage/Core/UIImage+Transform.m"; sourceTree = ""; }; - 2E74AC7CFF2C91899A037B82C869DB0A /* Pods-demo-store-ios-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-acknowledgements.markdown"; sourceTree = ""; }; - 2E7CAF23E69EC6B7DB7D7CDEFC96C5C6 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/Core/SDWebImageManager.m; sourceTree = ""; }; - 2EC5479EE341C9CAE3AAC92B34E3BD4F /* CarouselCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift; sourceTree = ""; }; - 2F374469A65E69F71CF1A960B8DE8DAE /* StateObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StateObject.swift; path = SDWebImageSwiftUI/Classes/Backports/StateObject.swift; sourceTree = ""; }; - 2FB9E93A5A045ADF557378B54D551DDE /* Pods-demo-store-iosTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-iosTests-dummy.m"; sourceTree = ""; }; - 2FE7246FC198AE307DAD3891ADC5FE80 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/Core/SDImageCacheConfig.m; sourceTree = ""; }; - 302A8EC471B54D588E44D73F09C36F82 /* SDFileAttributeHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDFileAttributeHelper.m; path = SDWebImage/Private/SDFileAttributeHelper.m; sourceTree = ""; }; - 31A27027A1324B45B2F6F5C9BFA7EE29 /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/Core/UIImage+ForceDecode.m"; sourceTree = ""; }; - 31C677B04BBC412F101723A7541968AE /* Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Loader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift; sourceTree = ""; }; - 343136082AD2F8FDA2DECD6015D2A952 /* Data+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift"; sourceTree = ""; }; - 3433BC654811C432BEF5CB32AAF90EFB /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; - 3462E4224B703F8B93A5EA4485EDB339 /* SDWebImageSwiftUI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImageSwiftUI.release.xcconfig; sourceTree = ""; }; - 34F6F6267F550D1B9B7ACD345C3E0668 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/Core/NSButton+WebCache.m"; sourceTree = ""; }; + 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromoCodeView.swift; path = REES46/Classes/Button/PromoCodeView.swift; sourceTree = ""; }; + 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionServiceImpl.swift; path = REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift; sourceTree = ""; }; + 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInstaller.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift; sourceTree = ""; }; + 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLSessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift; sourceTree = ""; }; + 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigService.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift; sourceTree = ""; }; + 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkRadioType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift; sourceTree = ""; }; + 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadManager.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift; sourceTree = ""; }; + 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Option.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift; sourceTree = ""; }; + 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesImageLoader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift; sourceTree = ""; }; + 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageData.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift; sourceTree = ""; }; + 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesView.swift; path = REES46/Classes/Stories/StoriesView.swift; sourceTree = ""; }; + 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CartItem.swift; path = REES46/Classes/Model/CartItem.swift; sourceTree = ""; }; + 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadingPlaceholderView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift; sourceTree = ""; }; + 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenericDataTask.swift; path = REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift; sourceTree = ""; }; + 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromocodeBanner.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift; sourceTree = ""; }; + 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryBlockImageCache.swift; path = REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift; sourceTree = ""; }; + 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkDynamicFont.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift; sourceTree = ""; }; + 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetMainView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift; sourceTree = ""; }; + 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockView.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockView.swift; sourceTree = ""; }; + 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFonts.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift; sourceTree = ""; }; + 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift; sourceTree = ""; }; + 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesSlideReloadIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift; sourceTree = ""; }; + 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitResponse.swift; path = REES46/Classes/Model/InitResponse.swift; sourceTree = ""; }; + 240A79C469C0F6595705D16927F498E9 /* REES46-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-prefix.pch"; sourceTree = ""; }; + 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleUIApplication.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift; sourceTree = ""; }; + 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SimplePersonalizationSDK.swift; path = REES46/Classes/SimplePersonalizationSDK.swift; sourceTree = ""; }; + 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Extension.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift"; sourceTree = ""; }; + 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetHistoryButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift; sourceTree = ""; }; + 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift; sourceTree = ""; }; + 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stories.swift; path = REES46/Classes/Model/Stories.swift; sourceTree = ""; }; + 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift; sourceTree = ""; }; + 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift; sourceTree = ""; }; + 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetConstants.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift; sourceTree = ""; }; + 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesView.xib; path = REES46/Classes/Resources/StoriesView.xib; sourceTree = ""; }; + 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift"; sourceTree = ""; }; + 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/SessionQueue.swift; sourceTree = ""; }; + 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift; sourceTree = ""; }; + 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsButton.swift; path = REES46/Classes/Button/ProductsButton.swift; sourceTree = ""; }; + 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesCollectionViewPreviewCell.xib; path = REES46/Classes/Resources/StoriesCollectionViewPreviewCell.xib; sourceTree = ""; }; 3671B3C220D01E22000CF41146C2B4AB /* REES46 */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = REES46; path = REES46.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3698F76D18FEE0AB0114FA9A9D14C380 /* SearchWidgetListView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift; sourceTree = ""; }; - 36F5D2A790ECA81D45F8B61225A715D5 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/Core/UIImage+MultiFormat.m"; sourceTree = ""; }; - 37529AFAE21E524BB5CF8528DBDBFF62 /* Pods-demo-store-ios-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-dummy.m"; sourceTree = ""; }; - 379137B02CA02704EDA9A2CF00E99A09 /* SDWebImageSwiftUI-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImageSwiftUI-Info.plist"; sourceTree = ""; }; - 37986DD58E8275EB765C4B9ED87C902C /* REES46-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-prefix.pch"; sourceTree = ""; }; - 37D29315E37F8FAAC6F6BA17562D6B51 /* UIBezierPath+Circle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+Circle.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift"; sourceTree = ""; }; - 38246598EB440279D380C257FCBCCA52 /* NetworkConnectionStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift; sourceTree = ""; }; - 385D24232663F9F21F5D0C0F0DA7A763 /* SDImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoderHelper.m; path = SDWebImage/Core/SDImageCoderHelper.m; sourceTree = ""; }; - 3945BB4F984C8941E625264678DEC70C /* PersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PersonalizationSDK.swift; path = REES46/Classes/PersonalizationSDK.swift; sourceTree = ""; }; - 39D601084E48E12065CB0FB34E2814BF /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/Core/SDImageCache.m; sourceTree = ""; }; - 3A0926E6B50E9D5ABA0EF2C4D5E88642 /* InitService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitService.swift; path = REES46/Classes/Extensions/InitService.swift; sourceTree = ""; }; - 3BDF4C10853BB55579BDCA649F2DE846 /* RView_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RView_Extensions.swift; path = REES46/Classes/Stories/WebKit/RView_Extensions.swift; sourceTree = ""; }; - 3C0CB1CDEA4C5E4895994FB47085D4E3 /* SdkImageReloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkImageReloader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift; sourceTree = ""; }; - 3C410EC9FA1D242644C94FD5BB0DCC7F /* SDAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageView.m; path = SDWebImage/Core/SDAnimatedImageView.m; sourceTree = ""; }; - 3C4A6E08625EBFD1238EB565499849E3 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = ""; }; - 3C7FCEF6B42BE8D00A3F1BACC9822867 /* StoryBlockImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryBlockImageCache.swift; path = REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift; sourceTree = ""; }; - 3D0BDF6EBE4794388029C368DD323927 /* SDImageCachesManagerOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManagerOperation.h; path = SDWebImage/Private/SDImageCachesManagerOperation.h; sourceTree = ""; }; - 3DA2EDB38D52E3A594FD04DDF1FC4DD8 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/Core/SDWebImageDownloader.h; sourceTree = ""; }; - 3E928DA9D56257D7E66B7FD04D4FBB6A /* SdkStyleColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift; sourceTree = ""; }; - 3EF2C06F474A7E1365D101FD38EDD192 /* SDGraphicsImageRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDGraphicsImageRenderer.h; path = SDWebImage/Core/SDGraphicsImageRenderer.h; sourceTree = ""; }; - 3F1B596D47CB175EBED6915E6C02D2ED /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/Core/SDImageCache.h; sourceTree = ""; }; - 4145512C78F59C07A8ADA786E0C0D0AE /* SdkDynamicFont.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkDynamicFont.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift; sourceTree = ""; }; - 42AB298A5E3CB9C3744EEB483D776066 /* ViewConfigService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigService.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift; sourceTree = ""; }; - 42C4114AD9CA9739A7AFF00200C9E5FF /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = SDWebImageSwiftUI/Classes/Indicator/Indicator.swift; sourceTree = ""; }; - 43D18ACE031C79021DEEF21AB4FA0A05 /* ColorExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ColorExtensions.swift; path = REES46/Classes/Shared/ColorExtensions.swift; sourceTree = ""; }; - 43D5C931E8B3C42904FF08B0AA8E499A /* Overlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Overlay.swift; path = SDWebImageSwiftUI/Classes/Backports/Overlay.swift; sourceTree = ""; }; - 446B5D79A9B5EFBF90DDBEC5B0006A76 /* SDWebImageDownloaderResponseModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderResponseModifier.h; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.h; sourceTree = ""; }; - 4546F55366F817C14243B677296A3BEB /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/Core/SDWebImageTransition.h; sourceTree = ""; }; - 4566A7EDA1E302A996738A3E6923BB76 /* Pods-demo-store-ios-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-acknowledgements.plist"; sourceTree = ""; }; - 45B788F69BB6D1B384380230A35F4A85 /* SDWebImageSwiftUI.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImageSwiftUI.modulemap; sourceTree = ""; }; - 4726050844C07463EDF54E7B9C36FD61 /* RequestOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestOperation.swift; path = REES46/Classes/Extensions/SessionQueue/RequestOperation.swift; sourceTree = ""; }; - 482071A65FE0E3F977402AE06FA26155 /* ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoader.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift; sourceTree = ""; }; - 48D43AAA52FE567ADF7FABD5AD0D1218 /* Pods-demo-store-iosTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-iosTests.modulemap"; sourceTree = ""; }; - 48F8626ED92FAA27298CB92425BE0288 /* SDWebImageCacheSerializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheSerializer.h; path = SDWebImage/Core/SDWebImageCacheSerializer.h; sourceTree = ""; }; - 4A89615CA3748B4B574FF3BF0D984A51 /* UISdkWrapLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UISdkWrapLabel.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift; sourceTree = ""; }; - 4AD6725039854C49B298640ED0545CE6 /* SdkStyleCustomFontSizeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift; sourceTree = ""; }; - 4AFB98DB5CEBD45082FDCFAE8E610335 /* SdkStyleCustomColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift; sourceTree = ""; }; - 4C45D4459990807F360105B4C2BD6B5B /* Stories.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stories.swift; path = REES46/Classes/Model/Stories.swift; sourceTree = ""; }; - 4DF8AECAEC072703693B3E3E2C4B83C5 /* Pods-demo-store-ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios.modulemap"; sourceTree = ""; }; - 4F8EDA1E36291EC7D5833D2F1347675F /* TrackingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackingService.swift; path = REES46/Classes/ServiceProtocols/TrackingService.swift; sourceTree = ""; }; - 505853D80AB9D71C6B962F6B106CA899 /* TexBlockConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TexBlockConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift; sourceTree = ""; }; - 50A915682692C4576BD1B3382EDD4A31 /* SdkStyleUIApplication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleUIApplication.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift; sourceTree = ""; }; - 50CE6E565037959B2AC4CEB87052B390 /* SDWebImageTransitionInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransitionInternal.h; path = SDWebImage/Private/SDWebImageTransitionInternal.h; sourceTree = ""; }; - 50E032345F0385B49508C224E5FAB205 /* UIView+WebCacheState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheState.m"; path = "SDWebImage/Core/UIView+WebCacheState.m"; sourceTree = ""; }; - 51BFD59F8F32B660DCC66F98EFD1A6CE /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/Core/UIImage+GIF.m"; sourceTree = ""; }; - 51DD1AEB1ED0805DAE2DB69242F0495A /* WebImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebImage.swift; path = SDWebImageSwiftUI/Classes/WebImage.swift; sourceTree = ""; }; - 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-iosTests"; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 567F0CCECCB2EFE5CF5E90BD862FC225 /* SearchWidgetDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetDelegate.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift; sourceTree = ""; }; - 56D89D1669ADB46DF58317A31AA0D920 /* Transition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transition.swift; path = SDWebImageSwiftUI/Classes/Transition/Transition.swift; sourceTree = ""; }; - 58F71D4BD9974824651245DBC500E711 /* NSBezierPath+SDRoundedCorners.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBezierPath+SDRoundedCorners.m"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.m"; sourceTree = ""; }; - 5ABAC2D6EBFC4451BB54CDBAB40DADA3 /* SDWebImageSwiftUI-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImageSwiftUI-umbrella.h"; sourceTree = ""; }; - 5AE0E2DC679FA76AFCBE4F10C002B5E8 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/Core/SDWebImagePrefetcher.m; sourceTree = ""; }; - 5BAAE14027868DA9525921C209B08C76 /* SDWebImageSwiftUI-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImageSwiftUI-prefix.pch"; sourceTree = ""; }; - 5BC56B47FC5C9CC44C3585CA3C9561D9 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/Core/UIImage+ForceDecode.h"; sourceTree = ""; }; - 5C7BE26FDD9A42E5961777E59579165F /* UIImage+ExtendedCacheData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ExtendedCacheData.m"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.m"; sourceTree = ""; }; - 5C8C91A282536A9AD77BFAB844A8F376 /* SDDeviceHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDeviceHelper.h; path = SDWebImage/Private/SDDeviceHelper.h; sourceTree = ""; }; - 5CCCC47E503FC830A95DAD71006D4257 /* ProductsResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsResponse.swift; path = REES46/Classes/Model/ProductsResponse.swift; sourceTree = ""; }; - 5CD261183F527F9CCEE033F6D042CCB3 /* Assets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = REES46/Classes/Resources/Assets.xcassets; sourceTree = ""; }; - 5DE906CE80C33B4E27DCFC2A3F937122 /* UIImage+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift"; sourceTree = ""; }; - 5FD013C1407EF41F0DB420AF3709D869 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/Core/SDWebImageDownloaderOperation.m; sourceTree = ""; }; - 609A44AA239B50B276698311810DF46C /* SDImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOCoder.h; path = SDWebImage/Core/SDImageIOCoder.h; sourceTree = ""; }; - 63BAD4815E80530574567C6C941B7D35 /* SDImageIOAnimatedCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoder.h; path = SDWebImage/Core/SDImageIOAnimatedCoder.h; sourceTree = ""; }; - 6598F6A79503239ABC5FF1D30AD713A5 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; - 65A52C786ED0456F2DD0D7E95F90F8B8 /* NSImage+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+Compatibility.m"; path = "SDWebImage/Core/NSImage+Compatibility.m"; sourceTree = ""; }; - 65AE02622EA56AB3A84F2D7776259B6F /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/Core/UIImageView+WebCache.m"; sourceTree = ""; }; - 65C49FAC640F96CEADE5484866E0FC4E /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.m"; sourceTree = ""; }; - 66892A39AD576FB00A0E72D743C5B5F4 /* SDCallbackQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDCallbackQueue.h; path = SDWebImage/Core/SDCallbackQueue.h; sourceTree = ""; }; - 66FC775DB87F1F5E3A252D7C0DB818ED /* SDImageFramePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFramePool.h; path = SDWebImage/Private/SDImageFramePool.h; sourceTree = ""; }; - 677CA2D06DDE5144350FEB4B400D5B12 /* VideoDownloadObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadObject.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift; sourceTree = ""; }; - 693D0696C64D9BB4F4BCC7D548564FB8 /* SDImageLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoader.h; path = SDWebImage/Core/SDImageLoader.h; sourceTree = ""; }; - 6A95D2D8B4A55B4954DFF4C2BE59121C /* REES46-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "REES46-dummy.m"; sourceTree = ""; }; - 6B1B10F952F684F6767E6903C2F5E816 /* SDWebImageSwiftUI */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImageSwiftUI; path = SDWebImageSwiftUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 6CDC6391E3063232D20F2FFE1617B4AA /* 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; }; - 6CF075E9AF0C9F42704B25D11A12D16F /* SdkConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkConfiguration.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift; sourceTree = ""; }; - 6CFA6F80E28B127534C67C258F67330D /* SDDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDiskCache.h; path = SDWebImage/Core/SDDiskCache.h; sourceTree = ""; }; - 6D34EFF0527DB3EBA71D8FB52A3425C9 /* UIFontDescriptorUsage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIFontDescriptorUsage.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift; sourceTree = ""; }; - 6F7861E34249B83262CAAC89AE6B545E /* SearchWidgetModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetModel.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetModel.swift; sourceTree = ""; }; - 6F8EA8AFF4FC1C0B82EF0EC412051B3A /* TBAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBAppearanceConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift; sourceTree = ""; }; - 6FEE741AF14146505421E6B9B790997B /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; - 7180342E0BEDD11728D7A13F83122F1A /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/Core/SDWebImageDownloader.m; sourceTree = ""; }; - 718751286835CE61DAC86CF985BEB152 /* PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromocodeBanner.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift; sourceTree = ""; }; - 721D6D167B5F76DE3399711D8B8F1980 /* SDWebImageDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDefine.m; path = SDWebImage/Core/SDWebImageDefine.m; sourceTree = ""; }; - 722820E2AECBDB9CE88DF1F28EDC4C2A /* NetworkStatusObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserver.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift; sourceTree = ""; }; - 72B32CD662708347A951F5E371409877 /* ImageLoading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoading.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift; sourceTree = ""; }; - 72BAC27599E684B921A906800DBB9B3E /* SDAsyncBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAsyncBlockOperation.h; path = SDWebImage/Private/SDAsyncBlockOperation.h; sourceTree = ""; }; - 7327B126F904459685ACAB5BB188BA92 /* NetworkStatusObserverUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserverUI.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift; sourceTree = ""; }; - 742684B14C7933490E61EE78305318F0 /* SdkActivityIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkActivityIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift; sourceTree = ""; }; - 7640F97184806A9AE6D038E779EA1B9B /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = SDWebImageSwiftUI/Classes/Image.swift; sourceTree = ""; }; - 764CCAEDDE803665E562352946EBBFA8 /* SDImageFramePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFramePool.m; path = SDWebImage/Private/SDImageFramePool.m; sourceTree = ""; }; - 768349C5A7EF0A50AC2FEACF23C4EFD5 /* REES46-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-umbrella.h"; sourceTree = ""; }; - 76DEAE9E95F151F7D441B0550C8E10B5 /* Pods-demo-store-ios-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-store-ios-frameworks.sh"; sourceTree = ""; }; - 774742885C515AA49BD28EF3648BA370 /* Pods-demo-store-iosTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-iosTests-acknowledgements.plist"; sourceTree = ""; }; - 779D3AACB3FFC5D21447E5995A7D8169 /* SDWebImageIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageIndicator.h; path = SDWebImage/Core/SDWebImageIndicator.h; sourceTree = ""; }; - 77DA9FAF14BC95865EB72E3778D3DD5E /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/Core/SDWebImagePrefetcher.h; sourceTree = ""; }; - 784409CEDE904360420A93E233B1448E /* RecommendationsStarsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsStarsView.swift; path = REES46/Classes/Extensions/SdkConfiguration/RecommendationsStars/RecommendationsStarsView.swift; sourceTree = ""; }; - 78AC9897341C6AD6139546E65E3C671B /* StoryViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryViewController.swift; path = REES46/Classes/Stories/StoryViewController/StoryViewController.swift; sourceTree = ""; }; - 79161E2AE3EBB7A8C5037E3821873380 /* SDAssociatedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAssociatedObject.h; path = SDWebImage/Private/SDAssociatedObject.h; sourceTree = ""; }; - 791F99A8CC2762A65CBEF72F99CBB292 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - 79E8E12D344406C699B8AB3CC0B36E2C /* SDWebImageDownloaderRequestModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderRequestModifier.h; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.h; sourceTree = ""; }; - 7C0EEC89204EC719332D585D5E222E61 /* SearchResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchResponse.swift; path = REES46/Classes/Model/SearchResponse.swift; sourceTree = ""; }; - 7C3BF456C51A01CDF0D5F36F822566AC /* PushTokenHandlerImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenHandlerImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift; sourceTree = ""; }; - 7DBCC89758D18BE019ACCF9F4FB1DA29 /* UIColor+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Extension.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift"; sourceTree = ""; }; - 7E183E61E8F24778ED0F299E9CDF7098 /* SDInternalMacros.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDInternalMacros.m; path = SDWebImage/Private/SDInternalMacros.m; sourceTree = ""; }; - 81A7464CC9CCCD0F6CEAB02954C74B71 /* SDImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoderHelper.h; path = SDWebImage/Core/SDImageCoderHelper.h; sourceTree = ""; }; - 8239B94A327381F223C720106BF41938 /* SessionOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionOperation.swift; path = REES46/Classes/Extensions/SessionQueue/SessionOperation.swift; sourceTree = ""; }; - 828C3606A950C4AAE88974C9EEB6B09E /* NSBezierPath+SDRoundedCorners.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBezierPath+SDRoundedCorners.h"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.h"; sourceTree = ""; }; - 82A5C1DEACE9944682E1C538D1E696FE /* SubscriptionService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionService.swift; path = REES46/Classes/ServiceProtocols/SubscriptionService.swift; sourceTree = ""; }; - 8530AFBFB841B3BC722B46A2526C34AA /* RecommendationsWidgetViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetViewCell.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift; sourceTree = ""; }; - 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios-demo-store-iosUITests"; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 884C25BFA10C3C4A63320C3A5B7797EE /* SearchWidgetExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetExtension.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift; sourceTree = ""; }; - 89E336EB6E5CA8CBA413FD162AC5E781 /* SDWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWeakProxy.m; path = SDWebImage/Private/SDWeakProxy.m; sourceTree = ""; }; - 8A8808B6DC1E046BFF8C17824E0A56D3 /* SwiftUICompatibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftUICompatibility.swift; path = SDWebImageSwiftUI/Classes/SwiftUICompatibility.swift; sourceTree = ""; }; - 8C625FCC124326FD82C5D1D495462CBA /* SDImageLoadersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoadersManager.m; path = SDWebImage/Core/SDImageLoadersManager.m; sourceTree = ""; }; - 8CA7AD6F6144B1897DD6FED6EF086315 /* NetworkRadioType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkRadioType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift; sourceTree = ""; }; - 8DECD257A7D9712BFEF049E58533DD45 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/Core/UIView+WebCache.h"; sourceTree = ""; }; - 8E029187C788F90556669DD25F177EB0 /* StoryCollectionViewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoryCollectionViewCell.xib; path = REES46/Classes/Resources/StoryCollectionViewCell.xib; sourceTree = ""; }; - 8E21105E533FF43048ACF1009CF05F4F /* SDWebImageIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageIndicator.m; path = SDWebImage/Core/SDWebImageIndicator.m; sourceTree = ""; }; - 8E55C9080F6947D033E6CE6E6A43847C /* URLSessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLSessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift; sourceTree = ""; }; - 8EA0880546F5C765AE10ECC6D442C87E /* SdkStyleCustomColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift; sourceTree = ""; }; - 8EB8ED5238870DEA90CCE8D421113FC2 /* PushTokenNotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationService.swift; path = REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift; sourceTree = ""; }; - 8FFC11AC8252C36F4B476D4E56652E41 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-demo-store-iosUITests-umbrella.h"; sourceTree = ""; }; - 906C31FFD1D1B75E909C241295F4C0A2 /* CGImageSource+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGImageSource+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift"; sourceTree = ""; }; - 913A2C2605A42A57859DA310AC8C704F /* SDImageAWebPCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAWebPCoder.h; path = SDWebImage/Core/SDImageAWebPCoder.h; sourceTree = ""; }; - 9183AB97B95E41B7E371EC4DE2A2DF30 /* SdkStyleCustomColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift; sourceTree = ""; }; - 9342870F1B17CE6B55C0E506E939EB84 /* SDImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGIFCoder.m; path = SDWebImage/Core/SDImageGIFCoder.m; sourceTree = ""; }; - 93852F96F75724CE63ED467E5C544270 /* SDAsyncBlockOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAsyncBlockOperation.m; path = SDWebImage/Private/SDAsyncBlockOperation.m; sourceTree = ""; }; - 94A8EBE7ECE2DEB427F6FEE4AFAFCA25 /* SDMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDMemoryCache.h; path = SDWebImage/Core/SDMemoryCache.h; sourceTree = ""; }; - 9560E66C017A7924466F9F2ED43805A9 /* Operative.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operative.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift; sourceTree = ""; }; - 95A5032C5249239170C6C56B8BEC1620 /* SDImageCachesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManager.h; path = SDWebImage/Core/SDImageCachesManager.h; sourceTree = ""; }; - 965F1DCE80D5E47223972A8914CF7D2E /* SDImageIOAnimatedCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOAnimatedCoder.m; path = SDWebImage/Core/SDImageIOAnimatedCoder.m; sourceTree = ""; }; - 967A3684F3A19FB31E7EEDBCEE8E376D /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/Core/SDWebImageCompat.m; sourceTree = ""; }; - 9686077291842E1BE3E92A4CBB2D01D5 /* SdkStyleColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift; sourceTree = ""; }; - 9895A84C8FC7A836604C935D35C99AC6 /* StoryCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift; sourceTree = ""; }; - 9917CE73936AE2F6F9845457B644BFDB /* RecommendResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendResponse.swift; path = REES46/Classes/Model/RecommendResponse.swift; sourceTree = ""; }; - 99BAC905278C2BD1A35C579C966CB859 /* SdkStyleCustomFontSizeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift; sourceTree = ""; }; - 9A2441B4F7FE69F4332827D34054B38A /* StoriesSlideReloadIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesSlideReloadIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift; sourceTree = ""; }; - 9A4C76575F957CF7FF3972130D58A634 /* SDImageGraphics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGraphics.h; path = SDWebImage/Core/SDImageGraphics.h; sourceTree = ""; }; - 9AB3A266BBA953A7F6B46B26085D6C56 /* LoadingPlaceholderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadingPlaceholderView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift; sourceTree = ""; }; - 9BF3DE04FA1C4CA5110A837D4B2A26F5 /* StoriesCollectionViewPreviewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesCollectionViewPreviewCell.xib; path = REES46/Classes/Resources/StoriesCollectionViewPreviewCell.xib; sourceTree = ""; }; - 9BF55A80D900FC0E395B74E5440155DA /* SDImageAWebPCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAWebPCoder.m; path = SDWebImage/Core/SDImageAWebPCoder.m; sourceTree = ""; }; - 9C2819399D5A22E8D3E3D2E88DF6D2FE /* SearchWidgetTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetTextField.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift; sourceTree = ""; }; - 9C4AC7B7715AD884E51877A463095BF1 /* UIImage+Metadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Metadata.h"; path = "SDWebImage/Core/UIImage+Metadata.h"; sourceTree = ""; }; + 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIFont+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift"; sourceTree = ""; }; + 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationService.swift; path = REES46/Classes/NotificationService.swift; sourceTree = ""; }; + 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserver.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift; sourceTree = ""; }; + 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReloadButton.swift; path = REES46/Classes/Button/ReloadButton.swift; sourceTree = ""; }; + 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift; sourceTree = ""; }; + 3FE45031A73056A2CFA8E93BF0A50596 /* Pods-demo-store-ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios.modulemap"; sourceTree = ""; }; + 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkConfiguration.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift; sourceTree = ""; }; + 452AF409E3A7679850A94364FEF83BA4 /* Pods-demo-store-ios-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-Info.plist"; sourceTree = ""; }; + 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBFontConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift; sourceTree = ""; }; + 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidget.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift; sourceTree = ""; }; + 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingService.swift; path = REES46/Classes/ServiceProtocols/NotificationHandlingService.swift; sourceTree = ""; }; + 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disk.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift; sourceTree = ""; }; + 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RView_Extensions.swift; path = REES46/Classes/Stories/WebKit/RView_Extensions.swift; sourceTree = ""; }; + 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoading.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift; sourceTree = ""; }; + 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkImageReloader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift; sourceTree = ""; }; + 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInjector.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift; sourceTree = ""; }; + 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackingService.swift; path = REES46/Classes/ServiceProtocols/TrackingService.swift; sourceTree = ""; }; + 51BADA0045FDF9D08F587320E702DD5D /* Pods-demo-store-ios-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-store-ios-frameworks.sh"; sourceTree = ""; }; + 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIFontDescriptorUsage.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift; sourceTree = ""; }; + 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetViewController.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift; sourceTree = ""; }; + 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TexBlockConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift; sourceTree = ""; }; + 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Coverable+UIKit.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift"; sourceTree = ""; }; + 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift; sourceTree = ""; }; + 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBAppearanceConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift; sourceTree = ""; }; + 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationService.swift; path = REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift; sourceTree = ""; }; + 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegisterNotification.swift; path = REES46/Classes/services/notification/events/RegisterNotification.swift; sourceTree = ""; }; + 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetModel.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetModel.swift; sourceTree = ""; }; + 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitService.swift; path = REES46/Classes/Extensions/InitService.swift; sourceTree = ""; }; + 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserDefaultsExtension.swift; path = REES46/Classes/Extensions/UserDefaultsExtension.swift; sourceTree = ""; }; + 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoryCollectionViewCell.xib; path = REES46/Classes/Resources/StoryCollectionViewCell.xib; sourceTree = ""; }; + 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationServiceImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift; sourceTree = ""; }; + 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionOperation.swift; path = REES46/Classes/Extensions/SessionQueue/SessionOperation.swift; sourceTree = ""; }; + 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift; sourceTree = ""; }; + 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetViewCell.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift; sourceTree = ""; }; + 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+Circle.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift"; sourceTree = ""; }; + 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListViewCell.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift; sourceTree = ""; }; + 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkApperanceViewScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift; sourceTree = ""; }; + 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackServiceImpl.swift; path = REES46/Classes/ServicesImplementation/TrackServiceImpl.swift; sourceTree = ""; }; + 7116768E9395945F655A57DAECC1A933 /* Pods-demo-store-ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-umbrella.h"; sourceTree = ""; }; + 711CCF8AFA98AC5676B42688D664CA30 /* Pods-demo-store-ios-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-acknowledgements.markdown"; sourceTree = ""; }; + 73010CC983E3809BECEE5348DA1BB8C6 /* 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; }; + 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift; sourceTree = ""; }; + 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingServiceImpl.swift; path = REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift; sourceTree = ""; }; + 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift"; sourceTree = ""; }; + 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryViewController.swift; path = REES46/Classes/Stories/StoryViewController/StoryViewController.swift; sourceTree = ""; }; + 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkGlobalHelper.swift; path = REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift; sourceTree = ""; }; + 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift; sourceTree = ""; }; + 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockConstants.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift; sourceTree = ""; }; + 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselConstants.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift; sourceTree = ""; }; + 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController.swift; path = REES46/Classes/Stories/WebKit/RWebViewController.swift; sourceTree = ""; }; + 7EED3A4B574EFEBB9FC4A320FC64352D /* REES46.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = REES46.modulemap; sourceTree = ""; }; + 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigPlain.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift; sourceTree = ""; }; + 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operative.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift; sourceTree = ""; }; + 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Navigation.swift; path = REES46/Classes/Extensions/NetworkStatus/Navigation.swift; sourceTree = ""; }; + 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsManageable.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift; sourceTree = ""; }; + 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchResponse.swift; path = REES46/Classes/Model/SearchResponse.swift; sourceTree = ""; }; + 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift; sourceTree = ""; }; + 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-umbrella.h"; sourceTree = ""; }; + 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoaderError.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift; sourceTree = ""; }; + 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryButton.swift; path = REES46/Classes/Button/StoryButton.swift; sourceTree = ""; }; + 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserSettings.swift; path = REES46/Classes/Model/UserSettings.swift; 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; }; - 9DD3508B88FE26F6A3F11E3592EABE76 /* SDWebImageCacheKeyFilter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheKeyFilter.m; path = SDWebImage/Core/SDWebImageCacheKeyFilter.m; sourceTree = ""; }; - 9E75A98569DB590F251712101F570DDF /* SDImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOCoder.m; path = SDWebImage/Core/SDImageIOCoder.m; sourceTree = ""; }; - 9F9E8DB46CE03201B31155CD1C20A209 /* SDWebImageOptionsProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOptionsProcessor.h; path = SDWebImage/Core/SDWebImageOptionsProcessor.h; sourceTree = ""; }; + 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBTextConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift; sourceTree = ""; }; + 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsResponse.swift; path = REES46/Classes/Model/ProductsResponse.swift; sourceTree = ""; }; A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios"; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A18B7AA27C00B2187B45D6ED87A6451F /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/Core/UIView+WebCache.m"; sourceTree = ""; }; - A1FF8B59E306A9AFBE9135DF6A50DEF0 /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = ""; }; - A21051CBF115DB2382ACC62E5753C6D1 /* SDWebImageSwiftUI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImageSwiftUI.debug.xcconfig; sourceTree = ""; }; - A25CA20AE6CA0E7F3C0889BC83B80448 /* TBFontConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBFontConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift; sourceTree = ""; }; - A684C681F875FE1D6779FA17B5C84369 /* SlideViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideViewController.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift; sourceTree = ""; }; - A6C3DF1CDD3FE376A3F15467BFBE0C34 /* REES46.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = REES46.modulemap; sourceTree = ""; }; - A6EB5D5955124BD96D5764A18024EBC9 /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; - A7ABCAC767B04BBD3402CDF2E10D7BA2 /* SDImageCachesManagerOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManagerOperation.m; path = SDWebImage/Private/SDImageCachesManagerOperation.m; sourceTree = ""; }; - A7CCF7778104AADB2758AF4CEBDA340C /* SDWebImageError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageError.m; path = SDWebImage/Core/SDWebImageError.m; sourceTree = ""; }; - A7CF07AF8F15177CC07ABE9749506EBE /* SdkApperanceViewScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkApperanceViewScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift; sourceTree = ""; }; - A872CADF5D680724A3A6EFB82C356231 /* RecommendationsWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift; sourceTree = ""; }; - A918F55072B1534B417AA4F202B62150 /* RecommendationsWidgetConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetConstants.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift; sourceTree = ""; }; - A9B08A53140D0BE71718A5F3E03BE881 /* UserDefaultsExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserDefaultsExtension.swift; path = REES46/Classes/Extensions/UserDefaultsExtension.swift; sourceTree = ""; }; - A9E9CD98B980FB05A787A2A69CFBF17D /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/Core/SDWebImageTransition.m; sourceTree = ""; }; - AAB1F97077878093D8E2B46380CF317E /* UIBezierPath+ImagePlaceholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+ImagePlaceholder.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift"; sourceTree = ""; }; - AAC6B9F7A35D8F631BD99CED340CCC92 /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.h"; sourceTree = ""; }; - AB269F7C83AFFDDCF8E8834DA023EEF5 /* InitResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitResponse.swift; path = REES46/Classes/Model/InitResponse.swift; sourceTree = ""; }; - ABC60206222E6A71DE4443E593C4CBD1 /* ImageLoaderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoaderError.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift; sourceTree = ""; }; - AC97720D830D4D8C05B9307B8708AF6C /* RawRepresentable+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RawRepresentable+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift"; sourceTree = ""; }; - ACC7F80B4FA266A86011287DD80262CC /* VideoDownloadManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadManager.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift; sourceTree = ""; }; - ADC7B43237FE86C4ED670AA6A7264CB9 /* SDmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDmetamacros.h; path = SDWebImage/Private/SDmetamacros.h; sourceTree = ""; }; - AE1161FDAF59CC1A383B889BA00AA0DB /* SdkStyleColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift; sourceTree = ""; }; - AE2158DADDE006E15A6B82206F7E1E5A /* TBTextConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBTextConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift; sourceTree = ""; }; - B0B214D775196BA7CA8E17E53048A493 /* SDWebImage */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B17D8267AF1AFF8A10E7F8F01C219FBE /* SdkQueryBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkQueryBuilder.swift; path = REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift; sourceTree = ""; }; - B2B17F5BDD1F69B5C7C4A70BF44675BE /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/Core/NSData+ImageContentType.m"; sourceTree = ""; }; - B2B921ED7BF87B51971BDCC684F43C49 /* StoriesCollectionViewPreviewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesCollectionViewPreviewCell.swift; path = REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift; sourceTree = ""; }; - B38071E71CDBC65FB0D4D71CF0F240A7 /* SDImageLoadersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoadersManager.h; path = SDWebImage/Core/SDImageLoadersManager.h; sourceTree = ""; }; - B3CD2DB27E7FF6985AF2F043DFBA34BF /* SDImageAPNGCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAPNGCoder.h; path = SDWebImage/Core/SDImageAPNGCoder.h; sourceTree = ""; }; - B41372352EEE4B1588AE589803A39DAD /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; - B4839081A2EE7970A91843BDFB777B4F /* SessionDataTaskProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTaskProtocol.swift; path = REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift; sourceTree = ""; }; - B603BAB61730E8452D4CEE95A702E9E6 /* Pods-demo-store-iosTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-iosTests-acknowledgements.markdown"; sourceTree = ""; }; - B6DCA8DE902167DD220E0157EB047FD9 /* SDImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFrame.h; path = SDWebImage/Core/SDImageFrame.h; sourceTree = ""; }; - B7144CB0515E7DD6254EBD33FB925996 /* UIImage+Transform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Transform.h"; path = "SDWebImage/Core/UIImage+Transform.h"; sourceTree = ""; }; - B799A41A144BDE98B056E872D41934CC /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = ""; }; - B7A6F0159639AD7880D2D68CF10C375F /* SDMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDMemoryCache.m; path = SDWebImage/Core/SDMemoryCache.m; sourceTree = ""; }; - B8531EA1CC88039F9D35056BBDB103A7 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = WebImage/PrivacyInfo.xcprivacy; sourceTree = ""; }; - B8DAA896D2C34C91B3625C9591FA0310 /* SDWebImageCacheSerializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheSerializer.m; path = SDWebImage/Core/SDWebImageCacheSerializer.m; sourceTree = ""; }; - B9453C5A02D3E773A8845189A2EF3E5B /* UIImage+Metadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Metadata.m"; path = "SDWebImage/Core/UIImage+Metadata.m"; sourceTree = ""; }; - B9D73BB06718EE0ED3AA135424012A3E /* SDDisplayLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDisplayLink.m; path = SDWebImage/Private/SDDisplayLink.m; sourceTree = ""; }; - BA06266BAF144C3649CAA2E2C46C9386 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/Core/UIImageView+WebCache.h"; sourceTree = ""; }; - BA638D7683BDDA60DC86AD84777743A4 /* SDAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageView.h; path = SDWebImage/Core/SDAnimatedImageView.h; sourceTree = ""; }; - BA7C2D0D5068F1BBBF48D4DECAD5B3F9 /* SDWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWeakProxy.h; path = SDWebImage/Private/SDWeakProxy.h; sourceTree = ""; }; - BA90567D2B0F1D5538610C5715BF9684 /* URLLiteralConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLLiteralConvertible.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift; sourceTree = ""; }; - BB5652D277DB8F8932201F454562E551 /* SDAnimatedImagePlayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImagePlayer.h; path = SDWebImage/Core/SDAnimatedImagePlayer.h; sourceTree = ""; }; - BD12F79A7009CE1C816858354BB28B16 /* StoriesView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesView.swift; path = REES46/Classes/Stories/StoriesView.swift; sourceTree = ""; }; - BD7E9A5DEA0D84EB96ABDCE752E5FE97 /* CGRect+Center.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Center.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift"; sourceTree = ""; }; - BDBCFAB7B704ABF80789FF3A7F6F3A0B /* Pods-demo-store-ios-demo-store-iosUITests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; sourceTree = ""; }; - BE98821C5B55540B75A1E35C0113ED01 /* SdkFontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInjector.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift; sourceTree = ""; }; - C03EC13E1567E28D939C4CB1E36878E5 /* SDImageAssetManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAssetManager.h; path = SDWebImage/Private/SDImageAssetManager.h; sourceTree = ""; }; - C0A7C4F93426C9E1F538C7A9D7D26A38 /* Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh"; sourceTree = ""; }; - C0B13A2564427A5D3271A22CC081B485 /* TextBlockConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockConstants.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift; sourceTree = ""; }; - C131B5AD1AE17B1E7669FF4AD7F634F2 /* CarouselCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionView.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift; sourceTree = ""; }; - C1D8A05C1E4B2166E04A020BADD37E6F /* SDWebImageCacheKeyFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheKeyFilter.h; path = SDWebImage/Core/SDWebImageCacheKeyFilter.h; sourceTree = ""; }; - C2391013284B0804D94D42F1224978E1 /* SimplePersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SimplePersonalizationSDK.swift; path = REES46/Classes/SimplePersonalizationSDK.swift; sourceTree = ""; }; - C2480646E98913D695E05C0FD776B508 /* SDImageHEICCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageHEICCoder.m; path = SDWebImage/Core/SDImageHEICCoder.m; sourceTree = ""; }; - C4975126590177D7FBC347D4110732AB /* SDWebImageError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageError.h; path = SDWebImage/Core/SDWebImageError.h; sourceTree = ""; }; - C5299BDBCFF31D3A149189632F841108 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/Core/UIButton+WebCache.m"; sourceTree = ""; }; - C54D76765D76345DEE85C2577A0BE71C /* StoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryButton.swift; path = REES46/Classes/Button/StoryButton.swift; sourceTree = ""; }; - C58E5652FE52EBEEC8CFECDDAB7690EA /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-demo-store-iosUITests-dummy.m"; sourceTree = ""; }; - C5FB4BE9DAD06FEA5F98A303DCDA7ECA /* NotificationHandlingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingService.swift; path = REES46/Classes/ServiceProtocols/NotificationHandlingService.swift; sourceTree = ""; }; - C6AE3B6A7C454F39D7DC1A21465B15CD /* NetworkConnectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift; sourceTree = ""; }; - C70EF61B85CB5E0C32E22E64A24C5419 /* SDWebImageOptionsProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOptionsProcessor.m; path = SDWebImage/Core/SDWebImageOptionsProcessor.m; sourceTree = ""; }; - C9A3B19D8F5A4D74B59E5858C18A89C7 /* GenericDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenericDataTask.swift; path = REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift; sourceTree = ""; }; - CA1970B7E000CD93CD5ABDD9C90EF69D /* SearchWidgetListViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListViewCell.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift; sourceTree = ""; }; - CA91031AD1B1A421B1E129492D976C39 /* SDImageLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoader.m; path = SDWebImage/Core/SDImageLoader.m; sourceTree = ""; }; - CB360C271FF5A9ACB1881BD995CD3EA9 /* SDWebImageDownloaderRequestModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderRequestModifier.m; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.m; sourceTree = ""; }; - CBD844A1FA21892ABF089EC57D9B69A0 /* SDFileAttributeHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDFileAttributeHelper.h; path = SDWebImage/Private/SDFileAttributeHelper.h; sourceTree = ""; }; - CC320234FBEEEB88843D7C10B8E7556D /* SDAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SDAnimatedImageView+WebCache.m"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.m"; sourceTree = ""; }; - CC817825B6B9D79C94B440B657997769 /* Backport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Backport.swift; path = SDWebImageSwiftUI/Classes/Backports/Backport.swift; sourceTree = ""; }; - CD162A74396D56FCB345484D359792F2 /* SDWebImageDownloaderDecryptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderDecryptor.m; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.m; sourceTree = ""; }; - CE44DD5CCECDDF5CE93F504C6A95D0C4 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/Core/SDWebImageCompat.h; sourceTree = ""; }; - CEBDC88DD3BCA0C8036016944005827F /* ImageViewWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageViewWrapper.swift; path = SDWebImageSwiftUI/Classes/ImageViewWrapper.swift; sourceTree = ""; }; - CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "SDWebImage-SDWebImage"; path = SDWebImage.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - CF3EEBF138E337F258E50A3999B2C0D4 /* SDImageCacheDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheDefine.m; path = SDWebImage/Core/SDImageCacheDefine.m; sourceTree = ""; }; - CFA4DC5C53C70119E18B12E39210BCF1 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist"; sourceTree = ""; }; - D093835AC080A50072C58F9D8F4E0A9B /* SDImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoder.h; path = SDWebImage/Core/SDImageCoder.h; sourceTree = ""; }; - D2F7D9DCF90BD5C51C99013B92EAE9DB /* SdkStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyle.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift; sourceTree = ""; }; - D33604BF63E7A1EEFE13AA897DC73B16 /* UIColor+SDHexString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+SDHexString.m"; path = "SDWebImage/Private/UIColor+SDHexString.m"; sourceTree = ""; }; - D3608D39B06183B948806E8EF8CC4845 /* FontFamily.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FontFamily.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift; sourceTree = ""; }; - D45C11F2FD76BEC707586E6425FF78E0 /* SDAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImage.h; path = SDWebImage/Core/SDAnimatedImage.h; sourceTree = ""; }; - D557FCA56AFC2021F32B40BC6AE7328F /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/Core/UIImage+MultiFormat.h"; sourceTree = ""; }; - D59F75F6EA505E9D0CB9B0B15D958665 /* Navigation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Navigation.swift; path = REES46/Classes/Extensions/NetworkStatus/Navigation.swift; sourceTree = ""; }; - D5AC60A10479B2D353EC371DC8B83A57 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; - D6079445C8FAC7E4FF570DA98DBD49E4 /* SDWebImageDownloaderDecryptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderDecryptor.h; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.h; sourceTree = ""; }; - D60D48DCE60F43070C743D0563F167BC /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/Core/SDAnimatedImageRep.h; sourceTree = ""; }; - D6F7531755893C43B30BF9E19D560519 /* HashStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HashStorage.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift; sourceTree = ""; }; - D7DD9C8AB753B4EE55CBE39498167210 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/Core/SDWebImageOperation.h; sourceTree = ""; }; - D9192461900ECBFD6FCBF2CD9D32503F /* CGSize+Min.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGSize+Min.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift"; sourceTree = ""; }; - DA1EBEE93335802768CDDA7AEF9A60AA /* NSImage+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+Compatibility.h"; path = "SDWebImage/Core/NSImage+Compatibility.h"; sourceTree = ""; }; - DAC2860E468BFF18CAD7EED73F4C53D8 /* ImageManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageManager.swift; path = SDWebImageSwiftUI/Classes/ImageManager.swift; sourceTree = ""; }; - DBB1FB349361E086596E4A2F0DB86B38 /* SDAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SDAnimatedImageView+WebCache.h"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.h"; sourceTree = ""; }; - DBC37411E3FBDB55CA1205401E6D3AE2 /* REES46.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.release.xcconfig; sourceTree = ""; }; - DC3973838B69DCC92B65F9C777E03C51 /* SdkStyleCustomFonts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFonts.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift; sourceTree = ""; }; - DC5A6FA54151953B32A9EE306274468A /* ProductsButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsButton.swift; path = REES46/Classes/Button/ProductsButton.swift; sourceTree = ""; }; - DCAB701B1958806B999110D217BE4269 /* TrackServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackServiceImpl.swift; path = REES46/Classes/ServicesImplementation/TrackServiceImpl.swift; sourceTree = ""; }; - DD5541895541D62F5397A02BB8F31386 /* Option.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Option.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift; sourceTree = ""; }; - DDADBA9A1CB5524DE20EC11A40E0AD62 /* SDImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGIFCoder.h; path = SDWebImage/Core/SDImageGIFCoder.h; sourceTree = ""; }; - DE90C578EE2F80BD131A4785E590A767 /* PromoCodeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromoCodeView.swift; path = REES46/Classes/Button/PromoCodeView.swift; sourceTree = ""; }; - E212E372E7728F282D004A4FE04E8399 /* Assets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Assets.swift; path = REES46/Classes/Resources/Assets.swift; sourceTree = ""; }; - E23C6A0C21CCDEEED0DAC1168FC8DE30 /* Pods-demo-store-iosTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-iosTests-umbrella.h"; sourceTree = ""; }; - E3A4DBF13FAB22ACF605B960D791CCDB /* NotificationHandlingServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingServiceImpl.swift; path = REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift; sourceTree = ""; }; - E3BECA1A98E38D6A4281546005B73B48 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/Core/UIButton+WebCache.h"; sourceTree = ""; }; - E43C26A9ABBBD30D24AAC918843657EC /* AnimatedImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedImage.swift; path = SDWebImageSwiftUI/Classes/AnimatedImage.swift; sourceTree = ""; }; - E474B6985E4834A59099E70AE48070CD /* ImagePlayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePlayer.swift; path = SDWebImageSwiftUI/Classes/ImagePlayer.swift; sourceTree = ""; }; - E488745F10B20C3BE441DFD1B370AFD7 /* Pods-demo-store-ios-demo-store-iosUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios-demo-store-iosUITests.modulemap"; sourceTree = ""; }; - E557D339D8D4F28B0349B09C6C53DFCC /* SDWebImageDownloaderConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderConfig.h; path = SDWebImage/Core/SDWebImageDownloaderConfig.h; sourceTree = ""; }; - E57F4AF8733A55E946FD8FB15751E71A /* SDAssociatedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAssociatedObject.m; path = SDWebImage/Private/SDAssociatedObject.m; sourceTree = ""; }; - E6864BAD54FAD2C378EF2E1230E626AD /* SDDeviceHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDeviceHelper.m; path = SDWebImage/Private/SDDeviceHelper.m; sourceTree = ""; }; - E74B0A47D66512282E1FA639A6693404 /* SDWebImageDownloaderResponseModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderResponseModifier.m; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.m; sourceTree = ""; }; - E7C26425398E790B8A16DE4A3A0F5B6F /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/Core/SDAnimatedImageRep.m; sourceTree = ""; }; - E8576C6FF926E093E1A16B8080253AED /* UIImage+ExtendedCacheData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ExtendedCacheData.h"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.h"; sourceTree = ""; }; - E9C5B9C0B9AC8F9C02C59534F887327F /* UIView+WebCacheState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheState.h"; path = "SDWebImage/Core/UIView+WebCacheState.h"; sourceTree = ""; }; - EAC55D6A899A85EB0F0868B73A6F51F6 /* CAPropertyAnimation+Key.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CAPropertyAnimation+Key.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift"; sourceTree = ""; }; - EB8CA267F48ED012779151542F11CD03 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/Core/SDWebImageDownloaderOperation.h; sourceTree = ""; }; - EBE7BB19A4817A68FC4C4F6FD47397D4 /* Coverable+UIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Coverable+UIKit.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift"; sourceTree = ""; }; - EC2D0B5064579CD0BF56EAFC0792E9A5 /* SDImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCodersManager.h; path = SDWebImage/Core/SDImageCodersManager.h; sourceTree = ""; }; - EE16E01FB33A81A9861F1386657A95E2 /* SDInternalMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDInternalMacros.h; path = SDWebImage/Private/SDInternalMacros.h; sourceTree = ""; }; - EF5C7C77DE2A108B989B598603A71255 /* SubscriptionServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionServiceImpl.swift; path = REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift; sourceTree = ""; }; - EFEBEB2D698CB52B18D32D8A44CB117C /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/Core/SDWebImageManager.h; sourceTree = ""; }; - F054392BF6A08C9DBF6FB98AE4A633F3 /* SDImageHEICCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoder.h; path = SDWebImage/Core/SDImageHEICCoder.h; sourceTree = ""; }; - F180D6C6E0768F6A5BC4E1257E5AD297 /* SearchWidgetMainView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetMainView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift; sourceTree = ""; }; - F269AE423D51077DA2EC0CD40577E5BF /* SettingsManageable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsManageable.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift; sourceTree = ""; }; - F27900774BD5451523048BE1D45BA68C /* SDAnimatedImagePlayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImagePlayer.m; path = SDWebImage/Core/SDAnimatedImagePlayer.m; sourceTree = ""; }; - F2F28C758806CA9B47233D61569AC4AE /* TextBlockView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockView.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockView.swift; sourceTree = ""; }; - F3739778E07523A3175EF42603E6D8CD /* SearchWidgetCategoriesButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetCategoriesButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift; sourceTree = ""; }; - F6882D4A05CE1AEF7EBD19E019E3D1D9 /* UIFont+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIFont+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift"; sourceTree = ""; }; - F7F41EC0C09AF0533629C82C319871A2 /* SDCallbackQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDCallbackQueue.m; path = SDWebImage/Core/SDCallbackQueue.m; sourceTree = ""; }; - FA03167D0E708CC82BFBCD6475749CE2 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown"; sourceTree = ""; }; - FAA2A1D8B3E0092C5A2D6AACF916118C /* SDWebImageSwiftUI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageSwiftUI.h; path = SDWebImageSwiftUI/Module/SDWebImageSwiftUI.h; sourceTree = ""; }; - FC6D190307998671654651402F1CE476 /* NetworkStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift; sourceTree = ""; }; - FDD4ACEF0B3F4E25B59359F4A0C563E1 /* CarouselConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselConstants.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift; sourceTree = ""; }; - FDF8837D160CBDE98E1A5352392752A4 /* SDImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoder.m; path = SDWebImage/Core/SDImageCoder.m; sourceTree = ""; }; - FED305701BEF72D8FA302970F6C0F799 /* SDImageTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageTransformer.h; path = SDWebImage/Core/SDImageTransformer.h; sourceTree = ""; }; - FEF1E5F2C7F33C39B10991E4C2386C7E /* NotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationService.swift; path = REES46/Classes/NotificationService.swift; sourceTree = ""; }; - FFA328C3A9F9D9DA68AF6E8DC309DDB4 /* SDImageCachesManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManager.m; path = SDWebImage/Core/SDImageCachesManager.m; sourceTree = ""; }; + A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideViewController.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift; sourceTree = ""; }; + A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift; sourceTree = ""; }; + A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoFileUtils.swift; path = REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift; sourceTree = ""; }; + A3BC4DCD1D930788E65681442B043C28 /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; + A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.release.xcconfig; sourceTree = ""; }; + A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGImageSource+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift"; sourceTree = ""; }; + A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CAPropertyAnimation+Key.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift"; sourceTree = ""; }; + A791B748A86BE064FA80C12134F8E728 /* Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Loader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift; sourceTree = ""; }; + A9C82152B76290FC32122F96E2333F17 /* Assets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Assets.swift; path = REES46/Classes/Resources/Assets.swift; sourceTree = ""; }; + AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendResponse.swift; path = REES46/Classes/Model/RecommendResponse.swift; sourceTree = ""; }; + ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyle.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift; sourceTree = ""; }; + B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+ImagePlaceholder.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift"; sourceTree = ""; }; + B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetExtension.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift; sourceTree = ""; }; + B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+PromocodeBanner.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift"; sourceTree = ""; }; + BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenHandlerImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift; sourceTree = ""; }; + C2CFBF87EB78E30CC4A10E9641F99C7E /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; + C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionService.swift; path = REES46/Classes/ServiceProtocols/SubscriptionService.swift; sourceTree = ""; }; + C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.debug.xcconfig; sourceTree = ""; }; + CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift; sourceTree = ""; }; + CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserverUI.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift; sourceTree = ""; }; + CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideView.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift; sourceTree = ""; }; + CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController_Extensions.swift; path = REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift; sourceTree = ""; }; + D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetCategoriesButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift; sourceTree = ""; }; + D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsStarsView.swift; path = REES46/Classes/Extensions/SdkConfiguration/RecommendationsStars/RecommendationsStarsView.swift; sourceTree = ""; }; + D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HashStorage.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift; sourceTree = ""; }; + D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTaskProtocol.swift; path = REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift; sourceTree = ""; }; + D7C080260E1CE9F3014EAC5192925E48 /* Pods-demo-store-ios-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-acknowledgements.plist"; sourceTree = ""; }; + D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetObjectification.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetObjectification.swift; sourceTree = ""; }; + DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoader.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift; sourceTree = ""; }; + DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = REES46/Classes/Resources/Assets.xcassets; sourceTree = ""; }; + DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkActivityIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift; sourceTree = ""; }; + DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetDelegate.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift; sourceTree = ""; }; + DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift; sourceTree = ""; }; + DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "REES46-dummy.m"; sourceTree = ""; }; + E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift"; sourceTree = ""; }; + E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionView.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift; sourceTree = ""; }; + E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkQueryBuilder.swift; path = REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift; sourceTree = ""; }; + E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ColorExtensions.swift; path = REES46/Classes/Shared/ColorExtensions.swift; sourceTree = ""; }; + EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Center.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift"; sourceTree = ""; }; + EFE1038B30DAB86B0B88A1A3AAC6E034 /* REES46-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "REES46-Info.plist"; sourceTree = ""; }; + F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkPopupAlertView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift; sourceTree = ""; }; + F0D4FB2CBD68E89DAE39DADAE996D715 /* Pods-demo-store-ios-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-dummy.m"; sourceTree = ""; }; + F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UISdkWrapLabel.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift; sourceTree = ""; }; + F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetTextField.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift; sourceTree = ""; }; + F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadObject.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift; sourceTree = ""; }; + F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PersonalizationSDK.swift; path = REES46/Classes/PersonalizationSDK.swift; sourceTree = ""; }; + F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLLiteralConvertible.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift; sourceTree = ""; }; + F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestOperation.swift; path = REES46/Classes/Extensions/SessionQueue/RequestOperation.swift; sourceTree = ""; }; + F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesCollectionViewPreviewCell.swift; path = REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift; sourceTree = ""; }; + F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGSize+Min.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift"; sourceTree = ""; }; + F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RawRepresentable+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift"; sourceTree = ""; }; + FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift; sourceTree = ""; }; + FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FontFamily.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift; sourceTree = ""; }; + FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Coverable.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift; sourceTree = ""; }; + FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift; sourceTree = ""; }; + FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ManagedViewConfig.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 182DE84121F07E8506C7C52B3CABFB61 /* Frameworks */ = { + 0F5AD16E4861F5A40FD3476C13069579 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3726922467DD0501527002C0C31278E4 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -786,653 +347,254 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - AFCF64B8D3CC9AD61C5688BD27333799 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 04FE5E229D14053DDD6AC83FC3D9AFC6 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CAA97552934E1B65AD863436D8DAEC7D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - FF45293373DD3208E626AACA6EE03513 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CD3FD375884976E99F234948F32A5A9E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - E377EFE16FB8C700C69171DD7AE4FFA9 /* Foundation.framework in Frameworks */, - 62B9FB2BAB0F70C3705B33D50FEEFBD2 /* ImageIO.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DDE962E06D3E045B2C3E65379DB3E5DB /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 978A73763500D7A9A4A0F878716CAC12 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DECADAED0D9B70A5AB59DADE37D3AE1E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 79D2610CEAF017AD0332D7F90672483A /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0F8FC3C2C0BD1A703540DB0EA1712A90 /* Pods */ = { + 05C54A4D55BA128EDFC7C91451A8BB11 /* Pods */ = { isa = PBXGroup; children = ( - 735951A47824127AB7CB703C0F3ABD96 /* REES46 */, - 69D0F221889BE65CE17C10CAD336C263 /* SDWebImage */, - B57FC262D80A6FC3160E63A50D0375AD /* SDWebImageSwiftUI */, + 2C90CD89B61815D5FE9D0AE6A9D21A2F /* REES46 */, ); name = Pods; sourceTree = ""; }; - 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { + 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */ = { isa = PBXGroup; children = ( - A2DAB88224A5C6E444F84116BC10553A /* iOS */, + DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */, + 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */, + 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */, + 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */, ); - name = Frameworks; - sourceTree = ""; - }; - 2480E569F42E6AAE728108B5024E7F49 /* Core */ = { - isa = PBXGroup; - children = ( - 828C3606A950C4AAE88974C9EEB6B09E /* NSBezierPath+SDRoundedCorners.h */, - 58F71D4BD9974824651245DBC500E711 /* NSBezierPath+SDRoundedCorners.m */, - 3C4A6E08625EBFD1238EB565499849E3 /* NSButton+WebCache.h */, - 34F6F6267F550D1B9B7ACD345C3E0668 /* NSButton+WebCache.m */, - 153B813592BB94FAFB1B69B37EB2DED1 /* NSData+ImageContentType.h */, - B2B17F5BDD1F69B5C7C4A70BF44675BE /* NSData+ImageContentType.m */, - DA1EBEE93335802768CDDA7AEF9A60AA /* NSImage+Compatibility.h */, - 65A52C786ED0456F2DD0D7E95F90F8B8 /* NSImage+Compatibility.m */, - D45C11F2FD76BEC707586E6425FF78E0 /* SDAnimatedImage.h */, - 01949FADB1DF51BC47166556FEBFE773 /* SDAnimatedImage.m */, - BB5652D277DB8F8932201F454562E551 /* SDAnimatedImagePlayer.h */, - F27900774BD5451523048BE1D45BA68C /* SDAnimatedImagePlayer.m */, - D60D48DCE60F43070C743D0563F167BC /* SDAnimatedImageRep.h */, - E7C26425398E790B8A16DE4A3A0F5B6F /* SDAnimatedImageRep.m */, - BA638D7683BDDA60DC86AD84777743A4 /* SDAnimatedImageView.h */, - 3C410EC9FA1D242644C94FD5BB0DCC7F /* SDAnimatedImageView.m */, - DBB1FB349361E086596E4A2F0DB86B38 /* SDAnimatedImageView+WebCache.h */, - CC320234FBEEEB88843D7C10B8E7556D /* SDAnimatedImageView+WebCache.m */, - 79161E2AE3EBB7A8C5037E3821873380 /* SDAssociatedObject.h */, - E57F4AF8733A55E946FD8FB15751E71A /* SDAssociatedObject.m */, - 72BAC27599E684B921A906800DBB9B3E /* SDAsyncBlockOperation.h */, - 93852F96F75724CE63ED467E5C544270 /* SDAsyncBlockOperation.m */, - 66892A39AD576FB00A0E72D743C5B5F4 /* SDCallbackQueue.h */, - F7F41EC0C09AF0533629C82C319871A2 /* SDCallbackQueue.m */, - 5C8C91A282536A9AD77BFAB844A8F376 /* SDDeviceHelper.h */, - E6864BAD54FAD2C378EF2E1230E626AD /* SDDeviceHelper.m */, - 6CFA6F80E28B127534C67C258F67330D /* SDDiskCache.h */, - 0950384B82209DB75A156574D201B451 /* SDDiskCache.m */, - 1D6FDAFF796C99AED706D3F44F4A7B8F /* SDDisplayLink.h */, - B9D73BB06718EE0ED3AA135424012A3E /* SDDisplayLink.m */, - CBD844A1FA21892ABF089EC57D9B69A0 /* SDFileAttributeHelper.h */, - 302A8EC471B54D588E44D73F09C36F82 /* SDFileAttributeHelper.m */, - 3EF2C06F474A7E1365D101FD38EDD192 /* SDGraphicsImageRenderer.h */, - 05CB137A80B79559FF8A751F6E3C15B7 /* SDGraphicsImageRenderer.m */, - B3CD2DB27E7FF6985AF2F043DFBA34BF /* SDImageAPNGCoder.h */, - 22E9C09EE96235DC612E7FDB70D8EB98 /* SDImageAPNGCoder.m */, - C03EC13E1567E28D939C4CB1E36878E5 /* SDImageAssetManager.h */, - 24783625BE78E3C757479BA61BFAC0A6 /* SDImageAssetManager.m */, - 913A2C2605A42A57859DA310AC8C704F /* SDImageAWebPCoder.h */, - 9BF55A80D900FC0E395B74E5440155DA /* SDImageAWebPCoder.m */, - 3F1B596D47CB175EBED6915E6C02D2ED /* SDImageCache.h */, - 39D601084E48E12065CB0FB34E2814BF /* SDImageCache.m */, - 2C823347DAB1A2B3C3EAEAFACF196622 /* SDImageCacheConfig.h */, - 2FE7246FC198AE307DAD3891ADC5FE80 /* SDImageCacheConfig.m */, - 054F9EA00DA4E6B7B90CA2D91C46007C /* SDImageCacheDefine.h */, - CF3EEBF138E337F258E50A3999B2C0D4 /* SDImageCacheDefine.m */, - 95A5032C5249239170C6C56B8BEC1620 /* SDImageCachesManager.h */, - FFA328C3A9F9D9DA68AF6E8DC309DDB4 /* SDImageCachesManager.m */, - 3D0BDF6EBE4794388029C368DD323927 /* SDImageCachesManagerOperation.h */, - A7ABCAC767B04BBD3402CDF2E10D7BA2 /* SDImageCachesManagerOperation.m */, - D093835AC080A50072C58F9D8F4E0A9B /* SDImageCoder.h */, - FDF8837D160CBDE98E1A5352392752A4 /* SDImageCoder.m */, - 81A7464CC9CCCD0F6CEAB02954C74B71 /* SDImageCoderHelper.h */, - 385D24232663F9F21F5D0C0F0DA7A763 /* SDImageCoderHelper.m */, - EC2D0B5064579CD0BF56EAFC0792E9A5 /* SDImageCodersManager.h */, - 12FBF0A87753C1C15550A9EDE725073D /* SDImageCodersManager.m */, - B6DCA8DE902167DD220E0157EB047FD9 /* SDImageFrame.h */, - 05D020DF7555623CE56D7342B92089D6 /* SDImageFrame.m */, - 66FC775DB87F1F5E3A252D7C0DB818ED /* SDImageFramePool.h */, - 764CCAEDDE803665E562352946EBBFA8 /* SDImageFramePool.m */, - DDADBA9A1CB5524DE20EC11A40E0AD62 /* SDImageGIFCoder.h */, - 9342870F1B17CE6B55C0E506E939EB84 /* SDImageGIFCoder.m */, - 9A4C76575F957CF7FF3972130D58A634 /* SDImageGraphics.h */, - 0E5615848B998FCBF7B3C601180F6533 /* SDImageGraphics.m */, - F054392BF6A08C9DBF6FB98AE4A633F3 /* SDImageHEICCoder.h */, - C2480646E98913D695E05C0FD776B508 /* SDImageHEICCoder.m */, - 63BAD4815E80530574567C6C941B7D35 /* SDImageIOAnimatedCoder.h */, - 965F1DCE80D5E47223972A8914CF7D2E /* SDImageIOAnimatedCoder.m */, - 14B77A4BA58A9F1E17C8E687B03430D5 /* SDImageIOAnimatedCoderInternal.h */, - 609A44AA239B50B276698311810DF46C /* SDImageIOCoder.h */, - 9E75A98569DB590F251712101F570DDF /* SDImageIOCoder.m */, - 693D0696C64D9BB4F4BCC7D548564FB8 /* SDImageLoader.h */, - CA91031AD1B1A421B1E129492D976C39 /* SDImageLoader.m */, - B38071E71CDBC65FB0D4D71CF0F240A7 /* SDImageLoadersManager.h */, - 8C625FCC124326FD82C5D1D495462CBA /* SDImageLoadersManager.m */, - FED305701BEF72D8FA302970F6C0F799 /* SDImageTransformer.h */, - 2BA417CE2D73128F66E80F6070CA08EE /* SDImageTransformer.m */, - EE16E01FB33A81A9861F1386657A95E2 /* SDInternalMacros.h */, - 7E183E61E8F24778ED0F299E9CDF7098 /* SDInternalMacros.m */, - 94A8EBE7ECE2DEB427F6FEE4AFAFCA25 /* SDMemoryCache.h */, - B7A6F0159639AD7880D2D68CF10C375F /* SDMemoryCache.m */, - ADC7B43237FE86C4ED670AA6A7264CB9 /* SDmetamacros.h */, - BA7C2D0D5068F1BBBF48D4DECAD5B3F9 /* SDWeakProxy.h */, - 89E336EB6E5CA8CBA413FD162AC5E781 /* SDWeakProxy.m */, - 0747F2B66D5854265EBF7A4B9CDCA0EC /* SDWebImage.h */, - C1D8A05C1E4B2166E04A020BADD37E6F /* SDWebImageCacheKeyFilter.h */, - 9DD3508B88FE26F6A3F11E3592EABE76 /* SDWebImageCacheKeyFilter.m */, - 48F8626ED92FAA27298CB92425BE0288 /* SDWebImageCacheSerializer.h */, - B8DAA896D2C34C91B3625C9591FA0310 /* SDWebImageCacheSerializer.m */, - CE44DD5CCECDDF5CE93F504C6A95D0C4 /* SDWebImageCompat.h */, - 967A3684F3A19FB31E7EEDBCEE8E376D /* SDWebImageCompat.m */, - 2B0B4109307136D655FFB5991A75A5DC /* SDWebImageDefine.h */, - 721D6D167B5F76DE3399711D8B8F1980 /* SDWebImageDefine.m */, - 3DA2EDB38D52E3A594FD04DDF1FC4DD8 /* SDWebImageDownloader.h */, - 7180342E0BEDD11728D7A13F83122F1A /* SDWebImageDownloader.m */, - E557D339D8D4F28B0349B09C6C53DFCC /* SDWebImageDownloaderConfig.h */, - 0BAFD4926F5BEF0E7D2592ACDAEA47F3 /* SDWebImageDownloaderConfig.m */, - D6079445C8FAC7E4FF570DA98DBD49E4 /* SDWebImageDownloaderDecryptor.h */, - CD162A74396D56FCB345484D359792F2 /* SDWebImageDownloaderDecryptor.m */, - EB8CA267F48ED012779151542F11CD03 /* SDWebImageDownloaderOperation.h */, - 5FD013C1407EF41F0DB420AF3709D869 /* SDWebImageDownloaderOperation.m */, - 79E8E12D344406C699B8AB3CC0B36E2C /* SDWebImageDownloaderRequestModifier.h */, - CB360C271FF5A9ACB1881BD995CD3EA9 /* SDWebImageDownloaderRequestModifier.m */, - 446B5D79A9B5EFBF90DDBEC5B0006A76 /* SDWebImageDownloaderResponseModifier.h */, - E74B0A47D66512282E1FA639A6693404 /* SDWebImageDownloaderResponseModifier.m */, - C4975126590177D7FBC347D4110732AB /* SDWebImageError.h */, - A7CCF7778104AADB2758AF4CEBDA340C /* SDWebImageError.m */, - 779D3AACB3FFC5D21447E5995A7D8169 /* SDWebImageIndicator.h */, - 8E21105E533FF43048ACF1009CF05F4F /* SDWebImageIndicator.m */, - EFEBEB2D698CB52B18D32D8A44CB117C /* SDWebImageManager.h */, - 2E7CAF23E69EC6B7DB7D7CDEFC96C5C6 /* SDWebImageManager.m */, - D7DD9C8AB753B4EE55CBE39498167210 /* SDWebImageOperation.h */, - 085AEFC7C28A15F206741200F820F38B /* SDWebImageOperation.m */, - 9F9E8DB46CE03201B31155CD1C20A209 /* SDWebImageOptionsProcessor.h */, - C70EF61B85CB5E0C32E22E64A24C5419 /* SDWebImageOptionsProcessor.m */, - 77DA9FAF14BC95865EB72E3778D3DD5E /* SDWebImagePrefetcher.h */, - 5AE0E2DC679FA76AFCBE4F10C002B5E8 /* SDWebImagePrefetcher.m */, - 4546F55366F817C14243B677296A3BEB /* SDWebImageTransition.h */, - A9E9CD98B980FB05A787A2A69CFBF17D /* SDWebImageTransition.m */, - 50CE6E565037959B2AC4CEB87052B390 /* SDWebImageTransitionInternal.h */, - E3BECA1A98E38D6A4281546005B73B48 /* UIButton+WebCache.h */, - C5299BDBCFF31D3A149189632F841108 /* UIButton+WebCache.m */, - 012F10698C136315708F93A29670131E /* UIColor+SDHexString.h */, - D33604BF63E7A1EEFE13AA897DC73B16 /* UIColor+SDHexString.m */, - E8576C6FF926E093E1A16B8080253AED /* UIImage+ExtendedCacheData.h */, - 5C7BE26FDD9A42E5961777E59579165F /* UIImage+ExtendedCacheData.m */, - 5BC56B47FC5C9CC44C3585CA3C9561D9 /* UIImage+ForceDecode.h */, - 31A27027A1324B45B2F6F5C9BFA7EE29 /* UIImage+ForceDecode.m */, - 156E069BEAD7BB288F1EAB97FDDD68F4 /* UIImage+GIF.h */, - 51BFD59F8F32B660DCC66F98EFD1A6CE /* UIImage+GIF.m */, - AAC6B9F7A35D8F631BD99CED340CCC92 /* UIImage+MemoryCacheCost.h */, - 65C49FAC640F96CEADE5484866E0FC4E /* UIImage+MemoryCacheCost.m */, - 9C4AC7B7715AD884E51877A463095BF1 /* UIImage+Metadata.h */, - B9453C5A02D3E773A8845189A2EF3E5B /* UIImage+Metadata.m */, - D557FCA56AFC2021F32B40BC6AE7328F /* UIImage+MultiFormat.h */, - 36F5D2A790ECA81D45F8B61225A715D5 /* UIImage+MultiFormat.m */, - B7144CB0515E7DD6254EBD33FB925996 /* UIImage+Transform.h */, - 2DF5621E59EA431F7D24B338AF41DAF1 /* UIImage+Transform.m */, - 19CB0A67BA30881F8E68E3431B761F02 /* UIImageView+HighlightedWebCache.h */, - 791F99A8CC2762A65CBEF72F99CBB292 /* UIImageView+HighlightedWebCache.m */, - BA06266BAF144C3649CAA2E2C46C9386 /* UIImageView+WebCache.h */, - 65AE02622EA56AB3A84F2D7776259B6F /* UIImageView+WebCache.m */, - 8DECD257A7D9712BFEF049E58533DD45 /* UIView+WebCache.h */, - A18B7AA27C00B2187B45D6ED87A6451F /* UIView+WebCache.m */, - 1C0B64B639FD80A20B3EEBE805B0C5B2 /* UIView+WebCacheOperation.h */, - 1E5120A81E18A4375BE2C935A99E02B5 /* UIView+WebCacheOperation.m */, - E9C5B9C0B9AC8F9C02C59534F887327F /* UIView+WebCacheState.h */, - 50E032345F0385B49508C224E5FAB205 /* UIView+WebCacheState.m */, - 25AF91774A1B2F3F43F600370BAB1A35 /* Resources */, - ); - name = Core; + name = Resources; sourceTree = ""; }; - 25AF91774A1B2F3F43F600370BAB1A35 /* Resources */ = { + 2C90CD89B61815D5FE9D0AE6A9D21A2F /* REES46 */ = { isa = PBXGroup; children = ( - B8531EA1CC88039F9D35056BBDB103A7 /* PrivacyInfo.xcprivacy */, + A9C82152B76290FC32122F96E2333F17 /* Assets.swift */, + A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */, + E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */, + 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */, + 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */, + 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */, + A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */, + EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */, + F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */, + E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */, + FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */, + 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */, + 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */, + 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */, + FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */, + 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */, + D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */, + 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */, + DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */, + 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */, + 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */, + 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */, + 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */, + A791B748A86BE064FA80C12134F8E728 /* Loader.swift */, + 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */, + FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */, + 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */, + FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */, + 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */, + 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */, + 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */, + 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */, + CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */, + 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */, + 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */, + 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */, + 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */, + 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */, + F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */, + 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */, + 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */, + 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */, + 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */, + BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */, + 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */, + 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */, + F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */, + D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */, + 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */, + 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */, + 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */, + AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */, + 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */, + 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */, + F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */, + 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */, + 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */, + CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */, + DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */, + 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */, + 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */, + 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */, + 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */, + 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */, + 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */, + 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */, + F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */, + E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */, + ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */, + 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */, + 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */, + 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */, + DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */, + CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */, + 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */, + 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */, + 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */, + A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */, + 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */, + 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */, + 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */, + D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */, + DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */, + B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */, + 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */, + 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */, + 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */, + 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */, + 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */, + D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */, + F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */, + FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */, + 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */, + D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */, + 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */, + 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */, + 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */, + 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */, + CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */, + A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */, + 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */, + F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */, + 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */, + 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */, + 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */, + 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */, + 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */, + 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */, + 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */, + C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */, + 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */, + 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */, + 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */, + 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */, + 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */, + 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */, + 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */, + 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */, + 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */, + 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */, + B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */, + 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */, + 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */, + 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */, + 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */, + E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */, + F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */, + B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */, + F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */, + 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */, + 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */, + 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */, + 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */, + F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */, + A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */, + 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */, + 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */, + 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */, + A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */, ); - name = Resources; + name = REES46; + path = REES46; sourceTree = ""; }; - 39EF6A21DB94D022FD5AAD50C63F0C35 /* Products */ = { + 45F05160E1AA18223A137E9876780947 /* Products */ = { isa = PBXGroup; children = ( A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */, - 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */, - 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */, 3671B3C220D01E22000CF41146C2B4AB /* REES46 */, - B0B214D775196BA7CA8E17E53048A493 /* SDWebImage */, - CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */, - 6B1B10F952F684F6767E6903C2F5E816 /* SDWebImageSwiftUI */, ); name = Products; sourceTree = ""; }; - 421E5C4F1CB4560D8EC4FCBE1120AE3E /* Pods-demo-store-iosTests */ = { + 54B44E4960940F6283E5BE08B84C2EC2 /* Targets Support Files */ = { isa = PBXGroup; children = ( - 48D43AAA52FE567ADF7FABD5AD0D1218 /* Pods-demo-store-iosTests.modulemap */, - B603BAB61730E8452D4CEE95A702E9E6 /* Pods-demo-store-iosTests-acknowledgements.markdown */, - 774742885C515AA49BD28EF3648BA370 /* Pods-demo-store-iosTests-acknowledgements.plist */, - 2FB9E93A5A045ADF557378B54D551DDE /* Pods-demo-store-iosTests-dummy.m */, - 0BB49B831AF796BFD54D280D4E950744 /* Pods-demo-store-iosTests-Info.plist */, - E23C6A0C21CCDEEED0DAC1168FC8DE30 /* Pods-demo-store-iosTests-umbrella.h */, - A6EB5D5955124BD96D5764A18024EBC9 /* Pods-demo-store-iosTests.debug.xcconfig */, - 6FEE741AF14146505421E6B9B790997B /* Pods-demo-store-iosTests.release.xcconfig */, + 954B01C74F670F14C780EC5EE723E738 /* Pods-demo-store-ios */, ); - name = "Pods-demo-store-iosTests"; - path = "Target Support Files/Pods-demo-store-iosTests"; + name = "Targets Support Files"; sourceTree = ""; }; - 449C210F1D4405071D5EC14553BAE4AC /* Pods-demo-store-ios-demo-store-iosUITests */ = { + 578452D2E740E91742655AC8F1636D1F /* iOS */ = { isa = PBXGroup; children = ( - E488745F10B20C3BE441DFD1B370AFD7 /* Pods-demo-store-ios-demo-store-iosUITests.modulemap */, - FA03167D0E708CC82BFBCD6475749CE2 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown */, - CFA4DC5C53C70119E18B12E39210BCF1 /* Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist */, - C58E5652FE52EBEEC8CFECDDAB7690EA /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m */, - C0A7C4F93426C9E1F538C7A9D7D26A38 /* Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh */, - BDBCFAB7B704ABF80789FF3A7F6F3A0B /* Pods-demo-store-ios-demo-store-iosUITests-Info.plist */, - 8FFC11AC8252C36F4B476D4E56652E41 /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h */, - D5AC60A10479B2D353EC371DC8B83A57 /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, - 2A71319F6A963531ACFFF30BCBC6DDB2 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, + 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, ); - name = "Pods-demo-store-ios-demo-store-iosUITests"; - path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests"; + name = iOS; sourceTree = ""; }; - 45A7C2EE7440D2AEC66E412DA39A3B2B /* Pods-demo-store-ios */ = { + 954B01C74F670F14C780EC5EE723E738 /* Pods-demo-store-ios */ = { isa = PBXGroup; children = ( - 4DF8AECAEC072703693B3E3E2C4B83C5 /* Pods-demo-store-ios.modulemap */, - 2E74AC7CFF2C91899A037B82C869DB0A /* Pods-demo-store-ios-acknowledgements.markdown */, - 4566A7EDA1E302A996738A3E6923BB76 /* Pods-demo-store-ios-acknowledgements.plist */, - 37529AFAE21E524BB5CF8528DBDBFF62 /* Pods-demo-store-ios-dummy.m */, - 76DEAE9E95F151F7D441B0550C8E10B5 /* Pods-demo-store-ios-frameworks.sh */, - 1B85BF16297242DA531FC69E93CF9CA5 /* Pods-demo-store-ios-Info.plist */, - 1C72C00B34C83096ED3147E8AAAD8EAE /* Pods-demo-store-ios-umbrella.h */, - B41372352EEE4B1588AE589803A39DAD /* Pods-demo-store-ios.debug.xcconfig */, - 3433BC654811C432BEF5CB32AAF90EFB /* Pods-demo-store-ios.release.xcconfig */, + 3FE45031A73056A2CFA8E93BF0A50596 /* Pods-demo-store-ios.modulemap */, + 711CCF8AFA98AC5676B42688D664CA30 /* Pods-demo-store-ios-acknowledgements.markdown */, + D7C080260E1CE9F3014EAC5192925E48 /* Pods-demo-store-ios-acknowledgements.plist */, + F0D4FB2CBD68E89DAE39DADAE996D715 /* Pods-demo-store-ios-dummy.m */, + 51BADA0045FDF9D08F587320E702DD5D /* Pods-demo-store-ios-frameworks.sh */, + 452AF409E3A7679850A94364FEF83BA4 /* Pods-demo-store-ios-Info.plist */, + 7116768E9395945F655A57DAECC1A933 /* Pods-demo-store-ios-umbrella.h */, + A3BC4DCD1D930788E65681442B043C28 /* Pods-demo-store-ios.debug.xcconfig */, + C2CFBF87EB78E30CC4A10E9641F99C7E /* Pods-demo-store-ios.release.xcconfig */, ); name = "Pods-demo-store-ios"; path = "Target Support Files/Pods-demo-store-ios"; sourceTree = ""; }; - 65D0B108902971FD545088B9D3A3C79A /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 45A7C2EE7440D2AEC66E412DA39A3B2B /* Pods-demo-store-ios */, - 449C210F1D4405071D5EC14553BAE4AC /* Pods-demo-store-ios-demo-store-iosUITests */, - 421E5C4F1CB4560D8EC4FCBE1120AE3E /* Pods-demo-store-iosTests */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - 69D0F221889BE65CE17C10CAD336C263 /* SDWebImage */ = { - isa = PBXGroup; - children = ( - 2480E569F42E6AAE728108B5024E7F49 /* Core */, - ECC9B798C46647949C8056C4EF92E3D0 /* Support Files */, - ); - name = SDWebImage; - path = SDWebImage; - sourceTree = ""; - }; - 735951A47824127AB7CB703C0F3ABD96 /* REES46 */ = { - isa = PBXGroup; - children = ( - E212E372E7728F282D004A4FE04E8399 /* Assets.swift */, - EAC55D6A899A85EB0F0868B73A6F51F6 /* CAPropertyAnimation+Key.swift */, - C131B5AD1AE17B1E7669FF4AD7F634F2 /* CarouselCollectionView.swift */, - 2EC5479EE341C9CAE3AAC92B34E3BD4F /* CarouselCollectionViewCell.swift */, - FDD4ACEF0B3F4E25B59359F4A0C563E1 /* CarouselConstants.swift */, - 0D5B8E3E17032CC03AC3DA26F631C0A9 /* CartItem.swift */, - 906C31FFD1D1B75E909C241295F4C0A2 /* CGImageSource+ImageLoader.swift */, - BD7E9A5DEA0D84EB96ABDCE752E5FE97 /* CGRect+Center.swift */, - D9192461900ECBFD6FCBF2CD9D32503F /* CGSize+Min.swift */, - 43D18ACE031C79021DEEF21AB4FA0A05 /* ColorExtensions.swift */, - 245CD06BD01C6A94F1C8153D1F912FCC /* Coverable.swift */, - EBE7BB19A4817A68FC4C4F6FD47397D4 /* Coverable+UIKit.swift */, - 343136082AD2F8FDA2DECD6015D2A952 /* Data+ImageLoader.swift */, - 025A544F19BC6987E72A6A0A9B1726CA /* Disk.swift */, - D3608D39B06183B948806E8EF8CC4845 /* FontFamily.swift */, - C9A3B19D8F5A4D74B59E5858C18A89C7 /* GenericDataTask.swift */, - D6F7531755893C43B30BF9E19D560519 /* HashStorage.swift */, - 1E25B0169BDF269969E4586C420B6160 /* ImageData.swift */, - 482071A65FE0E3F977402AE06FA26155 /* ImageLoader.swift */, - ABC60206222E6A71DE4443E593C4CBD1 /* ImageLoaderError.swift */, - 72B32CD662708347A951F5E371409877 /* ImageLoading.swift */, - AB269F7C83AFFDDCF8E8834DA023EEF5 /* InitResponse.swift */, - 3A0926E6B50E9D5ABA0EF2C4D5E88642 /* InitService.swift */, - 31C677B04BBC412F101723A7541968AE /* Loader.swift */, - 9AB3A266BBA953A7F6B46B26085D6C56 /* LoadingPlaceholderView.swift */, - 1501C7067A26F553918FA75C59C74AD1 /* ManagedViewConfig.swift */, - D59F75F6EA505E9D0CB9B0B15D958665 /* Navigation.swift */, - 38246598EB440279D380C257FCBCCA52 /* NetworkConnectionStatus.swift */, - C6AE3B6A7C454F39D7DC1A21465B15CD /* NetworkConnectionType.swift */, - 8CA7AD6F6144B1897DD6FED6EF086315 /* NetworkRadioType.swift */, - FC6D190307998671654651402F1CE476 /* NetworkStatus.swift */, - 722820E2AECBDB9CE88DF1F28EDC4C2A /* NetworkStatusObserver.swift */, - 7327B126F904459685ACAB5BB188BA92 /* NetworkStatusObserverUI.swift */, - C5FB4BE9DAD06FEA5F98A303DCDA7ECA /* NotificationHandlingService.swift */, - E3A4DBF13FAB22ACF605B960D791CCDB /* NotificationHandlingServiceImpl.swift */, - FEF1E5F2C7F33C39B10991E4C2386C7E /* NotificationService.swift */, - 9560E66C017A7924466F9F2ED43805A9 /* Operative.swift */, - DD5541895541D62F5397A02BB8F31386 /* Option.swift */, - 3945BB4F984C8941E625264678DEC70C /* PersonalizationSDK.swift */, - DC5A6FA54151953B32A9EE306274468A /* ProductsButton.swift */, - 5CCCC47E503FC830A95DAD71006D4257 /* ProductsResponse.swift */, - 718751286835CE61DAC86CF985BEB152 /* PromocodeBanner.swift */, - DE90C578EE2F80BD131A4785E590A767 /* PromoCodeView.swift */, - 7C3BF456C51A01CDF0D5F36F822566AC /* PushTokenHandlerImpl.swift */, - 8EB8ED5238870DEA90CCE8D421113FC2 /* PushTokenNotificationService.swift */, - 0452D8A6588B9906902D3781A81B7E02 /* PushTokenNotificationServiceImpl.swift */, - AC97720D830D4D8C05B9307B8708AF6C /* RawRepresentable+FontInjector.swift */, - 784409CEDE904360420A93E233B1448E /* RecommendationsStarsView.swift */, - A918F55072B1534B417AA4F202B62150 /* RecommendationsWidgetConstants.swift */, - A872CADF5D680724A3A6EFB82C356231 /* RecommendationsWidgetView.swift */, - 8530AFBFB841B3BC722B46A2526C34AA /* RecommendationsWidgetViewCell.swift */, - 9917CE73936AE2F6F9845457B644BFDB /* RecommendResponse.swift */, - 0AE2DC5138E439FCCEC29C8B4AD17B2D /* RegisterNotification.swift */, - 166CAE72B58135935C298B971F0E810A /* ReloadButton.swift */, - 4726050844C07463EDF54E7B9C36FD61 /* RequestOperation.swift */, - 3BDF4C10853BB55579BDCA649F2DE846 /* RView_Extensions.swift */, - 1A24CFBF01D0409EB666BB081480520E /* RWebViewController.swift */, - 249102CF81952267B123A666190DF430 /* RWebViewController_Extensions.swift */, - 742684B14C7933490E61EE78305318F0 /* SdkActivityIndicator.swift */, - A7CF07AF8F15177CC07ABE9749506EBE /* SdkApperanceViewScheme.swift */, - 6CF075E9AF0C9F42704B25D11A12D16F /* SdkConfiguration.swift */, - 4145512C78F59C07A8ADA786E0C0D0AE /* SdkDynamicFont.swift */, - BE98821C5B55540B75A1E35C0113ED01 /* SdkFontInjector.swift */, - 2238B2DE53D04D375D323CDE28F19A0F /* SdkFontInstaller.swift */, - 1313A8AE0C4379298D7EF36BE6AA65F4 /* SdkGlobalHelper.swift */, - 3C0CB1CDEA4C5E4895994FB47085D4E3 /* SdkImageReloader.swift */, - 27C3468CC76B2C7BB10CED3DE5EFCA58 /* SdkPopupAlertView.swift */, - B17D8267AF1AFF8A10E7F8F01C219FBE /* SdkQueryBuilder.swift */, - D2F7D9DCF90BD5C51C99013B92EAE9DB /* SdkStyle.swift */, - 9686077291842E1BE3E92A4CBB2D01D5 /* SdkStyleColorScheme.swift */, - 3E928DA9D56257D7E66B7FD04D4FBB6A /* SdkStyleColorSchemeAwareView.swift */, - AE1161FDAF59CC1A383B889BA00AA0DB /* SdkStyleColorSchemeAwareViewController.swift */, - 8EA0880546F5C765AE10ECC6D442C87E /* SdkStyleCustomColorScheme.swift */, - 9183AB97B95E41B7E371EC4DE2A2DF30 /* SdkStyleCustomColorSchemeAwareView.swift */, - 4AFB98DB5CEBD45082FDCFAE8E610335 /* SdkStyleCustomColorSchemeAwareViewController.swift */, - DC3973838B69DCC92B65F9C777E03C51 /* SdkStyleCustomFonts.swift */, - 4AD6725039854C49B298640ED0545CE6 /* SdkStyleCustomFontSizeAwareView.swift */, - 99BAC905278C2BD1A35C579C966CB859 /* SdkStyleCustomFontSizeAwareViewController.swift */, - 50A915682692C4576BD1B3382EDD4A31 /* SdkStyleUIApplication.swift */, - 7C0EEC89204EC719332D585D5E222E61 /* SearchResponse.swift */, - 22DF9F8F7A569CC3F4DEB6EBC4102FE1 /* SearchWidget.swift */, - F3739778E07523A3175EF42603E6D8CD /* SearchWidgetCategoriesButton.swift */, - 567F0CCECCB2EFE5CF5E90BD862FC225 /* SearchWidgetDelegate.swift */, - 884C25BFA10C3C4A63320C3A5B7797EE /* SearchWidgetExtension.swift */, - 24A037FFEC91A5918877DAF898310E6F /* SearchWidgetHistoryButton.swift */, - 3698F76D18FEE0AB0114FA9A9D14C380 /* SearchWidgetListView.swift */, - CA1970B7E000CD93CD5ABDD9C90EF69D /* SearchWidgetListViewCell.swift */, - F180D6C6E0768F6A5BC4E1257E5AD297 /* SearchWidgetMainView.swift */, - 6F7861E34249B83262CAAC89AE6B545E /* SearchWidgetModel.swift */, - 017C9D4AD83B9F48EC84C7462F77C1C2 /* SearchWidgetObjectification.swift */, - 9C2819399D5A22E8D3E3D2E88DF6D2FE /* SearchWidgetTextField.swift */, - 05955F66D9A388DB5300C283B9ED82E5 /* SearchWidgetView.swift */, - 200E09C6F7210CD35EC2DFC6CDB47964 /* SearchWidgetViewController.swift */, - B4839081A2EE7970A91843BDFB777B4F /* SessionDataTaskProtocol.swift */, - 8239B94A327381F223C720106BF41938 /* SessionOperation.swift */, - 0ACDB23A88E6462C13BAA8CF2F5388C6 /* SessionQueue.swift */, - F269AE423D51077DA2EC0CD40577E5BF /* SettingsManageable.swift */, - C2391013284B0804D94D42F1224978E1 /* SimplePersonalizationSDK.swift */, - 16D28C22EDFBA5210E8F26B745E30C7F /* SlideView.swift */, - A684C681F875FE1D6779FA17B5C84369 /* SlideViewController.swift */, - 4C45D4459990807F360105B4C2BD6B5B /* Stories.swift */, - B2B921ED7BF87B51971BDCC684F43C49 /* StoriesCollectionViewPreviewCell.swift */, - 182B458C0DB3AF459F99260B902F1E3B /* StoriesImageLoader.swift */, - 9A2441B4F7FE69F4332827D34054B38A /* StoriesSlideReloadIndicator.swift */, - BD12F79A7009CE1C816858354BB28B16 /* StoriesView.swift */, - 3C7FCEF6B42BE8D00A3F1BACC9822867 /* StoryBlockImageCache.swift */, - C54D76765D76345DEE85C2577A0BE71C /* StoryButton.swift */, - 9895A84C8FC7A836604C935D35C99AC6 /* StoryCollectionViewCell.swift */, - 78AC9897341C6AD6139546E65E3C671B /* StoryViewController.swift */, - 82A5C1DEACE9944682E1C538D1E696FE /* SubscriptionService.swift */, - EF5C7C77DE2A108B989B598603A71255 /* SubscriptionServiceImpl.swift */, - 6F8EA8AFF4FC1C0B82EF0EC412051B3A /* TBAppearanceConfiguration.swift */, - A25CA20AE6CA0E7F3C0889BC83B80448 /* TBFontConfiguration.swift */, - AE2158DADDE006E15A6B82206F7E1E5A /* TBTextConfiguration.swift */, - 505853D80AB9D71C6B962F6B106CA899 /* TexBlockConfiguration.swift */, - C0B13A2564427A5D3271A22CC081B485 /* TextBlockConstants.swift */, - F2F28C758806CA9B47233D61569AC4AE /* TextBlockView.swift */, - 4F8EDA1E36291EC7D5833D2F1347675F /* TrackingService.swift */, - DCAB701B1958806B999110D217BE4269 /* TrackServiceImpl.swift */, - 37D29315E37F8FAAC6F6BA17562D6B51 /* UIBezierPath+Circle.swift */, - AAB1F97077878093D8E2B46380CF317E /* UIBezierPath+ImagePlaceholder.swift */, - 7DBCC89758D18BE019ACCF9F4FB1DA29 /* UIColor+Extension.swift */, - F6882D4A05CE1AEF7EBD19E019E3D1D9 /* UIFont+FontInjector.swift */, - 6D34EFF0527DB3EBA71D8FB52A3425C9 /* UIFontDescriptorUsage.swift */, - 5DE906CE80C33B4E27DCFC2A3F937122 /* UIImage+ImageLoader.swift */, - 243098A6435E355225C685FEBB0EA576 /* UIImageView+ImageLoader.swift */, - 4A89615CA3748B4B574FF3BF0D984A51 /* UISdkWrapLabel.swift */, - 26642982FB2133E4B543A2C337BA2E9D /* UIViewController+PromocodeBanner.swift */, - BA90567D2B0F1D5538610C5715BF9684 /* URLLiteralConvertible.swift */, - 8E55C9080F6947D033E6CE6E6A43847C /* URLSessionQueue.swift */, - A9B08A53140D0BE71718A5F3E03BE881 /* UserDefaultsExtension.swift */, - 0563BCB9D5C982E10E671FD25E79729B /* UserSettings.swift */, - ACC7F80B4FA266A86011287DD80262CC /* VideoDownloadManager.swift */, - 677CA2D06DDE5144350FEB4B400D5B12 /* VideoDownloadObject.swift */, - 24AAE5386CBFCCFEDA6C8E44F6E48C3D /* VideoFileUtils.swift */, - 0FB6821FE781E61F57C7ABBEE79CD491 /* ViewConfigPlain.swift */, - 42AB298A5E3CB9C3744EEB483D776066 /* ViewConfigService.swift */, - FB0B6F8420A40ED41EFDF9C49B7A6EFE /* Resources */, - 73BF31FB138C5009151EE7C2ADD07510 /* Support Files */, - ); - name = REES46; - path = REES46; - sourceTree = ""; - }; - 73BF31FB138C5009151EE7C2ADD07510 /* Support Files */ = { + A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */ = { isa = PBXGroup; children = ( - A6C3DF1CDD3FE376A3F15467BFBE0C34 /* REES46.modulemap */, - 6A95D2D8B4A55B4954DFF4C2BE59121C /* REES46-dummy.m */, - 03F3E50CB0A6F2BD522C6FA9455BD747 /* REES46-Info.plist */, - 37986DD58E8275EB765C4B9ED87C902C /* REES46-prefix.pch */, - 768349C5A7EF0A50AC2FEACF23C4EFD5 /* REES46-umbrella.h */, - 2A368399C2160AC6329182F20B166F4E /* REES46.debug.xcconfig */, - DBC37411E3FBDB55CA1205401E6D3AE2 /* REES46.release.xcconfig */, + 7EED3A4B574EFEBB9FC4A320FC64352D /* REES46.modulemap */, + DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */, + EFE1038B30DAB86B0B88A1A3AAC6E034 /* REES46-Info.plist */, + 240A79C469C0F6595705D16927F498E9 /* REES46-prefix.pch */, + 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */, + C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */, + A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/REES46"; sourceTree = ""; }; - A2DAB88224A5C6E444F84116BC10553A /* iOS */ = { - isa = PBXGroup; - children = ( - 6CDC6391E3063232D20F2FFE1617B4AA /* Foundation.framework */, - 22AD885D3D57E81A6E96E0E72504B6C8 /* ImageIO.framework */, - ); - name = iOS; - sourceTree = ""; - }; - A87A9D9B36D903CF3E3357704F8D56E7 /* Support Files */ = { - isa = PBXGroup; - children = ( - 45B788F69BB6D1B384380230A35F4A85 /* SDWebImageSwiftUI.modulemap */, - 19D828BE41B227FC99AB956B45805E0D /* SDWebImageSwiftUI-dummy.m */, - 379137B02CA02704EDA9A2CF00E99A09 /* SDWebImageSwiftUI-Info.plist */, - 5BAAE14027868DA9525921C209B08C76 /* SDWebImageSwiftUI-prefix.pch */, - 5ABAC2D6EBFC4451BB54CDBAB40DADA3 /* SDWebImageSwiftUI-umbrella.h */, - A21051CBF115DB2382ACC62E5753C6D1 /* SDWebImageSwiftUI.debug.xcconfig */, - 3462E4224B703F8B93A5EA4485EDB339 /* SDWebImageSwiftUI.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/SDWebImageSwiftUI"; - sourceTree = ""; - }; - B57FC262D80A6FC3160E63A50D0375AD /* SDWebImageSwiftUI */ = { - isa = PBXGroup; - children = ( - 1BBD8F1415E27C7782213FF9A17A0355 /* ActivityIndicator.swift */, - E43C26A9ABBBD30D24AAC918843657EC /* AnimatedImage.swift */, - CC817825B6B9D79C94B440B657997769 /* Backport.swift */, - 7640F97184806A9AE6D038E779EA1B9B /* Image.swift */, - DAC2860E468BFF18CAD7EED73F4C53D8 /* ImageManager.swift */, - E474B6985E4834A59099E70AE48070CD /* ImagePlayer.swift */, - CEBDC88DD3BCA0C8036016944005827F /* ImageViewWrapper.swift */, - 42C4114AD9CA9739A7AFF00200C9E5FF /* Indicator.swift */, - 16A84119C929C7999C74B194789C2339 /* OnChange.swift */, - 43D5C931E8B3C42904FF08B0AA8E499A /* Overlay.swift */, - 01E4D39E9A3693888369174B21333E5A /* ProgressIndicator.swift */, - FAA2A1D8B3E0092C5A2D6AACF916118C /* SDWebImageSwiftUI.h */, - 146D16A186D47FCB0B2ABB8F0506282D /* SDWebImageSwiftUI.swift */, - 2F374469A65E69F71CF1A960B8DE8DAE /* StateObject.swift */, - 8A8808B6DC1E046BFF8C17824E0A56D3 /* SwiftUICompatibility.swift */, - 56D89D1669ADB46DF58317A31AA0D920 /* Transition.swift */, - 51DD1AEB1ED0805DAE2DB69242F0495A /* WebImage.swift */, - A87A9D9B36D903CF3E3357704F8D56E7 /* Support Files */, - ); - name = SDWebImageSwiftUI; - path = SDWebImageSwiftUI; - sourceTree = ""; - }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, - 0F8FC3C2C0BD1A703540DB0EA1712A90 /* Pods */, - 39EF6A21DB94D022FD5AAD50C63F0C35 /* Products */, - 65D0B108902971FD545088B9D3A3C79A /* Targets Support Files */, - ); - sourceTree = ""; - }; - ECC9B798C46647949C8056C4EF92E3D0 /* Support Files */ = { - isa = PBXGroup; - children = ( - 02BBB5AAB5F6B7B271D2A8880A71F724 /* ResourceBundle-SDWebImage-SDWebImage-Info.plist */, - 6598F6A79503239ABC5FF1D30AD713A5 /* SDWebImage.modulemap */, - 029A00422820699B153B476831592226 /* SDWebImage-dummy.m */, - A1FF8B59E306A9AFBE9135DF6A50DEF0 /* SDWebImage-Info.plist */, - 230186899B3D45050AC3C1511882C3B1 /* SDWebImage-prefix.pch */, - 119A30548ED1F294262DAA76E2314B8F /* SDWebImage-umbrella.h */, - 29D5B0FFB0FB808508AA9BDC2557AA03 /* SDWebImage.debug.xcconfig */, - B799A41A144BDE98B056E872D41934CC /* SDWebImage.release.xcconfig */, + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, + 05C54A4D55BA128EDFC7C91451A8BB11 /* Pods */, + 45F05160E1AA18223A137E9876780947 /* Products */, + 54B44E4960940F6283E5BE08B84C2EC2 /* Targets Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/SDWebImage"; sourceTree = ""; }; - FB0B6F8420A40ED41EFDF9C49B7A6EFE /* Resources */ = { + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { isa = PBXGroup; children = ( - 5CD261183F527F9CCEE033F6D042CCB3 /* Assets.xcassets */, - 9BF3DE04FA1C4CA5110A837D4B2A26F5 /* StoriesCollectionViewPreviewCell.xib */, - 0886A006FB6D7A5B26FA5DD74922C871 /* StoriesView.xib */, - 8E029187C788F90556669DD25F177EB0 /* StoryCollectionViewCell.xib */, + 578452D2E740E91742655AC8F1636D1F /* iOS */, ); - name = Resources; + name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 59872B0D9DD140E09189C4A22FED39AA /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 42089E46D48B162B0AC3566F846764BE /* NSBezierPath+SDRoundedCorners.h in Headers */, - F6B78FD74DB177217EB13A1C5F6E31E8 /* NSButton+WebCache.h in Headers */, - F2ACB8606ABB790DD64FE3D1C2A99AD7 /* NSData+ImageContentType.h in Headers */, - 78DB4B4F958566E37A72D04F973FEBED /* NSImage+Compatibility.h in Headers */, - 85F13CDCA1FADE0ACF2BE361CAB99E0C /* SDAnimatedImage.h in Headers */, - 42962685B499575129CDFF254E8FEE4F /* SDAnimatedImagePlayer.h in Headers */, - 08A9406F1F5800998D7CD7C1C4DF870E /* SDAnimatedImageRep.h in Headers */, - B311644D4FB2B084755B97F9E62D0517 /* SDAnimatedImageView.h in Headers */, - 2953DE694482D1C43BBCDE5F4B7492C1 /* SDAnimatedImageView+WebCache.h in Headers */, - A2DCD1D36D93DFF9EBA04C27FD6523E8 /* SDAssociatedObject.h in Headers */, - 1AC07A8630B73493200FD547678823F9 /* SDAsyncBlockOperation.h in Headers */, - A5BBB698DF1D4480FD47F982C5252205 /* SDCallbackQueue.h in Headers */, - D4316084185FD6513BC83544B2A45E82 /* SDDeviceHelper.h in Headers */, - 7B48B4E11B3E9E10BDD274DC84A27DE5 /* SDDiskCache.h in Headers */, - 4262A44B8089903161C54AD186379ABA /* SDDisplayLink.h in Headers */, - 38E10CECD2C6C59C0CCCEB0A78D40CC1 /* SDFileAttributeHelper.h in Headers */, - 7B6078F9AEBF848D77F519AF8FBC77E2 /* SDGraphicsImageRenderer.h in Headers */, - 6E8F67D76FD92D5C1136F15A50BF9EB5 /* SDImageAPNGCoder.h in Headers */, - 387C8094E1C055C789587185E97E18E4 /* SDImageAssetManager.h in Headers */, - 116875A435A6C285919C97C0AE6DCA28 /* SDImageAWebPCoder.h in Headers */, - C56A825525BCBE955CFE58C7C747B754 /* SDImageCache.h in Headers */, - 14CD7E5A556FE8ED2CD06E81839F3B0E /* SDImageCacheConfig.h in Headers */, - ADDD26B99A6D54C00956C6BE7349D77E /* SDImageCacheDefine.h in Headers */, - 6D98092F5BB4629EA76E90BB0D5A3A1E /* SDImageCachesManager.h in Headers */, - 45C47D2E7DC2AC0332CDD2323355F483 /* SDImageCachesManagerOperation.h in Headers */, - AC32A22FA700A7C519DA105353C169C9 /* SDImageCoder.h in Headers */, - 07863507770757C4059FD22123EB757D /* SDImageCoderHelper.h in Headers */, - 49F80B73F8E31BDC1CD2986181817AD5 /* SDImageCodersManager.h in Headers */, - EABA337CA83C9ED09E2DA7F54F501750 /* SDImageFrame.h in Headers */, - 8D739A0E851C00DBE71DB9A2667D4588 /* SDImageFramePool.h in Headers */, - 9EB6CDD8F5E5570798DE4D2C6D9EEAAA /* SDImageGIFCoder.h in Headers */, - 0170EE86BA8B1D7872B62745E0C01BBE /* SDImageGraphics.h in Headers */, - BCF0F618DE852A99D0E09482FE1AD6DB /* SDImageHEICCoder.h in Headers */, - 702044FE1045183AEA5C6DD23E0741A4 /* SDImageIOAnimatedCoder.h in Headers */, - E35A96AD62BB29B7ABA3779606A3DB2B /* SDImageIOAnimatedCoderInternal.h in Headers */, - 0529F5E309FEF38A1C578FBC56EE042E /* SDImageIOCoder.h in Headers */, - 91218968238F58BBB3E84DC5C8A25854 /* SDImageLoader.h in Headers */, - 0DDBFF7516C2F40018EB5DEDADAA268E /* SDImageLoadersManager.h in Headers */, - 9AF09A8AF1301B3B97DA1E5B76A19645 /* SDImageTransformer.h in Headers */, - 480EB117CA823BBA38F531F048DC5D9B /* SDInternalMacros.h in Headers */, - 31454EEA78669CAFA2CFD0E18609F80D /* SDMemoryCache.h in Headers */, - B71EF2A111D54884A8BA6AA0E502B5C3 /* SDmetamacros.h in Headers */, - 67EAF96CF5371E0EDF2F1976BA0A8DA4 /* SDWeakProxy.h in Headers */, - E0D4D74CF9A15AAB4D8EBA35D68449C0 /* SDWebImage.h in Headers */, - 449F6DDFDA01061F0B001BCB31ED4455 /* SDWebImage-umbrella.h in Headers */, - 4EC633971567BFD6384859B76E1276F1 /* SDWebImageCacheKeyFilter.h in Headers */, - 65550AE399A68358D1031A676C06A364 /* SDWebImageCacheSerializer.h in Headers */, - B7B3F548D939A885B87BC38F24AC9118 /* SDWebImageCompat.h in Headers */, - 2177290E4AC6DAFDD746C8BA7EEF8B45 /* SDWebImageDefine.h in Headers */, - 67752F2EB4D3E1F9BC130046FB76BCE4 /* SDWebImageDownloader.h in Headers */, - 142E1D597048C8800BFA18FD4A9DD701 /* SDWebImageDownloaderConfig.h in Headers */, - D439144D48C9FE1BA35022F0A6A736C8 /* SDWebImageDownloaderDecryptor.h in Headers */, - F1F06EEE1B902B10F5D0CFD6F7A80DA1 /* SDWebImageDownloaderOperation.h in Headers */, - E77CB069D70FF4125B9E064B49C001D0 /* SDWebImageDownloaderRequestModifier.h in Headers */, - A4A3E992003457010F66F3D6BCC2A5C3 /* SDWebImageDownloaderResponseModifier.h in Headers */, - 4146EC26D7DDF32ECAE445B119479D30 /* SDWebImageError.h in Headers */, - 8A626CEC7CBA9E3859A3FD8B147ECB90 /* SDWebImageIndicator.h in Headers */, - F33A3ECCE1CA579C4ED9F9A2B3B90044 /* SDWebImageManager.h in Headers */, - DD4972517202F35B26B7B659B095D40B /* SDWebImageOperation.h in Headers */, - ACD7FED5646A645F3EDA3F2521156451 /* SDWebImageOptionsProcessor.h in Headers */, - 149FDD80A26F399AFBD57325998EFDF6 /* SDWebImagePrefetcher.h in Headers */, - FAE83A0A03CED37F7817A8B623A7734E /* SDWebImageTransition.h in Headers */, - 1EC1EB5F3B98D4BCB6A057344815682C /* SDWebImageTransitionInternal.h in Headers */, - 10DED49C2B45A5EA8FA6968F1AE7D28E /* UIButton+WebCache.h in Headers */, - F60F32E5C1B049086A5625B865FA75DF /* UIColor+SDHexString.h in Headers */, - 48F66F6D3C7386E5595633DE1311F129 /* UIImage+ExtendedCacheData.h in Headers */, - 9EF20C969A3D26AFF74A35A376270C62 /* UIImage+ForceDecode.h in Headers */, - B80FCEF5ABC014B09963F4E65BDE3C41 /* UIImage+GIF.h in Headers */, - CFD8696312B3334FF17C0412FB20CED6 /* UIImage+MemoryCacheCost.h in Headers */, - BB31CC54186DDAAD89F139C89B93CA7C /* UIImage+Metadata.h in Headers */, - 06DEC5667C8AD8AD090B5B3817193625 /* UIImage+MultiFormat.h in Headers */, - 937D6966FD44A9A799ED6574EC78CC4F /* UIImage+Transform.h in Headers */, - A02EEFC96DF92AB78F933CBC0CBAFD92 /* UIImageView+HighlightedWebCache.h in Headers */, - 1501440AF1C85CB575F269E26BCEC459 /* UIImageView+WebCache.h in Headers */, - AE7A9D612B96E5CADA59EFE4591DDB83 /* UIView+WebCache.h in Headers */, - 4DFCB3D9623FCA43D3E1BFDA528EB587 /* UIView+WebCacheOperation.h in Headers */, - CBBF4F7A773A62DC87CF698A4CC9F272 /* UIView+WebCacheState.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 5D67C5954DA4997D536C56BA4873F67C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1441,36 +603,11 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - C00B24EC949AB45D2E5715F745D8FDD1 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DA1C286C34DC7C7148BFD027A80C9605 /* SDWebImageSwiftUI.h in Headers */, - 4A1C144BA28F389620F8656FF5DA412A /* SDWebImageSwiftUI-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DB24D5E87B87A73D3800526A46998EDB /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 95D0B99765E4BDDF38FF3BAFE1B1395E /* Pods-demo-store-ios-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F4235FCF762434986C285FB10D47FD47 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9E2500E6DDD2ADAF4D773649B7A360C9 /* Pods-demo-store-iosTests-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F4ACFBD682D7B15F546B415979071681 /* Headers */ = { + A4F049A598956AF94033ADA695606EB1 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 4ED0BD508A169B5BD2FC92A540597F0F /* Pods-demo-store-ios-demo-store-iosUITests-umbrella.h in Headers */, + 469C92E04B9D2D4F8392EE02C7A39C69 /* Pods-demo-store-ios-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1495,122 +632,25 @@ productReference = 3671B3C220D01E22000CF41146C2B4AB /* REES46 */; productType = "com.apple.product-type.framework"; }; - 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */ = { - isa = PBXNativeTarget; - buildConfigurationList = 65F383B89BC176EDEB551DB2BFCAE26C /* Build configuration list for PBXNativeTarget "SDWebImage" */; - buildPhases = ( - 59872B0D9DD140E09189C4A22FED39AA /* Headers */, - 37D690C2794419F3601D98447F5BFC69 /* Sources */, - CD3FD375884976E99F234948F32A5A9E /* Frameworks */, - 4A227C6AFC46FF1943B041949377A06B /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 4AAF63A99B6A0D5ECFA6EBEEEA4F4CF9 /* PBXTargetDependency */, - ); - name = SDWebImage; - productName = SDWebImage; - productReference = B0B214D775196BA7CA8E17E53048A493 /* SDWebImage */; - productType = "com.apple.product-type.framework"; - }; - 70C4579D73168EDE5BAEF9D0A675D6F0 /* Pods-demo-store-iosTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DDA0AEAEF33653027530506736479FDE /* Build configuration list for PBXNativeTarget "Pods-demo-store-iosTests" */; - buildPhases = ( - F4235FCF762434986C285FB10D47FD47 /* Headers */, - A60E7D11219A77AC97624EE5EFAE16C4 /* Sources */, - DECADAED0D9B70A5AB59DADE37D3AE1E /* Frameworks */, - AFB0664CADD4AA9EA1B4A13C1500B4D2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - BDD19974F6C9A3105CCA953F44D62A2D /* PBXTargetDependency */, - ); - name = "Pods-demo-store-iosTests"; - productName = Pods_demo_store_iosTests; - productReference = 526C794B2FA0D3003C2BC752F1EFDF39 /* Pods-demo-store-iosTests */; - productType = "com.apple.product-type.framework"; - }; 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */ = { isa = PBXNativeTarget; - buildConfigurationList = 84FF48163961B4CAB8D16B0E5E75CCD0 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */; + buildConfigurationList = 055840A6FA6AAA9EF10FDACFBB00DB5C /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */; buildPhases = ( - DB24D5E87B87A73D3800526A46998EDB /* Headers */, - DBC720CEC2491EE385D95F9C2C84766F /* Sources */, - DDE962E06D3E045B2C3E65379DB3E5DB /* Frameworks */, - 496E7A2BDFE067EDCEB1539DA40E20B2 /* Resources */, + A4F049A598956AF94033ADA695606EB1 /* Headers */, + EB0148397D0D3BE3BDDD286B33CDA7DE /* Sources */, + 0F5AD16E4861F5A40FD3476C13069579 /* Frameworks */, + 6ED9D74DEB6F3EDA8219CEA42CF2E560 /* Resources */, ); buildRules = ( ); dependencies = ( - 438E91038E0BBFC70FDAD160E6B0234B /* PBXTargetDependency */, - F55303ADA6093A5D638E87257AFC271B /* PBXTargetDependency */, - B74B7BB4D4D8D02690801F2EBFBC3A24 /* PBXTargetDependency */, + 504A7F75DEBB11C4718A9166A011498E /* PBXTargetDependency */, ); name = "Pods-demo-store-ios"; productName = Pods_demo_store_ios; productReference = A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */; productType = "com.apple.product-type.framework"; }; - 92EBFA3E7005B4C18A9C0B44324EB80F /* SDWebImageSwiftUI */ = { - isa = PBXNativeTarget; - buildConfigurationList = A55791BDAB310B5F7CCCF664D1DFC367 /* Build configuration list for PBXNativeTarget "SDWebImageSwiftUI" */; - buildPhases = ( - C00B24EC949AB45D2E5715F745D8FDD1 /* Headers */, - AD4475E0BA3D83247D0815C868B78D0D /* Sources */, - AFCF64B8D3CC9AD61C5688BD27333799 /* Frameworks */, - 5AAD87F02E21080630DFACBA0E04DAE8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - E1D43F48E69B1706A4D9B6B5EEB6B91B /* PBXTargetDependency */, - ); - name = SDWebImageSwiftUI; - productName = SDWebImageSwiftUI; - productReference = 6B1B10F952F684F6767E6903C2F5E816 /* SDWebImageSwiftUI */; - productType = "com.apple.product-type.framework"; - }; - 94CFBA7D633ECA58DF85C327B035E6A3 /* SDWebImage-SDWebImage */ = { - isa = PBXNativeTarget; - buildConfigurationList = A1EA36506852AF79BBAB619F1CD9B763 /* Build configuration list for PBXNativeTarget "SDWebImage-SDWebImage" */; - buildPhases = ( - A0BD1FC6FF7A1E6E2EC94DE4CDF1DA61 /* Sources */, - 182DE84121F07E8506C7C52B3CABFB61 /* Frameworks */, - B782947D608DC95EF7554B81CBDB07A2 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "SDWebImage-SDWebImage"; - productName = SDWebImage; - productReference = CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */; - productType = "com.apple.product-type.bundle"; - }; - AC237AA952DF10555F917C17037E3C89 /* Pods-demo-store-ios-demo-store-iosUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 12F9C39CC5E96865A33F3F640ED54ADE /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */; - buildPhases = ( - F4ACFBD682D7B15F546B415979071681 /* Headers */, - 0F2EC92DFB9EEEC68E5364578C82A889 /* Sources */, - CAA97552934E1B65AD863436D8DAEC7D /* Frameworks */, - 11555E1B5549D0EECBD48FAA867B7A28 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 3BD1B5A0933BDF89AE8558F70FB52BE0 /* PBXTargetDependency */, - 1422FFBC3FAE6A8E66A59E9991FB1D3A /* PBXTargetDependency */, - CFA86728496B80A0F40BE4CE2B7303F5 /* PBXTargetDependency */, - ); - name = "Pods-demo-store-ios-demo-store-iosUITests"; - productName = Pods_demo_store_ios_demo_store_iosUITests; - productReference = 884726A2FC1C446A6B500B44B2968EC9 /* Pods-demo-store-ios-demo-store-iosUITests */; - productType = "com.apple.product-type.framework"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -1629,63 +669,21 @@ en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 39EF6A21DB94D022FD5AAD50C63F0C35 /* Products */; + productRefGroup = 45F05160E1AA18223A137E9876780947 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */, - AC237AA952DF10555F917C17037E3C89 /* Pods-demo-store-ios-demo-store-iosUITests */, - 70C4579D73168EDE5BAEF9D0A675D6F0 /* Pods-demo-store-iosTests */, 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */, - 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */, - 94CFBA7D633ECA58DF85C327B035E6A3 /* SDWebImage-SDWebImage */, - 92EBFA3E7005B4C18A9C0B44324EB80F /* SDWebImageSwiftUI */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 11555E1B5549D0EECBD48FAA867B7A28 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 496E7A2BDFE067EDCEB1539DA40E20B2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A227C6AFC46FF1943B041949377A06B /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0FC5A479554857FC38A3C8753351191E /* SDWebImage-SDWebImage in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 5AAD87F02E21080630DFACBA0E04DAE8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AFB0664CADD4AA9EA1B4A13C1500B4D2 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B782947D608DC95EF7554B81CBDB07A2 /* Resources */ = { + 6ED9D74DEB6F3EDA8219CEA42CF2E560 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0A45B5FE1BE72B7672F5B52CD2DD67FB /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1703,138 +701,11 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 0F2EC92DFB9EEEC68E5364578C82A889 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 25476F441F2CCC8C9608477DE5A0A44A /* Pods-demo-store-ios-demo-store-iosUITests-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 37D690C2794419F3601D98447F5BFC69 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B726740C01CEC8A342988863B3C6666D /* NSBezierPath+SDRoundedCorners.m in Sources */, - D0DBC5DD0A2D887A2940BA0329217484 /* NSButton+WebCache.m in Sources */, - 688EBC4BD1F3F76ECA4C72FEC494D84D /* NSData+ImageContentType.m in Sources */, - 2A72F0DC1AF8897A89626C3E81B611F5 /* NSImage+Compatibility.m in Sources */, - 50856AC35DAB64C96C34BC588BB0F7FE /* SDAnimatedImage.m in Sources */, - 145165256BC172DDCDC0575DC1D6D3F3 /* SDAnimatedImagePlayer.m in Sources */, - C2B0B7C3409DC4089F347C18C2C5218A /* SDAnimatedImageRep.m in Sources */, - 267E6BB583A54AA6BB91C1AAA9109BC2 /* SDAnimatedImageView.m in Sources */, - 0E3E4B48C26FF73290F17C1EFE6026DA /* SDAnimatedImageView+WebCache.m in Sources */, - 81D05C82B68E50B5E348E31B16402F53 /* SDAssociatedObject.m in Sources */, - 2F0830F8256C8DC58F0919A5D5C07C06 /* SDAsyncBlockOperation.m in Sources */, - 1EADA61A88A52EBF1F841282FB177F9D /* SDCallbackQueue.m in Sources */, - 43F93ED54EC176295EF366A740E01172 /* SDDeviceHelper.m in Sources */, - 52304420361292CCFC74D707D76A89E6 /* SDDiskCache.m in Sources */, - 023934AA4CE4DC87CF03A03C73ECA714 /* SDDisplayLink.m in Sources */, - BF67904B4E6C8359A5540C1516DC35DD /* SDFileAttributeHelper.m in Sources */, - AF42AB272E74275D08F989B9111E045A /* SDGraphicsImageRenderer.m in Sources */, - C4F6E2A79BD3990086848911AC8B7F89 /* SDImageAPNGCoder.m in Sources */, - A4E7010E8D87921AE6F9D645B7CDA53A /* SDImageAssetManager.m in Sources */, - 8150F3F396A29D249217B5B1BEF13E50 /* SDImageAWebPCoder.m in Sources */, - 3DC4D729B8A196329EA5A3DE5EFA370F /* SDImageCache.m in Sources */, - F0171E13E25FD40D6B6F869966ED8B08 /* SDImageCacheConfig.m in Sources */, - A1623A8868E9AC8BBEAAB9BC0421F463 /* SDImageCacheDefine.m in Sources */, - 0A1E121A8F4DAFDFBA2C6551AED0B082 /* SDImageCachesManager.m in Sources */, - 61BF5909F8FFEC516CA898FDBD838959 /* SDImageCachesManagerOperation.m in Sources */, - CBE2CD6C13ED59FC6DCA9AF08D1E2406 /* SDImageCoder.m in Sources */, - 63266AB53E590025F95E8472A2A75E66 /* SDImageCoderHelper.m in Sources */, - 16E7B447883B3E6CD5DA0C0F799AEE09 /* SDImageCodersManager.m in Sources */, - 421344238409756CF07372155FC3421C /* SDImageFrame.m in Sources */, - F4ADCF115B337B7C483F9C0064646182 /* SDImageFramePool.m in Sources */, - DB558A40B5AACA3DF4BDD7167C48CE71 /* SDImageGIFCoder.m in Sources */, - 41FF38113D3DE2C65D63D29AD0055EA1 /* SDImageGraphics.m in Sources */, - 317A2085CE162CFE3EC3ED9FB3514201 /* SDImageHEICCoder.m in Sources */, - E501E0E956F164F9E90453CC10766DFA /* SDImageIOAnimatedCoder.m in Sources */, - 5EC172A3A600E629AF4AD75C304DA2C9 /* SDImageIOCoder.m in Sources */, - 4CAA295F8BB967445E2273FB5A53769E /* SDImageLoader.m in Sources */, - 480C90679D30599E736F886A01D5EC27 /* SDImageLoadersManager.m in Sources */, - FACD362497B989F8C4445B5C7C340CDD /* SDImageTransformer.m in Sources */, - 6581039AAD4BF84784812194E353F279 /* SDInternalMacros.m in Sources */, - DA0591ACC058D6673CFC94A664BDD51B /* SDMemoryCache.m in Sources */, - 6B2576EF432DFDD2422B66193CED0582 /* SDWeakProxy.m in Sources */, - 2D521703994D252F0E6D24F7D5D53F2E /* SDWebImage-dummy.m in Sources */, - 1D361EE4E09C00F9148CE67CCD306D29 /* SDWebImageCacheKeyFilter.m in Sources */, - 31C998E878D5A0F686B187864A236183 /* SDWebImageCacheSerializer.m in Sources */, - 62796BA9266A3343CDB31913D051B1F2 /* SDWebImageCompat.m in Sources */, - 5D9A37A8D628C6BB9FCA2EF74E352C9C /* SDWebImageDefine.m in Sources */, - 2FA9B480039C913FD3352BFF4DDCAEFC /* SDWebImageDownloader.m in Sources */, - 4624831E1C1A912E31BA028AD4C1FA7C /* SDWebImageDownloaderConfig.m in Sources */, - 59C42C2827C8752D9488E217C5DDD820 /* SDWebImageDownloaderDecryptor.m in Sources */, - B435123EA0DFB080DDF204A68B76B649 /* SDWebImageDownloaderOperation.m in Sources */, - 8BFA637561CFFFD755077574D42FD312 /* SDWebImageDownloaderRequestModifier.m in Sources */, - D67C939C3709BFCC9711E3DAD0854801 /* SDWebImageDownloaderResponseModifier.m in Sources */, - 03FE09B9F7504CA3AE5116F1AA698DD7 /* SDWebImageError.m in Sources */, - 4A88FAAE5AFA7650E7A2E1F1C31B4E0E /* SDWebImageIndicator.m in Sources */, - E5E9A039F53F6FD7F998A44451EFD9AF /* SDWebImageManager.m in Sources */, - 86AA5A87E46FE0919A0A19BA722F4AAC /* SDWebImageOperation.m in Sources */, - C77923E363A3C9D4829376BE0EB08DFC /* SDWebImageOptionsProcessor.m in Sources */, - AEAA0FB549FD88F595F943D8CD4317DF /* SDWebImagePrefetcher.m in Sources */, - 0C24DB1B347FCDCDA9B579CBEA896B7F /* SDWebImageTransition.m in Sources */, - C8A9EB5DED9F08B5FCD153955FC14E93 /* UIButton+WebCache.m in Sources */, - BDDD8451EC24E029EE5394AD6B29E479 /* UIColor+SDHexString.m in Sources */, - 56ED612030120A0397156D40650605F1 /* UIImage+ExtendedCacheData.m in Sources */, - D727D42D3C6D75079100C9E2CDE45C59 /* UIImage+ForceDecode.m in Sources */, - C118334CFB7C43F8EFE615B0C66C1078 /* UIImage+GIF.m in Sources */, - 09BDBBF0B88B52D2ACBB454BDBA94CAB /* UIImage+MemoryCacheCost.m in Sources */, - 9F9BC40A239CEA83F849DDC2C4F375A7 /* UIImage+Metadata.m in Sources */, - 7ACAFB8878D787E4FB3D716750C91E8C /* UIImage+MultiFormat.m in Sources */, - D531DD839DFEF7D21041913C6B1BF95E /* UIImage+Transform.m in Sources */, - A8A9DA6C580EAE3E50B590CEDF0A45CC /* UIImageView+HighlightedWebCache.m in Sources */, - 2420216F493F3D0E2038DDF1E8E8C7C6 /* UIImageView+WebCache.m in Sources */, - 39B39F80D3373C1F6C7BAB344310A1C9 /* UIView+WebCache.m in Sources */, - 43DA4C5AD87FBD2334FEED50DD133D4F /* UIView+WebCacheOperation.m in Sources */, - 51F93BB4A8A45852EB003139085145C4 /* UIView+WebCacheState.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A0BD1FC6FF7A1E6E2EC94DE4CDF1DA61 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A60E7D11219A77AC97624EE5EFAE16C4 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2ED0D7AE2F2531563EBC0135C853AE8E /* Pods-demo-store-iosTests-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AD4475E0BA3D83247D0815C868B78D0D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BC4C53C7CA74C73E4841FC2CD3E32C0 /* ActivityIndicator.swift in Sources */, - 9E1DDCCA92AF0B9F1D1C6A670877FF59 /* AnimatedImage.swift in Sources */, - DF480FFE4BD46226C855A72CD81E50E8 /* Backport.swift in Sources */, - 8D05ED41A2FF6C70B78706F15F6098FE /* Image.swift in Sources */, - 96A5AC180E6F93402E7E57E2F592A3E8 /* ImageManager.swift in Sources */, - 9A19F8AF4CE027DF5271D2DAF670014C /* ImagePlayer.swift in Sources */, - 6D117033384F7B7E733B92455725CFA0 /* ImageViewWrapper.swift in Sources */, - 19EF8FDECF0A3B0DDF44ED4B7393C865 /* Indicator.swift in Sources */, - 959F820757DC746FDF7A3CD739523627 /* OnChange.swift in Sources */, - C737716F0120D6554E508ACD1ACA45C0 /* Overlay.swift in Sources */, - 4C4F24464D027DE21E5FB02DEB40D8C0 /* ProgressIndicator.swift in Sources */, - 82239DAE4AFBA4142974FBD8EB4620BF /* SDWebImageSwiftUI.swift in Sources */, - 92A408FEDAA401A41A7A235717062F82 /* SDWebImageSwiftUI-dummy.m in Sources */, - 0F2C8EDFFA5ADD894DC8D59811AB5B95 /* StateObject.swift in Sources */, - 7A5E9FDF0D7B71DDA61A79F171D0DBDE /* SwiftUICompatibility.swift in Sources */, - 107828081DC817509AEA4BC0755995CF /* Transition.swift in Sources */, - 90E9C7C7189370C95BEE1EB205BB4CDB /* WebImage.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DBC720CEC2491EE385D95F9C2C84766F /* Sources */ = { + EB0148397D0D3BE3BDDD286B33CDA7DE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C35EED1B7854674B923283BF02AE95DC /* Pods-demo-store-ios-dummy.m in Sources */, + B1FF3AA160C3354557A6B38A48756E98 /* Pods-demo-store-ios-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1986,66 +857,18 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 1422FFBC3FAE6A8E66A59E9991FB1D3A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; - targetProxy = 8C40AB809AAB92156705FE0682FB8425 /* PBXContainerItemProxy */; - }; - 3BD1B5A0933BDF89AE8558F70FB52BE0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = REES46; - target = 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */; - targetProxy = 40A7CB4B0A15AA26A286237C3DC95BE1 /* PBXContainerItemProxy */; - }; - 438E91038E0BBFC70FDAD160E6B0234B /* PBXTargetDependency */ = { + 504A7F75DEBB11C4718A9166A011498E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = REES46; target = 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */; - targetProxy = 542A9B83BEF9F0BD938799CC124BE455 /* PBXContainerItemProxy */; - }; - 4AAF63A99B6A0D5ECFA6EBEEEA4F4CF9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "SDWebImage-SDWebImage"; - target = 94CFBA7D633ECA58DF85C327B035E6A3 /* SDWebImage-SDWebImage */; - targetProxy = A99F31A5E5D289319F21440CF2383E43 /* PBXContainerItemProxy */; - }; - B74B7BB4D4D8D02690801F2EBFBC3A24 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImageSwiftUI; - target = 92EBFA3E7005B4C18A9C0B44324EB80F /* SDWebImageSwiftUI */; - targetProxy = 2C892BD4D849AC22F2605C37038732CF /* PBXContainerItemProxy */; - }; - BDD19974F6C9A3105CCA953F44D62A2D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Pods-demo-store-ios"; - target = 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */; - targetProxy = F08BBAD3B89A5D7B7714C68348C87676 /* PBXContainerItemProxy */; - }; - CFA86728496B80A0F40BE4CE2B7303F5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImageSwiftUI; - target = 92EBFA3E7005B4C18A9C0B44324EB80F /* SDWebImageSwiftUI */; - targetProxy = 7097CE6E72D7582F22EAD3655DE54080 /* PBXContainerItemProxy */; - }; - E1D43F48E69B1706A4D9B6B5EEB6B91B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; - targetProxy = 2B029E60540F41DAED3EF429AB0F6B86 /* PBXContainerItemProxy */; - }; - F55303ADA6093A5D638E87257AFC271B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; - targetProxy = C11ED8B5E2E81E3D5DDCCC1AE1E2D4D4 /* PBXContainerItemProxy */; + targetProxy = 97FD9F25B8F6CE6ACEDF790C858E79E0 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 0543067DFA4157D877ECC1E37BB23EB4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DBC37411E3FBDB55CA1205401E6D3AE2 /* REES46.release.xcconfig */; + baseConfigurationReference = A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2081,7 +904,7 @@ }; 06C2BC5254088328504EE61E0205587A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2A368399C2160AC6329182F20B166F4E /* REES46.debug.xcconfig */; + baseConfigurationReference = C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2114,190 +937,9 @@ }; name = Debug; }; - 12C3793CAA6A936CFDB35471990579E6 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A21051CBF115DB2382ACC62E5753C6D1 /* SDWebImageSwiftUI.debug.xcconfig */; - buildSettings = { - 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"; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap"; - PRODUCT_MODULE_NAME = SDWebImageSwiftUI; - PRODUCT_NAME = SDWebImageSwiftUI; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 194F8E05422FF77311DB227A533193FF /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B799A41A144BDE98B056E872D41934CC /* SDWebImage.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage"; - IBSC_MODULE = SDWebImage; - INFOPLIST_FILE = "Target Support Files/SDWebImage/ResourceBundle-SDWebImage-SDWebImage-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - PRODUCT_NAME = SDWebImage; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 1F2E29403E8C783A50BC01060DEDC63D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2A71319F6A963531ACFFF30BCBC6DDB2 /* Pods-demo-store-ios-demo-store-iosUITests.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-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.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; - }; - 32040D39D02117DCCA9D23325823FC56 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3462E4224B703F8B93A5EA4485EDB339 /* SDWebImageSwiftUI.release.xcconfig */; - buildSettings = { - 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"; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap"; - PRODUCT_MODULE_NAME = SDWebImageSwiftUI; - PRODUCT_NAME = SDWebImageSwiftUI; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 5323D08F969F6C0F1D91FBBD3911281C /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6FEE741AF14146505421E6B9B790997B /* Pods-demo-store-iosTests.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-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.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; - }; - 712520B37F5A38A33B6D48486F7DC8BE /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 29D5B0FFB0FB808508AA9BDC2557AA03 /* SDWebImage.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage"; - IBSC_MODULE = SDWebImage; - INFOPLIST_FILE = "Target Support Files/SDWebImage/ResourceBundle-SDWebImage-SDWebImage-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - PRODUCT_NAME = SDWebImage; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 8D8A7B664F9680616A78EFCDEECA9F9D /* Debug */ = { + 18080EF7FE2A9058EAF45222686F9653 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B41372352EEE4B1588AE589803A39DAD /* Pods-demo-store-ios.debug.xcconfig */; + baseConfigurationReference = C2CFBF87EB78E30CC4A10E9641F99C7E /* Pods-demo-store-ios.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -2327,10 +969,11 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; 8DE5143C03248BB6CD542DE3963D6F3A /* Debug */ = { isa = XCBuildConfiguration; @@ -2398,43 +1041,6 @@ }; name = Debug; }; - 8FB812FDCD5C88BDCA905744FB8532EC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A6EB5D5955124BD96D5764A18024EBC9 /* Pods-demo-store-iosTests.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-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.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; - }; 9E406C6AAF85E580207CD97B0044DEAB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2497,80 +1103,9 @@ }; name = Release; }; - B1A1A664FE9DB4275011BEDF58A2167A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D5AC60A10479B2D353EC371DC8B83A57 /* Pods-demo-store-ios-demo-store-iosUITests.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-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.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; - }; - B53529646157685ADF71C0B6409AB0DA /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 29D5B0FFB0FB808508AA9BDC2557AA03 /* SDWebImage.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/SDWebImage/SDWebImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImage/SDWebImage-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; - PRODUCT_MODULE_NAME = SDWebImage; - PRODUCT_NAME = SDWebImage; - 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; - }; - BD1E3AF2443E8DE24193FB7D30E5CFA2 /* Release */ = { + C2109C2FBBF7CBF8410B857E16C2529D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3433BC654811C432BEF5CB32AAF90EFB /* Pods-demo-store-ios.release.xcconfig */; + baseConfigurationReference = A3BC4DCD1D930788E65681442B043C28 /* Pods-demo-store-ios.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -2600,55 +1135,19 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; - }; - D37BA8376F970DA8A2D8CFAFFE486465 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B799A41A144BDE98B056E872D41934CC /* SDWebImage.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/SDWebImage/SDWebImage-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SDWebImage/SDWebImage-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/SDWebImage/SDWebImage.modulemap"; - PRODUCT_MODULE_NAME = SDWebImage; - PRODUCT_NAME = SDWebImage; - 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; + name = Debug; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 12F9C39CC5E96865A33F3F640ED54ADE /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios-demo-store-iosUITests" */ = { + 055840A6FA6AAA9EF10FDACFBB00DB5C /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */ = { isa = XCConfigurationList; buildConfigurations = ( - B1A1A664FE9DB4275011BEDF58A2167A /* Debug */, - 1F2E29403E8C783A50BC01060DEDC63D /* Release */, + C2109C2FBBF7CBF8410B857E16C2529D /* Debug */, + 18080EF7FE2A9058EAF45222686F9653 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -2671,51 +1170,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 65F383B89BC176EDEB551DB2BFCAE26C /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B53529646157685ADF71C0B6409AB0DA /* Debug */, - D37BA8376F970DA8A2D8CFAFFE486465 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 84FF48163961B4CAB8D16B0E5E75CCD0 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8D8A7B664F9680616A78EFCDEECA9F9D /* Debug */, - BD1E3AF2443E8DE24193FB7D30E5CFA2 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A1EA36506852AF79BBAB619F1CD9B763 /* Build configuration list for PBXNativeTarget "SDWebImage-SDWebImage" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 712520B37F5A38A33B6D48486F7DC8BE /* Debug */, - 194F8E05422FF77311DB227A533193FF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A55791BDAB310B5F7CCCF664D1DFC367 /* Build configuration list for PBXNativeTarget "SDWebImageSwiftUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 12C3793CAA6A936CFDB35471990579E6 /* Debug */, - 32040D39D02117DCCA9D23325823FC56 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DDA0AEAEF33653027530506736479FDE /* Build configuration list for PBXNativeTarget "Pods-demo-store-iosTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8FB812FDCD5C88BDCA905744FB8532EC /* Debug */, - 5323D08F969F6C0F1D91FBBD3911281C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist deleted file mode 100644 index 19cf209..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - 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/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown deleted file mode 100644 index f85cc84..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.markdown +++ /dev/null @@ -1,73 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## REES46 - -Copyright REES46 (c) 2023. All rights reserved. - -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 REES46 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 REES46 SOFTWARE. - - -## SDWebImage - -Copyright (c) 2009-2020 Olivier Poitrey rs@dailymotion.com - -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. - - - -## SDWebImageSwiftUI - -Copyright (c) 2019 lizhuoli1126@126.com - -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/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist deleted file mode 100644 index 6d8ba7b..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-acknowledgements.plist +++ /dev/null @@ -1,117 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Copyright REES46 (c) 2023. All rights reserved. - -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 REES46 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 REES46 SOFTWARE. - - License - MIT - Title - REES46 - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2009-2020 Olivier Poitrey rs@dailymotion.com - -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 - SDWebImage - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2019 lizhuoli1126@126.com <lizhuoli1126@126.com> - -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 - SDWebImageSwiftUI - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-dummy.m b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-dummy.m deleted file mode 100644 index aadd3c1..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_demo_store_ios_demo_store_iosUITests : NSObject -@end -@implementation PodsDummy_Pods_demo_store_ios_demo_store_iosUITests -@end diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist deleted file mode 100644 index 54c0fe6..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-input-files.xcfilelist +++ /dev/null @@ -1,4 +0,0 @@ -${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh -${BUILT_PRODUCTS_DIR}/REES46/REES46.framework -${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework -${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist deleted file mode 100644 index eb96684..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Debug-output-files.xcfilelist +++ /dev/null @@ -1,3 +0,0 @@ -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist deleted file mode 100644 index 54c0fe6..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-input-files.xcfilelist +++ /dev/null @@ -1,4 +0,0 @@ -${PODS_ROOT}/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh -${BUILT_PRODUCTS_DIR}/REES46/REES46.framework -${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework -${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist deleted file mode 100644 index eb96684..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks-Release-output-files.xcfilelist +++ /dev/null @@ -1,3 +0,0 @@ -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageSwiftUI.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh deleted file mode 100755 index b3209ff..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-frameworks.sh +++ /dev/null @@ -1,190 +0,0 @@ -#!/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="${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 -f "${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. - mkdir -p "${DWARF_DSYM_FOLDER_PATH}" - 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}/REES46/REES46.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/REES46/REES46.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework" -fi -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-umbrella.h b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-umbrella.h deleted file mode 100644 index 18bdf07..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#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_demo_store_ios_demo_store_iosUITestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_demo_store_ios_demo_store_iosUITestsVersionString[]; - diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig deleted file mode 100644 index ebd8518..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" -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/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap deleted file mode 100644 index 6e84872..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_demo_store_ios_demo_store_iosUITests { - umbrella header "Pods-demo-store-ios-demo-store-iosUITests-umbrella.h" - - export * - module * { export * } -} diff --git a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig deleted file mode 100644 index ebd8518..0000000 --- a/Pods/Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" -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/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist deleted file mode 100644 index 19cf209..0000000 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - 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/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.markdown deleted file mode 100644 index 102af75..0000000 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.markdown +++ /dev/null @@ -1,3 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: -Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.plist deleted file mode 100644 index 7acbad1..0000000 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-acknowledgements.plist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-dummy.m b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-dummy.m deleted file mode 100644 index 92c8b0c..0000000 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_demo_store_iosTests : NSObject -@end -@implementation PodsDummy_Pods_demo_store_iosTests -@end diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-umbrella.h b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-umbrella.h deleted file mode 100644 index 62666d8..0000000 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#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_demo_store_iosTestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_demo_store_iosTestsVersionString[]; - diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig deleted file mode 100644 index 32c08dd..0000000 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" -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/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap deleted file mode 100644 index 62b1b09..0000000 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_demo_store_iosTests { - umbrella header "Pods-demo-store-iosTests-umbrella.h" - - export * - module * { export * } -} diff --git a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig deleted file mode 100644 index 32c08dd..0000000 --- a/Pods/Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" -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/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 655ab1b..ce68c71 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -93,8 +93,6 @@ /* Begin PBXFileReference section */ 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1274DEF2C4D166945251575B /* Pods-demo-store-iosTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.debug.xcconfig"; sourceTree = ""; }; - 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig"; sourceTree = ""; }; 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCartItemDto.swift; sourceTree = ""; }; 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepository.swift; sourceTree = ""; }; @@ -145,10 +143,8 @@ 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 75ECCD192C36F94800D6D346 /* BottomBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomBarView.swift; sourceTree = ""; }; 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A34899C8C386A23282313E5B /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios-demo-store-iosUITests/Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig"; sourceTree = ""; }; AC654F53174F1754F6E72BDB /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; C20BDB80283375AFE665FF96 /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; - C9E9C6394B2311130D8A51BB /* Pods-demo-store-iosTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-iosTests.release.xcconfig"; path = "Target Support Files/Pods-demo-store-iosTests/Pods-demo-store-iosTests.release.xcconfig"; sourceTree = ""; }; CF343FE4C1EB44258E4142CD /* Pods_demo_store_ios_demo_store_iosUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios_demo_store_iosUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -531,6 +527,7 @@ isa = PBXGroup; children = ( 75E979BA2C4959790081B069 /* View */, + 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */, ); path = Presentation; sourceTree = ""; @@ -543,14 +540,6 @@ path = View; sourceTree = ""; }; - 75E979BB2C4959850081B069 /* Domain */ = { - isa = PBXGroup; - children = ( - 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */, - ); - path = Domain; - sourceTree = ""; - }; 75E979BC2C4959F50081B069 /* Presentation */ = { isa = PBXGroup; children = ( @@ -655,7 +644,6 @@ 75ECCD182C36F92A00D6D346 /* Navigation */ = { isa = PBXGroup; children = ( - 75E979BB2C4959850081B069 /* Domain */, 75E979B92C4959710081B069 /* Presentation */, ); path = Navigation; @@ -674,10 +662,6 @@ children = ( C20BDB80283375AFE665FF96 /* Pods-demo-store-ios.debug.xcconfig */, AC654F53174F1754F6E72BDB /* Pods-demo-store-ios.release.xcconfig */, - A34899C8C386A23282313E5B /* Pods-demo-store-ios-demo-store-iosUITests.debug.xcconfig */, - 739840337D708A49CB89DD90 /* Pods-demo-store-ios-demo-store-iosUITests.release.xcconfig */, - 1274DEF2C4D166945251575B /* Pods-demo-store-iosTests.debug.xcconfig */, - C9E9C6394B2311130D8A51BB /* Pods-demo-store-iosTests.release.xcconfig */, ); path = Pods; sourceTree = ""; diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist index 86f792a..6f8cfeb 100644 --- a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,12 +7,12 @@ Core.xcscheme_^#shared#^_ orderHint - 10 + 3 Feature.xcscheme_^#shared#^_ orderHint - 11 + 4 common.xcscheme_^#shared#^_ @@ -27,7 +27,7 @@ demo-store-ios.xcscheme_^#shared#^_ orderHint - 9 + 0 SuppressBuildableAutocreation From 471b3eee716cd8a8830bb995ee4696bce37bf5d7 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 19 Jul 2024 20:11:54 +0200 Subject: [PATCH 57/85] feat: Add visitor protocol for navigation --- App/ContentView.swift | 3 +- .../Presentation/Data/ScreenType.swift | 10 ++++ .../Presentation/Data/ScreenVisitor.swift | 28 +++++++++++ .../Presentation/NavigationManager.swift | 43 +++++----------- .../Presentation/View/BottomBarView.swift | 12 ++--- App/mainSubView/UiUtils.swift | 50 ------------------- .../Presentation/View/CartScreenView.swift | 10 ++-- .../Presentation/View/HomeScreenView.swift | 23 +++------ .../Home/Presentation/View/ToolbarView.swift | 8 +-- .../View/ProductsScreenView.swift | 9 +++- .../Presentation/View/SearchScreenView.swift | 17 ++++--- .../View/SettingsScreenView.swift | 10 ++-- 12 files changed, 99 insertions(+), 124 deletions(-) create mode 100644 App/Navigation/Presentation/Data/ScreenType.swift create mode 100644 App/Navigation/Presentation/Data/ScreenVisitor.swift delete mode 100644 App/mainSubView/UiUtils.swift diff --git a/App/ContentView.swift b/App/ContentView.swift index 5d919b8..39ea90e 100644 --- a/App/ContentView.swift +++ b/App/ContentView.swift @@ -2,7 +2,8 @@ import SwiftUI import REES46 struct ContentView: View { - @StateObject var navigationManager = NavigationManager() + + @StateObject var navigationManager = NavigationManager(initialScreen: HomeScreenView()) var body: some View { ZStack { diff --git a/App/Navigation/Presentation/Data/ScreenType.swift b/App/Navigation/Presentation/Data/ScreenType.swift new file mode 100644 index 0000000..d6faed9 --- /dev/null +++ b/App/Navigation/Presentation/Data/ScreenType.swift @@ -0,0 +1,10 @@ + +import Foundation + +enum ScreenType { + case main + case productsScreen + case cart + case settings + case none +} diff --git a/App/Navigation/Presentation/Data/ScreenVisitor.swift b/App/Navigation/Presentation/Data/ScreenVisitor.swift new file mode 100644 index 0000000..567df04 --- /dev/null +++ b/App/Navigation/Presentation/Data/ScreenVisitor.swift @@ -0,0 +1,28 @@ +import Foundation + +protocol ScreenVisitor { + func visit(_ screen: VisitableScreen) +} + +protocol VisitableScreen { + func accept(visitor: ScreenVisitor) +} + +class ScreenTypeVisitor: ScreenVisitor { + var screenType: ScreenType = .none + + func visit(_ screen: VisitableScreen) { + switch screen { + case let homeScreen as HomeScreenView: + screenType = .main + case let productsScreen as ProductsScreenView: + screenType = .productsScreen + case let cartScreen as CartScreenView: + screenType = .cart + case let settingsScreen as SettingsScreenView: + screenType = .settings + default: + screenType = .none + } + } +} diff --git a/App/Navigation/Presentation/NavigationManager.swift b/App/Navigation/Presentation/NavigationManager.swift index b2946df..ae28bc5 100644 --- a/App/Navigation/Presentation/NavigationManager.swift +++ b/App/Navigation/Presentation/NavigationManager.swift @@ -9,38 +9,27 @@ class NavigationManager: ObservableObject { private var screenHistory: [AnyView] = [] - init() { - let homeView = HomeScreenView() - self.currentScreen = AnyView(homeView) - self.currentScreenType = .main + init(initialScreen: Content) { + self.currentScreen = AnyView(initialScreen) + let visitor = ScreenTypeVisitor() + initialScreen.accept(visitor: visitor) + self.currentScreenType = visitor.screenType self.screenHistory.append(self.currentScreen) } - func navigateTo(screen: Content, selectedTab: ScreenType? = .main) { + func navigateTo(screen: Content, selectedTab: ScreenType? = .main) { self.currentScreen = AnyView(screen) self.selectedTab = selectedTab self.screenHistory.append(self.currentScreen) - switch screen { - case is HomeScreenView: - self.currentScreenType = .main - case is ProductsScreenView: - self.currentScreenType = .catalog - case is CartScreenView: - self.currentScreenType = .cart - case is SettingsScreenView: - self.currentScreenType = .settings - default: - self.currentScreenType = .none - } - } - - func setToolbarHidden(hidden: Bool) { - self.isToolbarHidden = hidden + let visitor = ScreenTypeVisitor() + screen.accept(visitor: visitor) + self.currentScreenType = visitor.screenType } - func setBottomBarHidden(hidden: Bool) { - self.isBottomBarHidden = hidden + func setVisibility(hideToolbar: Bool, hideBottomBar: Bool) { + self.isToolbarHidden = hideToolbar + self.isBottomBarHidden = hideBottomBar } func resetSelection() { @@ -56,11 +45,3 @@ class NavigationManager: ObservableObject { } } } - -enum ScreenType { - case main - case catalog - case cart - case settings - case none -} diff --git a/App/Navigation/Presentation/View/BottomBarView.swift b/App/Navigation/Presentation/View/BottomBarView.swift index fa9650b..4512ddf 100644 --- a/App/Navigation/Presentation/View/BottomBarView.swift +++ b/App/Navigation/Presentation/View/BottomBarView.swift @@ -14,16 +14,16 @@ struct BottomBarView: View { TabBarButton(image: "MainTab", isSelected: selectedTab == .main) .onTapGesture { selectedTab = .main - navigationManager.navigateTo(screen: AnyView(HomeScreenView()), selectedTab: .main) + navigationManager.navigateTo(screen: HomeScreenView(), selectedTab: .main) } .padding(.leading, 20) Spacer() - TabBarButton(image: "CatalogTab", isSelected: selectedTab == .catalog) + TabBarButton(image: "CatalogTab", isSelected: selectedTab == .productsScreen) .onTapGesture { - selectedTab = .catalog - navigationManager.navigateTo(screen: AnyView(ProductsScreenView()), selectedTab: .catalog) + selectedTab = .productsScreen + navigationManager.navigateTo(screen: ProductsScreenView(), selectedTab: .productsScreen) } Spacer() @@ -31,7 +31,7 @@ struct BottomBarView: View { TabBarButton(image: "CartTab", isSelected: selectedTab == .cart) .onTapGesture { selectedTab = .cart - navigationManager.navigateTo(screen: AnyView(CartScreenView()), selectedTab: .cart) + navigationManager.navigateTo(screen: CartScreenView(), selectedTab: .cart) } Spacer() @@ -39,7 +39,7 @@ struct BottomBarView: View { TabBarButton(image: "SettingsTab", isSelected: selectedTab == .settings) .onTapGesture { selectedTab = .settings - navigationManager.navigateTo(screen: AnyView(SettingsScreenView()), selectedTab: .settings) + navigationManager.navigateTo(screen: SettingsScreenView(), selectedTab: .settings) } .padding(.trailing, 20) } diff --git a/App/mainSubView/UiUtils.swift b/App/mainSubView/UiUtils.swift deleted file mode 100644 index 61be874..0000000 --- a/App/mainSubView/UiUtils.swift +++ /dev/null @@ -1,50 +0,0 @@ -import SwiftUI - -struct StatusBarStyleKey: PreferenceKey { - static var defaultValue: UIStatusBarStyle = .default - - static func reduce(value: inout UIStatusBarStyle, nextValue: () -> UIStatusBarStyle) { - value = nextValue() - } -} - -class HostingController: UIHostingController { - var statusBarStyle = UIStatusBarStyle.default - - //UIKit seems to observe changes on this, perhaps with KVO? - //In any case, I found changing `statusBarStyle` was sufficient - //and no other method calls were needed to force the status bar to update - override var preferredStatusBarStyle: UIStatusBarStyle { - statusBarStyle - } - - init(wrappedView: T) { -// This observer is necessary to break a dependency cycle - without it -// onPreferenceChange would need to use self but self can't be used until -// super.init is called, which can't be done until after onPreferenceChange is set up etc. - let observer = Observer() - - let observedView = AnyView(wrappedView.onPreferenceChange(StatusBarStyleKey.self) { style in - observer.value?.statusBarStyle = style - }) - - super.init(rootView: observedView) - observer.value = self - } - - private class Observer { - weak var value: HostingController? - init() {} - } - - @available(*, unavailable) required init?(coder aDecoder: NSCoder) { - // We aren't using storyboards, so this is unnecessary - fatalError("Unavailable") - } -} - -extension View { - func statusBar(style: UIStatusBarStyle) -> some View { - preference(key: StatusBarStyleKey.self, value: style) - } -} diff --git a/Feature/Cart/Presentation/View/CartScreenView.swift b/Feature/Cart/Presentation/View/CartScreenView.swift index 3fbaf11..8afef95 100644 --- a/Feature/Cart/Presentation/View/CartScreenView.swift +++ b/Feature/Cart/Presentation/View/CartScreenView.swift @@ -1,9 +1,13 @@ import SwiftUI -struct CartScreenView: View { +struct CartScreenView: View, VisitableScreen { + + func accept(visitor: ScreenVisitor) { + visitor.visit(self) + } + @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var cartViewModel: CartViewModel - @State private var isLoading = true init(cartViewModel: CartViewModel = CartResolver.shared.resolveCartViewModel()) { @@ -61,7 +65,7 @@ struct CartScreenView: View { } .navigationBarTitle("cart_tab_title") .onAppear { - navigationManager.setToolbarHidden(hidden: false) + navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) cartViewModel.loadRecommenderRecommendations(currentProductId: "665") } } diff --git a/Feature/Home/Presentation/View/HomeScreenView.swift b/Feature/Home/Presentation/View/HomeScreenView.swift index 53ba1f1..eb8b13a 100644 --- a/Feature/Home/Presentation/View/HomeScreenView.swift +++ b/Feature/Home/Presentation/View/HomeScreenView.swift @@ -1,11 +1,16 @@ import SwiftUI -struct HomeScreenView: View { +struct HomeScreenView: View, VisitableScreen { + + func accept(visitor: ScreenVisitor) { + visitor.visit(self) + } + @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var viewModel: HomeViewModel @State private var isLoading = true - + init(viewModel: HomeViewModel = HomeResolver.shared.resolve()) { self.viewModel = viewModel } @@ -18,7 +23,6 @@ struct HomeScreenView: View { ProgressView() .progressViewStyle(CircularProgressViewStyle()) .onAppear { - // Simulate loading delay DispatchQueue.main.asyncAfter(deadline: .now() + 2) { isLoading = false } @@ -26,9 +30,7 @@ struct HomeScreenView: View { .frame(height: 250) } else { MainDiscoverView() - HomeStoriesContainerView() - ShortRecommendationListView( recommendedProducts: viewModel.arrivalsProducts, title: NSLocalizedString("arrivals_title", comment: "") @@ -36,14 +38,12 @@ struct HomeScreenView: View { .onAppear { viewModel.loadArrivalsRecommendations(currentProductId: "670") } - ShortRecommendationListView( recommendedProducts: viewModel.topTrendProducts, title: NSLocalizedString("top_trend_title", comment: "") ).onAppear { viewModel.loadTopTrendRecommendations(currentProductId: "656") } - ShortRecommendationListView( recommendedProducts: viewModel.recommenderProducts, title: NSLocalizedString("reccomender_title", comment: "") @@ -57,15 +57,8 @@ struct HomeScreenView: View { } .navigationTitle("main_tab_title") .onAppear { - navigationManager.setToolbarHidden(hidden: false) + navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) } } } } - -struct HomeScreenView_Previews: PreviewProvider { - static var previews: some View { - HomeScreenView() - .environmentObject(NavigationManager()) - } -} diff --git a/Feature/Home/Presentation/View/ToolbarView.swift b/Feature/Home/Presentation/View/ToolbarView.swift index 8edafc7..8481519 100644 --- a/Feature/Home/Presentation/View/ToolbarView.swift +++ b/Feature/Home/Presentation/View/ToolbarView.swift @@ -1,10 +1,6 @@ import SwiftUI import Combine -protocol ToolbarConfigurable { - var isToolbarHidden: Bool { get } -} - struct ToolbarView: View { @EnvironmentObject var navigationManager: NavigationManager @@ -39,7 +35,7 @@ struct ToolbarView: View { .foregroundColor(.black) .onTapGesture { navigationManager.navigateTo( - screen: AnyView(SearchScreenView()), + screen: SearchScreenView(), selectedTab: navigationManager.selectedTab ) } @@ -52,7 +48,7 @@ struct ToolbarView: View { .padding(.trailing, 12) .onTapGesture { navigationManager.navigateTo( - screen: AnyView(CartScreenView()), + screen: CartScreenView(), selectedTab: .cart ) } diff --git a/Feature/Product/Presentation/View/ProductsScreenView.swift b/Feature/Product/Presentation/View/ProductsScreenView.swift index 324ae81..b227b3e 100644 --- a/Feature/Product/Presentation/View/ProductsScreenView.swift +++ b/Feature/Product/Presentation/View/ProductsScreenView.swift @@ -1,10 +1,15 @@ import SwiftUI -struct ProductsScreenView: View { +struct ProductsScreenView: View, VisitableScreen { + + func accept(visitor: ScreenVisitor) { + visitor.visit(self) + } var product: RecommendedProduct? @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var viewModel = HomeViewModel() + @State private var selectedImageIndex = 0 @State private var isLoading = true @@ -54,7 +59,7 @@ struct ProductsScreenView: View { } else { print("DATA is nil") } - navigationManager.setToolbarHidden(hidden: false) + navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) } } } diff --git a/Feature/Search/Presentation/View/SearchScreenView.swift b/Feature/Search/Presentation/View/SearchScreenView.swift index 5d51df0..56d16dd 100644 --- a/Feature/Search/Presentation/View/SearchScreenView.swift +++ b/Feature/Search/Presentation/View/SearchScreenView.swift @@ -2,10 +2,15 @@ import SwiftUI import Combine import REES46 -struct SearchScreenView: View { +struct SearchScreenView: View, VisitableScreen { + + func accept(visitor: ScreenVisitor) { + visitor.visit(self) + } @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var viewModel = SearchViewModel() + var body: some View { VStack(alignment: .leading) { @@ -130,11 +135,9 @@ struct SearchScreenView: View { ViewAllButton(count: searchResults.productsTotal) { let recommendedProducts = searchResults.products.map { RecommendedProduct.from(localProduct: $0) } navigationManager.navigateTo( - screen: AnyView( - SearchResultView( - recommendedProducts: recommendedProducts, - count: searchResults.productsTotal - ) + screen: SearchResultView( + recommendedProducts: recommendedProducts, + count: searchResults.productsTotal ), selectedTab: nil ) @@ -147,7 +150,7 @@ struct SearchScreenView: View { } .background(Color.white) .onAppear { - navigationManager.setToolbarHidden(hidden: true) + navigationManager.setVisibility(hideToolbar: true, hideBottomBar: true) } } } diff --git a/Feature/Settings/Presentation/View/SettingsScreenView.swift b/Feature/Settings/Presentation/View/SettingsScreenView.swift index b66dba3..b8758c2 100644 --- a/Feature/Settings/Presentation/View/SettingsScreenView.swift +++ b/Feature/Settings/Presentation/View/SettingsScreenView.swift @@ -6,7 +6,11 @@ enum ViewState { case data } -struct SettingsScreenView: View { +struct SettingsScreenView: View, VisitableScreen { + + func accept(visitor: ScreenVisitor) { + visitor.visit(self) + } @EnvironmentObject var navigationManager: NavigationManager @@ -26,7 +30,7 @@ struct SettingsScreenView: View { case .error(let errorMessage): SettingsErrorScreenView(errorMessage: errorMessage) { - navigationManager.navigateTo(screen: AnyView(HomeScreenView())) + navigationManager.navigateTo(screen: HomeScreenView()) } case .data: @@ -37,7 +41,7 @@ struct SettingsScreenView: View { .navigationTitle("settings_tab_title") .background(Color.white.edgesIgnoringSafeArea(.all)) .onAppear{ - navigationManager.setToolbarHidden(hidden: false) + navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) } } } From a521b4bc7933cee0493296fef9957f1636223a91 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 19 Jul 2024 21:10:16 +0200 Subject: [PATCH 58/85] feat: Separete data from bottom nav.view --- .../{Presentation => }/Data/ScreenType.swift | 4 +- App/Navigation/Data/TabItem.swift | 10 +++ .../Repository}/ScreenVisitor.swift | 12 ++-- .../NavigationManager.swift | 9 +-- .../Presentation/View/BottomBarView.swift | 69 ------------------- App/Presentation/View/BottomBarView.swift | 56 +++++++++++++++ App/{ => Presentation/View}/ContentView.swift | 0 .../Presentation/View/ToolbarView.swift | 0 .../Presentation/View/DetailsToolbar.swift | 4 +- .../FullRecommendationListView.swift | 8 ++- .../Recommendation/ProductListItemView.swift | 8 +-- .../ShortRecommendationListView.swift | 8 +-- .../Presentation/View/SearchResultView.swift | 9 ++- 13 files changed, 100 insertions(+), 97 deletions(-) rename App/Navigation/{Presentation => }/Data/ScreenType.swift (69%) create mode 100644 App/Navigation/Data/TabItem.swift rename App/Navigation/{Presentation/Data => Domain/Repository}/ScreenVisitor.swift (61%) rename App/Navigation/{Presentation => }/NavigationManager.swift (86%) delete mode 100644 App/Navigation/Presentation/View/BottomBarView.swift create mode 100644 App/Presentation/View/BottomBarView.swift rename App/{ => Presentation/View}/ContentView.swift (100%) rename {Feature/Home => App}/Presentation/View/ToolbarView.swift (100%) diff --git a/App/Navigation/Presentation/Data/ScreenType.swift b/App/Navigation/Data/ScreenType.swift similarity index 69% rename from App/Navigation/Presentation/Data/ScreenType.swift rename to App/Navigation/Data/ScreenType.swift index d6faed9..7316050 100644 --- a/App/Navigation/Presentation/Data/ScreenType.swift +++ b/App/Navigation/Data/ScreenType.swift @@ -2,8 +2,8 @@ import Foundation enum ScreenType { - case main - case productsScreen + case home + case products case cart case settings case none diff --git a/App/Navigation/Data/TabItem.swift b/App/Navigation/Data/TabItem.swift new file mode 100644 index 0000000..fdb9755 --- /dev/null +++ b/App/Navigation/Data/TabItem.swift @@ -0,0 +1,10 @@ + +import Foundation +import SwiftUI + +struct TabItem: Identifiable { + let id = UUID() + let image: String + let screen: AnyView + let type: ScreenType +} diff --git a/App/Navigation/Presentation/Data/ScreenVisitor.swift b/App/Navigation/Domain/Repository/ScreenVisitor.swift similarity index 61% rename from App/Navigation/Presentation/Data/ScreenVisitor.swift rename to App/Navigation/Domain/Repository/ScreenVisitor.swift index 567df04..6431978 100644 --- a/App/Navigation/Presentation/Data/ScreenVisitor.swift +++ b/App/Navigation/Domain/Repository/ScreenVisitor.swift @@ -13,13 +13,13 @@ class ScreenTypeVisitor: ScreenVisitor { func visit(_ screen: VisitableScreen) { switch screen { - case let homeScreen as HomeScreenView: - screenType = .main - case let productsScreen as ProductsScreenView: - screenType = .productsScreen - case let cartScreen as CartScreenView: + case _ as HomeScreenView: + screenType = .home + case _ as ProductsScreenView: + screenType = .products + case _ as CartScreenView: screenType = .cart - case let settingsScreen as SettingsScreenView: + case _ as SettingsScreenView: screenType = .settings default: screenType = .none diff --git a/App/Navigation/Presentation/NavigationManager.swift b/App/Navigation/NavigationManager.swift similarity index 86% rename from App/Navigation/Presentation/NavigationManager.swift rename to App/Navigation/NavigationManager.swift index ae28bc5..4ea69e9 100644 --- a/App/Navigation/Presentation/NavigationManager.swift +++ b/App/Navigation/NavigationManager.swift @@ -5,7 +5,7 @@ class NavigationManager: ObservableObject { @Published var isToolbarHidden: Bool = false @Published var isBottomBarHidden: Bool = false @Published var currentScreenType: ScreenType = .none - @Published var selectedTab: ScreenType? = .main + @Published var selectedTab: ScreenType? = .home private var screenHistory: [AnyView] = [] @@ -17,10 +17,11 @@ class NavigationManager: ObservableObject { self.screenHistory.append(self.currentScreen) } - func navigateTo(screen: Content, selectedTab: ScreenType? = .main) { - self.currentScreen = AnyView(screen) + func navigateTo(screen: Content, selectedTab: ScreenType? = .home) { + let anyView = AnyView(screen) + self.currentScreen = anyView self.selectedTab = selectedTab - self.screenHistory.append(self.currentScreen) + self.screenHistory.append(anyView) let visitor = ScreenTypeVisitor() screen.accept(visitor: visitor) diff --git a/App/Navigation/Presentation/View/BottomBarView.swift b/App/Navigation/Presentation/View/BottomBarView.swift deleted file mode 100644 index 4512ddf..0000000 --- a/App/Navigation/Presentation/View/BottomBarView.swift +++ /dev/null @@ -1,69 +0,0 @@ -import SwiftUI - -struct BottomBarView: View { - - @EnvironmentObject var navigationManager: NavigationManager - @State private var selectedTab: ScreenType? = .main - - var body: some View { - VStack { - if !navigationManager.isBottomBarHidden { - Spacer() - - HStack { - TabBarButton(image: "MainTab", isSelected: selectedTab == .main) - .onTapGesture { - selectedTab = .main - navigationManager.navigateTo(screen: HomeScreenView(), selectedTab: .main) - } - .padding(.leading, 20) - - Spacer() - - TabBarButton(image: "CatalogTab", isSelected: selectedTab == .productsScreen) - .onTapGesture { - selectedTab = .productsScreen - navigationManager.navigateTo(screen: ProductsScreenView(), selectedTab: .productsScreen) - } - - Spacer() - - TabBarButton(image: "CartTab", isSelected: selectedTab == .cart) - .onTapGesture { - selectedTab = .cart - navigationManager.navigateTo(screen: CartScreenView(), selectedTab: .cart) - } - - Spacer() - - TabBarButton(image: "SettingsTab", isSelected: selectedTab == .settings) - .onTapGesture { - selectedTab = .settings - navigationManager.navigateTo(screen: SettingsScreenView(), selectedTab: .settings) - } - .padding(.trailing, 20) - } - } - } - .onChange(of: navigationManager.selectedTab) { newTab in - selectedTab = newTab - } - } -} - -struct TabBarButton: View { - var image: String - var isSelected: Bool - - var body: some View { - VStack { - Spacer() - Image(image) - .resizable() - .renderingMode(.template) - .frame(width: 32, height: 32) - .foregroundColor(isSelected ? .white : .gray) - Spacer().frame(height: 30) - } - } -} diff --git a/App/Presentation/View/BottomBarView.swift b/App/Presentation/View/BottomBarView.swift new file mode 100644 index 0000000..bfe2f31 --- /dev/null +++ b/App/Presentation/View/BottomBarView.swift @@ -0,0 +1,56 @@ +import SwiftUI + +struct BottomBarView: View { + + @EnvironmentObject var navigationManager: NavigationManager + + // Используйте AnyView для экранов + let tabs: [TabItem] = [ + TabItem(image: "MainTab", screen: AnyView(HomeScreenView()), type: .home), + TabItem(image: "CatalogTab", screen: AnyView(ProductsScreenView()), type: .products), + TabItem(image: "CartTab", screen: AnyView(CartScreenView()), type: .cart), + TabItem(image: "SettingsTab", screen: AnyView(SettingsScreenView()), type: .settings) + ] + + var body: some View { + VStack { + if !navigationManager.isBottomBarHidden { + Spacer() + HStack(spacing: 0) { + ForEach(tabs) { tab in + tabButton(tab) + } + } + } + } + } + + private func tabButton(_ tab: TabItem) -> some View { + TabBarButton(image: tab.image, isSelected: navigationManager.selectedTab == tab.type) + .onTapGesture { + navigationManager.selectedTab = tab.type + navigationManager.navigateTo( + screen: tab.screen, + selectedTab: tab.type + ) + } + .padding(.horizontal, tab.type == .home || tab.type == .settings ? 20 : 0) + } +} + +struct TabBarButton: View { + var image: String + var isSelected: Bool + + var body: some View { + VStack { + Spacer() + Image(image) + .resizable() + .renderingMode(.template) + .frame(width: 32, height: 32) + .foregroundColor(isSelected ? .white : .gray) + Spacer().frame(height: 30) + } + } +} diff --git a/App/ContentView.swift b/App/Presentation/View/ContentView.swift similarity index 100% rename from App/ContentView.swift rename to App/Presentation/View/ContentView.swift diff --git a/Feature/Home/Presentation/View/ToolbarView.swift b/App/Presentation/View/ToolbarView.swift similarity index 100% rename from Feature/Home/Presentation/View/ToolbarView.swift rename to App/Presentation/View/ToolbarView.swift diff --git a/Feature/Home/Presentation/View/DetailsToolbar.swift b/Feature/Home/Presentation/View/DetailsToolbar.swift index 4c516e7..3da33b2 100644 --- a/Feature/Home/Presentation/View/DetailsToolbar.swift +++ b/Feature/Home/Presentation/View/DetailsToolbar.swift @@ -36,7 +36,7 @@ struct DetailsToolbarView: View { .foregroundColor(.white) .onTapGesture { navigationManager.navigateTo( - screen: AnyView(SearchScreenView()), + screen: SearchScreenView(), selectedTab: navigationManager.selectedTab ) } @@ -49,7 +49,7 @@ struct DetailsToolbarView: View { .padding(.trailing, 12) .onTapGesture { navigationManager.navigateTo( - screen: AnyView(CartScreenView()), + screen: CartScreenView(), selectedTab: .cart ) } diff --git a/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift b/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift index 93348b4..4bd2b6d 100644 --- a/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift +++ b/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift @@ -1,6 +1,10 @@ import SwiftUI -struct FullRecommendationListView: View { +struct FullRecommendationListView: View, VisitableScreen { + + func accept(visitor: ScreenVisitor) { + visitor.visit(self) + } @EnvironmentObject var navigationManager: NavigationManager @@ -29,7 +33,7 @@ struct FullRecommendationListView: View { } .background(Color.white) .onAppear{ - navigationManager.setToolbarHidden(hidden: true) + navigationManager.setVisibility(hideToolbar: true, hideBottomBar: false) } } } diff --git a/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift b/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift index 60ee5a3..7e6b246 100644 --- a/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift +++ b/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift @@ -71,12 +71,10 @@ struct ProductListItemView: View { .frame(width: containerWidth, height: containerHeight) .onTapGesture { navigationManager.navigateTo( - screen: AnyView( - ProductsScreenView( - product: product - ) + screen: ProductsScreenView( + product: product ), - selectedTab: .catalog + selectedTab: .products ) } } diff --git a/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift b/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift index d7d69ad..9079970 100644 --- a/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift +++ b/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift @@ -9,11 +9,9 @@ struct ShortRecommendationListView: View { VStack(alignment: .leading) { SectionHeaderView(title: title) { navigationManager.navigateTo( - screen: AnyView( - FullRecommendationListView( - recommendedProducts: recommendedProducts, - title: NSLocalizedString("reccomender_title", comment: "") - ) + screen: FullRecommendationListView( + recommendedProducts: recommendedProducts, + title: NSLocalizedString("reccomender_title", comment: "") ) ) } diff --git a/Feature/Search/Presentation/View/SearchResultView.swift b/Feature/Search/Presentation/View/SearchResultView.swift index 6ebfff3..a02de0b 100644 --- a/Feature/Search/Presentation/View/SearchResultView.swift +++ b/Feature/Search/Presentation/View/SearchResultView.swift @@ -1,6 +1,11 @@ import SwiftUI -struct SearchResultView: View { +struct SearchResultView: View, VisitableScreen { + + func accept(visitor: ScreenVisitor) { + visitor.visit(self) + } + @EnvironmentObject var navigationManager: NavigationManager var recommendedProducts: [RecommendedProduct] @@ -41,7 +46,7 @@ struct SearchResultView: View { Button( action: { - navigationManager.navigateTo(screen: AnyView(HomeScreenView()), selectedTab: .main) + navigationManager.navigateTo(screen: HomeScreenView(), selectedTab: .home) } ) { Image(systemName: "xmark") From 70875bf325e54256a722829b3ab26dce75d83a04 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Sun, 21 Jul 2024 12:28:58 +0200 Subject: [PATCH 59/85] feat: Simplify navigation with overloaded `navigateTo` methods --- .idea/.gitignore | 58 ---- .idea/demo-ios.iml | 9 - .idea/demo-store-ios.iml | 9 - .idea/misc.xml | 9 - .idea/modules.xml | 8 - .idea/other.xml | 263 ------------------ App/Navigation/Data/TabItem.swift | 4 +- .../Repository/ScreenTypeProvider.swift | 41 +++ .../Domain/Repository/ScreenVisitor.swift | 28 -- App/Navigation/NavigationManager.swift | 30 +- App/Presentation/View/BottomBarView.swift | 19 +- App/Presentation/View/ContentView.swift | 15 +- App/Presentation/View/ToolbarView.swift | 16 +- .../Presentation/View/CartScreenView.swift | 6 +- .../Presentation/View/DetailsToolbar.swift | 16 +- .../Presentation/View/HomeScreenView.swift | 8 +- .../FullRecommendationListView.swift | 5 +- .../Recommendation/ProductListItemView.swift | 12 +- .../ShortRecommendationListView.swift | 12 +- .../View/ProductsScreenView.swift | 6 +- .../Presentation/View/SearchResultView.swift | 8 +- .../Presentation/View/SearchScreenView.swift | 20 +- .../View/SettingsScreenView.swift | 8 +- Podfile | 10 - Podfile.lock | 15 +- Pods/Manifest.lock | 15 +- 26 files changed, 119 insertions(+), 531 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/demo-ios.iml delete mode 100644 .idea/demo-store-ios.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/other.xml create mode 100644 App/Navigation/Domain/Repository/ScreenTypeProvider.swift delete mode 100644 App/Navigation/Domain/Repository/ScreenVisitor.swift diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index a8a965e..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,58 +0,0 @@ -## User settings -xcuserdata/ - -## Obj-C/Swift specific -*.hmap - -## App packaging -*.ipa -*.dSYM.zip -*.dSYM - -## Playgrounds -timeline.xctimeline -playground.xcworkspace - -# Swift Package Manager -# -# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. -# Packages/ -# Package.pins -# Package.resolved -# *.xcodeproj -# -# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata -# hence it is not needed unless you have added a package configuration file to your project -# .swiftpm - -.build/ - -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ -# -# Add this line if you want to avoid checking in source code from the Xcode workspace -# *.xcworkspace - -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts - -Carthage/Build/ - -# fastlane -# -# It is recommended to not store the screenshots in the git repo. -# Instead, use fastlane to re-generate the screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/#source-control - -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots/**/*.png -fastlane/test_output \ No newline at end of file diff --git a/.idea/demo-ios.iml b/.idea/demo-ios.iml deleted file mode 100644 index d6ebd48..0000000 --- a/.idea/demo-ios.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/demo-store-ios.iml b/.idea/demo-store-ios.iml deleted file mode 100644 index d6ebd48..0000000 --- a/.idea/demo-store-ios.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 14f23db..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index eeb7ec2..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/other.xml b/.idea/other.xml deleted file mode 100644 index 0d3a1fb..0000000 --- a/.idea/other.xml +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/App/Navigation/Data/TabItem.swift b/App/Navigation/Data/TabItem.swift index fdb9755..c7cb146 100644 --- a/App/Navigation/Data/TabItem.swift +++ b/App/Navigation/Data/TabItem.swift @@ -1,10 +1,8 @@ - -import Foundation import SwiftUI struct TabItem: Identifiable { let id = UUID() let image: String - let screen: AnyView + let screen: ScreenWrapper let type: ScreenType } diff --git a/App/Navigation/Domain/Repository/ScreenTypeProvider.swift b/App/Navigation/Domain/Repository/ScreenTypeProvider.swift new file mode 100644 index 0000000..6466d93 --- /dev/null +++ b/App/Navigation/Domain/Repository/ScreenTypeProvider.swift @@ -0,0 +1,41 @@ +import Foundation +import SwiftUI + +protocol ScreenTypeProvider { + static var screenType: ScreenType { get } +} + +struct ScreenWrapper: Identifiable { + let id = UUID() + let screen: AnyView + let type: ScreenType + + init(screen: T) where T: ScreenTypeProvider { + self.screen = AnyView(screen) + self.type = T.screenType + } +} + +extension HomeScreenView: ScreenTypeProvider { + static var screenType: ScreenType { + .home + } +} + +extension ProductsScreenView: ScreenTypeProvider { + static var screenType: ScreenType { + .products + } +} + +extension CartScreenView: ScreenTypeProvider { + static var screenType: ScreenType { + .cart + } +} + +extension SettingsScreenView: ScreenTypeProvider { + static var screenType: ScreenType { + .settings + } +} diff --git a/App/Navigation/Domain/Repository/ScreenVisitor.swift b/App/Navigation/Domain/Repository/ScreenVisitor.swift deleted file mode 100644 index 6431978..0000000 --- a/App/Navigation/Domain/Repository/ScreenVisitor.swift +++ /dev/null @@ -1,28 +0,0 @@ -import Foundation - -protocol ScreenVisitor { - func visit(_ screen: VisitableScreen) -} - -protocol VisitableScreen { - func accept(visitor: ScreenVisitor) -} - -class ScreenTypeVisitor: ScreenVisitor { - var screenType: ScreenType = .none - - func visit(_ screen: VisitableScreen) { - switch screen { - case _ as HomeScreenView: - screenType = .home - case _ as ProductsScreenView: - screenType = .products - case _ as CartScreenView: - screenType = .cart - case _ as SettingsScreenView: - screenType = .settings - default: - screenType = .none - } - } -} diff --git a/App/Navigation/NavigationManager.swift b/App/Navigation/NavigationManager.swift index 4ea69e9..6130063 100644 --- a/App/Navigation/NavigationManager.swift +++ b/App/Navigation/NavigationManager.swift @@ -1,31 +1,31 @@ import SwiftUI class NavigationManager: ObservableObject { - @Published var currentScreen: AnyView + + @Published var currentScreen: ScreenWrapper @Published var isToolbarHidden: Bool = false @Published var isBottomBarHidden: Bool = false @Published var currentScreenType: ScreenType = .none @Published var selectedTab: ScreenType? = .home - private var screenHistory: [AnyView] = [] + private var screenHistory: [ScreenWrapper] = [] - init(initialScreen: Content) { - self.currentScreen = AnyView(initialScreen) - let visitor = ScreenTypeVisitor() - initialScreen.accept(visitor: visitor) - self.currentScreenType = visitor.screenType + init(initialScreen: ScreenWrapper) { + self.currentScreen = initialScreen + self.currentScreenType = initialScreen.type self.screenHistory.append(self.currentScreen) } - func navigateTo(screen: Content, selectedTab: ScreenType? = .home) { - let anyView = AnyView(screen) - self.currentScreen = anyView + func navigateTo(_ screen: Screen) where Screen: ScreenTypeProvider { + let screenWrapper = ScreenWrapper(screen: screen) + self.navigateTo(screen: screenWrapper) + } + + func navigateTo(screen: ScreenWrapper, selectedTab: ScreenType? = .home) { + self.currentScreen = screen self.selectedTab = selectedTab - self.screenHistory.append(anyView) - - let visitor = ScreenTypeVisitor() - screen.accept(visitor: visitor) - self.currentScreenType = visitor.screenType + self.screenHistory.append(screen) + self.currentScreenType = screen.type } func setVisibility(hideToolbar: Bool, hideBottomBar: Bool) { diff --git a/App/Presentation/View/BottomBarView.swift b/App/Presentation/View/BottomBarView.swift index bfe2f31..da0e34c 100644 --- a/App/Presentation/View/BottomBarView.swift +++ b/App/Presentation/View/BottomBarView.swift @@ -4,18 +4,17 @@ struct BottomBarView: View { @EnvironmentObject var navigationManager: NavigationManager - // Используйте AnyView для экранов - let tabs: [TabItem] = [ - TabItem(image: "MainTab", screen: AnyView(HomeScreenView()), type: .home), - TabItem(image: "CatalogTab", screen: AnyView(ProductsScreenView()), type: .products), - TabItem(image: "CartTab", screen: AnyView(CartScreenView()), type: .cart), - TabItem(image: "SettingsTab", screen: AnyView(SettingsScreenView()), type: .settings) + private let tabs: [TabItem] = [ + TabItem(image: "MainTab", screen: ScreenWrapper(screen: HomeScreenView()), type: .home), + TabItem(image: "CatalogTab", screen: ScreenWrapper(screen: ProductsScreenView()), type: .products), + TabItem(image: "CartTab", screen: ScreenWrapper(screen: CartScreenView()), type: .cart), + TabItem(image: "SettingsTab", screen: ScreenWrapper(screen: SettingsScreenView()), type: .settings) ] var body: some View { VStack { + Spacer() if !navigationManager.isBottomBarHidden { - Spacer() HStack(spacing: 0) { ForEach(tabs) { tab in tabButton(tab) @@ -29,10 +28,7 @@ struct BottomBarView: View { TabBarButton(image: tab.image, isSelected: navigationManager.selectedTab == tab.type) .onTapGesture { navigationManager.selectedTab = tab.type - navigationManager.navigateTo( - screen: tab.screen, - selectedTab: tab.type - ) + navigationManager.navigateTo(screen: tab.screen, selectedTab: tab.type) } .padding(.horizontal, tab.type == .home || tab.type == .settings ? 20 : 0) } @@ -54,3 +50,4 @@ struct TabBarButton: View { } } } + diff --git a/App/Presentation/View/ContentView.swift b/App/Presentation/View/ContentView.swift index 39ea90e..dfb6b68 100644 --- a/App/Presentation/View/ContentView.swift +++ b/App/Presentation/View/ContentView.swift @@ -1,9 +1,8 @@ import SwiftUI -import REES46 struct ContentView: View { - @StateObject var navigationManager = NavigationManager(initialScreen: HomeScreenView()) + @StateObject var navigationManager = NavigationManager(initialScreen: ScreenWrapper(screen: HomeScreenView())) var body: some View { ZStack { @@ -12,7 +11,7 @@ struct ContentView: View { VStack(spacing: 0) { ToolbarView() - navigationManager.currentScreen + navigationManager.currentScreen.screen .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) .edgesIgnoringSafeArea(.bottom) @@ -27,8 +26,8 @@ struct ContentView: View { } } -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView() - } -} +//struct ContentView_Previews: PreviewProvider { +// static var previews: some View { +// ContentView() +// } +//} diff --git a/App/Presentation/View/ToolbarView.swift b/App/Presentation/View/ToolbarView.swift index 8481519..a0b56ba 100644 --- a/App/Presentation/View/ToolbarView.swift +++ b/App/Presentation/View/ToolbarView.swift @@ -34,10 +34,10 @@ struct ToolbarView: View { .frame(width: 30, height: 30) .foregroundColor(.black) .onTapGesture { - navigationManager.navigateTo( - screen: SearchScreenView(), - selectedTab: navigationManager.selectedTab - ) +// navigationManager.navigateTo( +// screen: SearchScreenView(), +// selectedTab: navigationManager.selectedTab +// ) } Image("CartIcon") @@ -47,10 +47,10 @@ struct ToolbarView: View { .foregroundColor(.black) .padding(.trailing, 12) .onTapGesture { - navigationManager.navigateTo( - screen: CartScreenView(), - selectedTab: .cart - ) +// navigationManager.navigateTo( +// screen: CartScreenView(), +// selectedTab: .cart +// ) } } } diff --git a/Feature/Cart/Presentation/View/CartScreenView.swift b/Feature/Cart/Presentation/View/CartScreenView.swift index 8afef95..1e81213 100644 --- a/Feature/Cart/Presentation/View/CartScreenView.swift +++ b/Feature/Cart/Presentation/View/CartScreenView.swift @@ -1,10 +1,6 @@ import SwiftUI -struct CartScreenView: View, VisitableScreen { - - func accept(visitor: ScreenVisitor) { - visitor.visit(self) - } +struct CartScreenView: View { @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var cartViewModel: CartViewModel diff --git a/Feature/Home/Presentation/View/DetailsToolbar.swift b/Feature/Home/Presentation/View/DetailsToolbar.swift index 3da33b2..498e575 100644 --- a/Feature/Home/Presentation/View/DetailsToolbar.swift +++ b/Feature/Home/Presentation/View/DetailsToolbar.swift @@ -35,10 +35,10 @@ struct DetailsToolbarView: View { .frame(width: 30, height: 30) .foregroundColor(.white) .onTapGesture { - navigationManager.navigateTo( - screen: SearchScreenView(), - selectedTab: navigationManager.selectedTab - ) +// navigationManager.navigateTo( +// screen: SearchScreenView(), +// selectedTab: navigationManager.selectedTab +// ) } Image("CartIcon") @@ -48,10 +48,10 @@ struct DetailsToolbarView: View { .foregroundColor(.white) .padding(.trailing, 12) .onTapGesture { - navigationManager.navigateTo( - screen: CartScreenView(), - selectedTab: .cart - ) +// navigationManager.navigateTo( +// screen: CartScreenView(), +// selectedTab: .cart +// ) } } } diff --git a/Feature/Home/Presentation/View/HomeScreenView.swift b/Feature/Home/Presentation/View/HomeScreenView.swift index eb8b13a..d915e42 100644 --- a/Feature/Home/Presentation/View/HomeScreenView.swift +++ b/Feature/Home/Presentation/View/HomeScreenView.swift @@ -1,11 +1,7 @@ import SwiftUI -struct HomeScreenView: View, VisitableScreen { - - func accept(visitor: ScreenVisitor) { - visitor.visit(self) - } - +struct HomeScreenView: View { + @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var viewModel: HomeViewModel diff --git a/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift b/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift index 4bd2b6d..144e426 100644 --- a/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift +++ b/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift @@ -1,10 +1,7 @@ import SwiftUI -struct FullRecommendationListView: View, VisitableScreen { +struct FullRecommendationListView: View{ - func accept(visitor: ScreenVisitor) { - visitor.visit(self) - } @EnvironmentObject var navigationManager: NavigationManager diff --git a/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift b/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift index 7e6b246..23eab97 100644 --- a/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift +++ b/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift @@ -70,12 +70,12 @@ struct ProductListItemView: View { .cornerRadius(10) .frame(width: containerWidth, height: containerHeight) .onTapGesture { - navigationManager.navigateTo( - screen: ProductsScreenView( - product: product - ), - selectedTab: .products - ) +// navigationManager.navigateTo( +// screen: ProductsScreenView( +// product: product +// ), +// selectedTab: .products +// ) } } } diff --git a/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift b/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift index 9079970..6fb2abe 100644 --- a/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift +++ b/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift @@ -8,12 +8,12 @@ struct ShortRecommendationListView: View { var body: some View { VStack(alignment: .leading) { SectionHeaderView(title: title) { - navigationManager.navigateTo( - screen: FullRecommendationListView( - recommendedProducts: recommendedProducts, - title: NSLocalizedString("reccomender_title", comment: "") - ) - ) +// navigationManager.navigateTo( +// screen: FullRecommendationListView( +// recommendedProducts: recommendedProducts, +// title: NSLocalizedString("reccomender_title", comment: "") +// ) +// ) } ScrollView(.horizontal, showsIndicators: false) { diff --git a/Feature/Product/Presentation/View/ProductsScreenView.swift b/Feature/Product/Presentation/View/ProductsScreenView.swift index b227b3e..e01e681 100644 --- a/Feature/Product/Presentation/View/ProductsScreenView.swift +++ b/Feature/Product/Presentation/View/ProductsScreenView.swift @@ -1,10 +1,6 @@ import SwiftUI -struct ProductsScreenView: View, VisitableScreen { - - func accept(visitor: ScreenVisitor) { - visitor.visit(self) - } +struct ProductsScreenView: View { var product: RecommendedProduct? @EnvironmentObject var navigationManager: NavigationManager diff --git a/Feature/Search/Presentation/View/SearchResultView.swift b/Feature/Search/Presentation/View/SearchResultView.swift index a02de0b..730969b 100644 --- a/Feature/Search/Presentation/View/SearchResultView.swift +++ b/Feature/Search/Presentation/View/SearchResultView.swift @@ -1,10 +1,6 @@ import SwiftUI -struct SearchResultView: View, VisitableScreen { - - func accept(visitor: ScreenVisitor) { - visitor.visit(self) - } +struct SearchResultView: View { @EnvironmentObject var navigationManager: NavigationManager @@ -46,7 +42,7 @@ struct SearchResultView: View, VisitableScreen { Button( action: { - navigationManager.navigateTo(screen: HomeScreenView(), selectedTab: .home) +// navigationManager.navigateTo(screen: HomeScreenView(), selectedTab: .home) } ) { Image(systemName: "xmark") diff --git a/Feature/Search/Presentation/View/SearchScreenView.swift b/Feature/Search/Presentation/View/SearchScreenView.swift index 56d16dd..d71c1f1 100644 --- a/Feature/Search/Presentation/View/SearchScreenView.swift +++ b/Feature/Search/Presentation/View/SearchScreenView.swift @@ -2,11 +2,7 @@ import SwiftUI import Combine import REES46 -struct SearchScreenView: View, VisitableScreen { - - func accept(visitor: ScreenVisitor) { - visitor.visit(self) - } +struct SearchScreenView: View { @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var viewModel = SearchViewModel() @@ -134,13 +130,13 @@ struct SearchScreenView: View, VisitableScreen { if searchResults.productsTotal != 0 { ViewAllButton(count: searchResults.productsTotal) { let recommendedProducts = searchResults.products.map { RecommendedProduct.from(localProduct: $0) } - navigationManager.navigateTo( - screen: SearchResultView( - recommendedProducts: recommendedProducts, - count: searchResults.productsTotal - ), - selectedTab: nil - ) +// navigationManager.navigateTo( +// screen: SearchResultView( +// recommendedProducts: recommendedProducts, +// count: searchResults.productsTotal +// ), +// selectedTab: nil +// ) } .padding(.bottom) } diff --git a/Feature/Settings/Presentation/View/SettingsScreenView.swift b/Feature/Settings/Presentation/View/SettingsScreenView.swift index b8758c2..4c8b5a8 100644 --- a/Feature/Settings/Presentation/View/SettingsScreenView.swift +++ b/Feature/Settings/Presentation/View/SettingsScreenView.swift @@ -6,11 +6,7 @@ enum ViewState { case data } -struct SettingsScreenView: View, VisitableScreen { - - func accept(visitor: ScreenVisitor) { - visitor.visit(self) - } +struct SettingsScreenView: View { @EnvironmentObject var navigationManager: NavigationManager @@ -30,7 +26,7 @@ struct SettingsScreenView: View, VisitableScreen { case .error(let errorMessage): SettingsErrorScreenView(errorMessage: errorMessage) { - navigationManager.navigateTo(screen: HomeScreenView()) + navigationManager.navigateTo(HomeScreenView()) } case .data: diff --git a/Podfile b/Podfile index 625387c..69bbad9 100644 --- a/Podfile +++ b/Podfile @@ -4,16 +4,6 @@ target 'demo-store-ios' do use_frameworks! pod 'REES46', :git => 'https://github.com/rees46/ios-sdk.git', :branch => 'master', :tag => '3.6.19' - pod 'SDWebImageSwiftUI' - - target 'demo-store-iosTests' do - inherit! :search_paths - # Pods for testing - end - - target 'demo-store-iosUITests' do - # Pods for testing - end end diff --git a/Podfile.lock b/Podfile.lock index 220eaee..49afd44 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,19 +1,8 @@ PODS: - REES46 (3.6.19) - - SDWebImage (5.19.4): - - SDWebImage/Core (= 5.19.4) - - SDWebImage/Core (5.19.4) - - SDWebImageSwiftUI (2.2.7): - - SDWebImage (~> 5.10) DEPENDENCIES: - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) - - SDWebImageSwiftUI - -SPEC REPOS: - trunk: - - SDWebImage - - SDWebImageSwiftUI EXTERNAL SOURCES: REES46: @@ -29,9 +18,7 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb - SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d - SDWebImageSwiftUI: 65a2c8b4b0d9577f2e11556cb163cc4613b9ee54 -PODFILE CHECKSUM: 4d55473ee53d2bc58b313538de6caff4ba97b096 +PODFILE CHECKSUM: 95734e4d6187b8b6d19278bbb7d9a6acdb94da14 COCOAPODS: 1.15.2 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 220eaee..49afd44 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,19 +1,8 @@ PODS: - REES46 (3.6.19) - - SDWebImage (5.19.4): - - SDWebImage/Core (= 5.19.4) - - SDWebImage/Core (5.19.4) - - SDWebImageSwiftUI (2.2.7): - - SDWebImage (~> 5.10) DEPENDENCIES: - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) - - SDWebImageSwiftUI - -SPEC REPOS: - trunk: - - SDWebImage - - SDWebImageSwiftUI EXTERNAL SOURCES: REES46: @@ -29,9 +18,7 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb - SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d - SDWebImageSwiftUI: 65a2c8b4b0d9577f2e11556cb163cc4613b9ee54 -PODFILE CHECKSUM: 4d55473ee53d2bc58b313538de6caff4ba97b096 +PODFILE CHECKSUM: 95734e4d6187b8b6d19278bbb7d9a6acdb94da14 COCOAPODS: 1.15.2 From cf4d4e7db80992c4202d73c651629b49e9f38e45 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Sun, 21 Jul 2024 14:37:01 +0200 Subject: [PATCH 60/85] feat: Add timer, navigation component, change set background in content view and separate data from views --- App/DemoStoreApp.swift | 16 +- App/Navigation/Data/AppState.swift | 5 + App/Navigation/Data/ScreenType.swift | 2 +- App/Navigation/Data/TabItem.swift | 2 +- .../Repository/ScreenTypeProvider.swift | 17 ++- App/Navigation/NavigationManager.swift | 33 +++- .../Presentation/View/BottomBarView.swift | 18 +-- App/Presentation/View/ContentView.swift | 38 +++-- App/Presentation/View/ToolbarView.swift | 10 +- Core/Utils/Timer.swift | 9 ++ .../Presentation/View/DetailsToolbar.swift | 16 +- .../Recommendation/ProductListItemView.swift | 13 +- .../ShortRecommendationListView.swift | 14 +- .../Presentation/View/SearchResultView.swift | 7 +- .../Presentation/View/SearchScreenView.swift | 15 +- Feature/Settings/Data/ViewState.swift | 7 + .../View/SettingsScreenView.swift | 15 +- .../Controller/LaunchScreenController.swift | 62 ++++---- .../Presentation/SplashScreenView.swift | 14 +- demo-store-ios.xcodeproj/project.pbxproj | 142 +++++++++++++----- 20 files changed, 279 insertions(+), 176 deletions(-) create mode 100644 App/Navigation/Data/AppState.swift rename App/{ => Navigation}/Presentation/View/BottomBarView.swift (68%) create mode 100644 Core/Utils/Timer.swift create mode 100644 Feature/Settings/Data/ViewState.swift diff --git a/App/DemoStoreApp.swift b/App/DemoStoreApp.swift index 823e224..a942cd1 100644 --- a/App/DemoStoreApp.swift +++ b/App/DemoStoreApp.swift @@ -2,21 +2,13 @@ import SwiftUI @main struct DemoStoreApp: App { - - @State private var showSplash = true + @StateObject private var appState = AppState() var body: some Scene { WindowGroup { - if showSplash { - LaunchScreen() - .edgesIgnoringSafeArea(.all) - .onAppear { - DispatchQueue.main.asyncAfter(deadline: .now() + 2) { - withAnimation { - showSplash = false - } - } - } + if appState.showSplash { + SplashScreenView() + .environmentObject(appState) } else { ContentView() } diff --git a/App/Navigation/Data/AppState.swift b/App/Navigation/Data/AppState.swift new file mode 100644 index 0000000..dbe6d31 --- /dev/null +++ b/App/Navigation/Data/AppState.swift @@ -0,0 +1,5 @@ +import SwiftUI + +class AppState: ObservableObject { + @Published var showSplash: Bool = true +} diff --git a/App/Navigation/Data/ScreenType.swift b/App/Navigation/Data/ScreenType.swift index 7316050..ff89507 100644 --- a/App/Navigation/Data/ScreenType.swift +++ b/App/Navigation/Data/ScreenType.swift @@ -1,7 +1,7 @@ import Foundation -enum ScreenType { +enum RootScreenType { case home case products case cart diff --git a/App/Navigation/Data/TabItem.swift b/App/Navigation/Data/TabItem.swift index c7cb146..49427e0 100644 --- a/App/Navigation/Data/TabItem.swift +++ b/App/Navigation/Data/TabItem.swift @@ -4,5 +4,5 @@ struct TabItem: Identifiable { let id = UUID() let image: String let screen: ScreenWrapper - let type: ScreenType + let type: RootScreenType } diff --git a/App/Navigation/Domain/Repository/ScreenTypeProvider.swift b/App/Navigation/Domain/Repository/ScreenTypeProvider.swift index 6466d93..f49ca4a 100644 --- a/App/Navigation/Domain/Repository/ScreenTypeProvider.swift +++ b/App/Navigation/Domain/Repository/ScreenTypeProvider.swift @@ -2,40 +2,45 @@ import Foundation import SwiftUI protocol ScreenTypeProvider { - static var screenType: ScreenType { get } + static var screenType: RootScreenType { get } } struct ScreenWrapper: Identifiable { let id = UUID() let screen: AnyView - let type: ScreenType + let type: RootScreenType? init(screen: T) where T: ScreenTypeProvider { self.screen = AnyView(screen) self.type = T.screenType } + + init(screen: AnyView, type: RootScreenType?) { + self.screen = screen + self.type = type + } } extension HomeScreenView: ScreenTypeProvider { - static var screenType: ScreenType { + static var screenType: RootScreenType { .home } } extension ProductsScreenView: ScreenTypeProvider { - static var screenType: ScreenType { + static var screenType: RootScreenType { .products } } extension CartScreenView: ScreenTypeProvider { - static var screenType: ScreenType { + static var screenType: RootScreenType { .cart } } extension SettingsScreenView: ScreenTypeProvider { - static var screenType: ScreenType { + static var screenType: RootScreenType { .settings } } diff --git a/App/Navigation/NavigationManager.swift b/App/Navigation/NavigationManager.swift index 6130063..05daaf0 100644 --- a/App/Navigation/NavigationManager.swift +++ b/App/Navigation/NavigationManager.swift @@ -5,27 +5,35 @@ class NavigationManager: ObservableObject { @Published var currentScreen: ScreenWrapper @Published var isToolbarHidden: Bool = false @Published var isBottomBarHidden: Bool = false - @Published var currentScreenType: ScreenType = .none - @Published var selectedTab: ScreenType? = .home + @Published var currentRootScreenType: RootScreenType = .home + @Published var selectedTab: RootScreenType? = .home private var screenHistory: [ScreenWrapper] = [] + // Массив экранов для табов + private let rootScreenInitializers: [RootScreenType: () -> AnyView] = [ + .home: { AnyView(HomeScreenView()) }, + .products: { AnyView(ProductsScreenView()) }, + .cart: { AnyView(CartScreenView()) }, + .settings: { AnyView(SettingsScreenView()) } + ] + init(initialScreen: ScreenWrapper) { self.currentScreen = initialScreen - self.currentScreenType = initialScreen.type + self.currentRootScreenType = initialScreen.type ?? .home self.screenHistory.append(self.currentScreen) } func navigateTo(_ screen: Screen) where Screen: ScreenTypeProvider { let screenWrapper = ScreenWrapper(screen: screen) - self.navigateTo(screen: screenWrapper) + self.navigateToRootScreen(screen: screenWrapper) } - func navigateTo(screen: ScreenWrapper, selectedTab: ScreenType? = .home) { + func navigateToRootScreen(screen: ScreenWrapper, selectedTab: RootScreenType? = .home) { self.currentScreen = screen self.selectedTab = selectedTab self.screenHistory.append(screen) - self.currentScreenType = screen.type + self.currentRootScreenType = screen.type ?? .home } func setVisibility(hideToolbar: Bool, hideBottomBar: Bool) { @@ -45,4 +53,17 @@ class NavigationManager: ObservableObject { } } } + + func rootScreen(for type: RootScreenType) -> ScreenWrapper { + guard let initializer = rootScreenInitializers[type] else { + return ScreenWrapper(screen: AnyView(EmptyView()), type: nil) + } + return ScreenWrapper(screen: initializer(), type: type) + } + + func navigateToScreen(_ view: AnyView) { + let secondaryScreen = ScreenWrapper(screen: view, type: nil) + self.currentScreen = secondaryScreen + self.screenHistory.append(secondaryScreen) + } } diff --git a/App/Presentation/View/BottomBarView.swift b/App/Navigation/Presentation/View/BottomBarView.swift similarity index 68% rename from App/Presentation/View/BottomBarView.swift rename to App/Navigation/Presentation/View/BottomBarView.swift index da0e34c..e483853 100644 --- a/App/Presentation/View/BottomBarView.swift +++ b/App/Navigation/Presentation/View/BottomBarView.swift @@ -17,21 +17,17 @@ struct BottomBarView: View { if !navigationManager.isBottomBarHidden { HStack(spacing: 0) { ForEach(tabs) { tab in - tabButton(tab) + TabBarButton(image: tab.image, isSelected: navigationManager.selectedTab == tab.type) + .onTapGesture { + navigationManager.selectedTab = tab.type + navigationManager.navigateToRootScreen(screen: tab.screen, selectedTab: tab.type) + } + .frame(maxWidth: .infinity) } } } } } - - private func tabButton(_ tab: TabItem) -> some View { - TabBarButton(image: tab.image, isSelected: navigationManager.selectedTab == tab.type) - .onTapGesture { - navigationManager.selectedTab = tab.type - navigationManager.navigateTo(screen: tab.screen, selectedTab: tab.type) - } - .padding(.horizontal, tab.type == .home || tab.type == .settings ? 20 : 0) - } } struct TabBarButton: View { @@ -40,13 +36,11 @@ struct TabBarButton: View { var body: some View { VStack { - Spacer() Image(image) .resizable() .renderingMode(.template) .frame(width: 32, height: 32) .foregroundColor(isSelected ? .white : .gray) - Spacer().frame(height: 30) } } } diff --git a/App/Presentation/View/ContentView.swift b/App/Presentation/View/ContentView.swift index dfb6b68..b8c484f 100644 --- a/App/Presentation/View/ContentView.swift +++ b/App/Presentation/View/ContentView.swift @@ -3,31 +3,27 @@ import SwiftUI struct ContentView: View { @StateObject var navigationManager = NavigationManager(initialScreen: ScreenWrapper(screen: HomeScreenView())) - + var body: some View { - ZStack { - Color.black.edgesIgnoringSafeArea(.all) + VStack(spacing: 0) { + ToolbarView() + .background(Color.black) + + navigationManager.currentScreen.screen + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .background(Color.white) - VStack(spacing: 0) { - ToolbarView() - - navigationManager.currentScreen.screen - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - .edgesIgnoringSafeArea(.bottom) - - BottomBarView() - .environmentObject(navigationManager) - .frame(height: 70) - } + BottomBarView() + .frame(height: 70) + .background(Color.black) } - .background(Color.white.edgesIgnoringSafeArea(.all)) - .statusBar(hidden: false) + .background(Color.black.edgesIgnoringSafeArea(.all)) .environmentObject(navigationManager) } } -//struct ContentView_Previews: PreviewProvider { -// static var previews: some View { -// ContentView() -// } -//} +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/App/Presentation/View/ToolbarView.swift b/App/Presentation/View/ToolbarView.swift index a0b56ba..75d7406 100644 --- a/App/Presentation/View/ToolbarView.swift +++ b/App/Presentation/View/ToolbarView.swift @@ -34,10 +34,7 @@ struct ToolbarView: View { .frame(width: 30, height: 30) .foregroundColor(.black) .onTapGesture { -// navigationManager.navigateTo( -// screen: SearchScreenView(), -// selectedTab: navigationManager.selectedTab -// ) + navigationManager.navigateToScreen(AnyView(SearchScreenView())) } Image("CartIcon") @@ -47,10 +44,7 @@ struct ToolbarView: View { .foregroundColor(.black) .padding(.trailing, 12) .onTapGesture { -// navigationManager.navigateTo( -// screen: CartScreenView(), -// selectedTab: .cart -// ) + navigationManager.navigateToScreen(AnyView(CartScreenView())) } } } diff --git a/Core/Utils/Timer.swift b/Core/Utils/Timer.swift new file mode 100644 index 0000000..23a26df --- /dev/null +++ b/Core/Utils/Timer.swift @@ -0,0 +1,9 @@ +import Foundation + +extension Timer { + static func after(_ delay: TimeInterval = 2, _ closure: @escaping () -> Void) { + Timer.scheduledTimer(withTimeInterval: delay, repeats: false) { _ in + closure() + } + } +} diff --git a/Feature/Home/Presentation/View/DetailsToolbar.swift b/Feature/Home/Presentation/View/DetailsToolbar.swift index 498e575..651c062 100644 --- a/Feature/Home/Presentation/View/DetailsToolbar.swift +++ b/Feature/Home/Presentation/View/DetailsToolbar.swift @@ -35,10 +35,10 @@ struct DetailsToolbarView: View { .frame(width: 30, height: 30) .foregroundColor(.white) .onTapGesture { -// navigationManager.navigateTo( -// screen: SearchScreenView(), -// selectedTab: navigationManager.selectedTab -// ) + navigationManager.navigateToScreen( + AnyView( + SearchScreenView()) + ) } Image("CartIcon") @@ -48,10 +48,10 @@ struct DetailsToolbarView: View { .foregroundColor(.white) .padding(.trailing, 12) .onTapGesture { -// navigationManager.navigateTo( -// screen: CartScreenView(), -// selectedTab: .cart -// ) + navigationManager.navigateToScreen( + AnyView( + CartScreenView()) + ) } } } diff --git a/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift b/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift index 23eab97..44cc38a 100644 --- a/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift +++ b/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift @@ -70,12 +70,13 @@ struct ProductListItemView: View { .cornerRadius(10) .frame(width: containerWidth, height: containerHeight) .onTapGesture { -// navigationManager.navigateTo( -// screen: ProductsScreenView( -// product: product -// ), -// selectedTab: .products -// ) + navigationManager.navigateToScreen( + AnyView( + ProductsScreenView( + product: product + ) + ) + ) } } } diff --git a/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift b/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift index 6fb2abe..0114332 100644 --- a/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift +++ b/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift @@ -8,12 +8,14 @@ struct ShortRecommendationListView: View { var body: some View { VStack(alignment: .leading) { SectionHeaderView(title: title) { -// navigationManager.navigateTo( -// screen: FullRecommendationListView( -// recommendedProducts: recommendedProducts, -// title: NSLocalizedString("reccomender_title", comment: "") -// ) -// ) + navigationManager.navigateToScreen( + AnyView( + FullRecommendationListView( + recommendedProducts: recommendedProducts, + title: NSLocalizedString("reccomender_title", comment: "") + ) + ) + ) } ScrollView(.horizontal, showsIndicators: false) { diff --git a/Feature/Search/Presentation/View/SearchResultView.swift b/Feature/Search/Presentation/View/SearchResultView.swift index 730969b..7e84456 100644 --- a/Feature/Search/Presentation/View/SearchResultView.swift +++ b/Feature/Search/Presentation/View/SearchResultView.swift @@ -42,7 +42,12 @@ struct SearchResultView: View { Button( action: { -// navigationManager.navigateTo(screen: HomeScreenView(), selectedTab: .home) + navigationManager.navigateToRootScreen( + screen: ScreenWrapper( + screen: HomeScreenView() + ), + selectedTab: .home + ) } ) { Image(systemName: "xmark") diff --git a/Feature/Search/Presentation/View/SearchScreenView.swift b/Feature/Search/Presentation/View/SearchScreenView.swift index d71c1f1..d806b38 100644 --- a/Feature/Search/Presentation/View/SearchScreenView.swift +++ b/Feature/Search/Presentation/View/SearchScreenView.swift @@ -130,13 +130,14 @@ struct SearchScreenView: View { if searchResults.productsTotal != 0 { ViewAllButton(count: searchResults.productsTotal) { let recommendedProducts = searchResults.products.map { RecommendedProduct.from(localProduct: $0) } -// navigationManager.navigateTo( -// screen: SearchResultView( -// recommendedProducts: recommendedProducts, -// count: searchResults.productsTotal -// ), -// selectedTab: nil -// ) + navigationManager.navigateToScreen( + AnyView( + SearchResultView( + recommendedProducts: recommendedProducts, + count: searchResults.productsTotal + ) + ) + ) } .padding(.bottom) } diff --git a/Feature/Settings/Data/ViewState.swift b/Feature/Settings/Data/ViewState.swift new file mode 100644 index 0000000..e19eb74 --- /dev/null +++ b/Feature/Settings/Data/ViewState.swift @@ -0,0 +1,7 @@ +import Foundation + +enum ViewState { + case loading + case error(String) + case data +} diff --git a/Feature/Settings/Presentation/View/SettingsScreenView.swift b/Feature/Settings/Presentation/View/SettingsScreenView.swift index 4c8b5a8..f9cc685 100644 --- a/Feature/Settings/Presentation/View/SettingsScreenView.swift +++ b/Feature/Settings/Presentation/View/SettingsScreenView.swift @@ -1,11 +1,5 @@ import SwiftUI -enum ViewState { - case loading - case error(String) - case data -} - struct SettingsScreenView: View { @EnvironmentObject var navigationManager: NavigationManager @@ -43,8 +37,7 @@ struct SettingsScreenView: View { } private func loadData() { - // Simulate data loading - DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + Timer.after { let success = true // Replace with actual condition to check data loading success if success { viewState = .data @@ -72,9 +65,3 @@ struct SettingsErrorScreenView: View { } } } - -struct SettingsScreenView_Previews: PreviewProvider { - static var previews: some View { - SettingsScreenView() - } -} diff --git a/Feature/Splash/Presentation/Controller/LaunchScreenController.swift b/Feature/Splash/Presentation/Controller/LaunchScreenController.swift index 4bf81a1..2bf35ba 100644 --- a/Feature/Splash/Presentation/Controller/LaunchScreenController.swift +++ b/Feature/Splash/Presentation/Controller/LaunchScreenController.swift @@ -1,31 +1,31 @@ -import SwiftUI - -struct LaunchScreen: UIViewControllerRepresentable { - func makeUIViewController(context: Context) -> UIViewController { - let viewController = UIViewController() - let splashScreenView = SplashScreenView() - - // Create UIHostingController with SplashScreenView - let hostingController = UIHostingController(rootView: splashScreenView) - - // Embedding the SwiftUI view in a UIViewController - viewController.addChild(hostingController) - viewController.view.addSubview(hostingController.view) - - // Set constraints to make SplashScreenView fill the entire screen - hostingController.view.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - hostingController.view.topAnchor.constraint(equalTo: viewController.view.topAnchor), - hostingController.view.bottomAnchor.constraint(equalTo: viewController.view.bottomAnchor), - hostingController.view.leadingAnchor.constraint(equalTo: viewController.view.leadingAnchor), - hostingController.view.trailingAnchor.constraint(equalTo: viewController.view.trailingAnchor) - ]) - hostingController.didMove(toParent: viewController) - - return viewController - } - - func updateUIViewController(_ uiViewController: UIViewController, context: Context) { - // No update needed here - } -} +//import SwiftUI +// +//struct LaunchScreen: UIViewControllerRepresentable { +// func makeUIViewController(context: Context) -> UIViewController { +// let viewController = UIViewController() +// let splashScreenView = SplashScreenView() +// +// // Create UIHostingController with SplashScreenView +// let hostingController = UIHostingController(rootView: splashScreenView) +// +// // Embedding the SwiftUI view in a UIViewController +// viewController.addChild(hostingController) +// viewController.view.addSubview(hostingController.view) +// +// // Set constraints to make SplashScreenView fill the entire screen +// hostingController.view.translatesAutoresizingMaskIntoConstraints = false +// NSLayoutConstraint.activate([ +// hostingController.view.topAnchor.constraint(equalTo: viewController.view.topAnchor), +// hostingController.view.bottomAnchor.constraint(equalTo: viewController.view.bottomAnchor), +// hostingController.view.leadingAnchor.constraint(equalTo: viewController.view.leadingAnchor), +// hostingController.view.trailingAnchor.constraint(equalTo: viewController.view.trailingAnchor) +// ]) +// hostingController.didMove(toParent: viewController) +// +// return viewController +// } +// +// func updateUIViewController(_ uiViewController: UIViewController, context: Context) { +// // No update needed here +// } +//} diff --git a/Feature/Splash/Presentation/SplashScreenView.swift b/Feature/Splash/Presentation/SplashScreenView.swift index 4edfe39..d2de2bf 100644 --- a/Feature/Splash/Presentation/SplashScreenView.swift +++ b/Feature/Splash/Presentation/SplashScreenView.swift @@ -1,21 +1,31 @@ import SwiftUI struct SplashScreenView: View { + @EnvironmentObject var appState: AppState + var body: some View { - ZStack{ + ZStack { Color.black.edgesIgnoringSafeArea(.all) Image("SplashLogo") .resizable() .scaledToFit() - .frame(width:150, height: 150) + .frame(width: 150, height: 150) .foregroundColor(.white) } + .onAppear { + Timer.after { + withAnimation { + appState.showSplash = false + } + } + } } } struct SplashScreenView_Previews: PreviewProvider { static var previews: some View { SplashScreenView() + .environmentObject(AppState()) } } diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index ce68c71..89e493f 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -17,7 +17,6 @@ 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */; }; 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; - 755944A12C35822700C274C9 /* LaunchScreenController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755944A02C35822700C274C9 /* LaunchScreenController.swift */; }; 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */; }; 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE52C3D295F007FAB88 /* SdkManager.swift */; }; @@ -51,6 +50,18 @@ 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979CB2C4973DA0081B069 /* CartResolver.swift */; }; 75E979D02C4974440081B069 /* CartListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979CF2C4974440081B069 /* CartListView.swift */; }; 75E979D42C4974660081B069 /* CartItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979D32C4974660081B069 /* CartItemView.swift */; }; + 75E979DC2C4ADD7F0081B069 /* ScreenTypeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979D82C4ADAA10081B069 /* ScreenTypeProvider.swift */; }; + 75E979DE2C4ADDD20081B069 /* ScreenType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979DD2C4ADDD20081B069 /* ScreenType.swift */; }; + 75E979E72C4AE8870081B069 /* TabItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979E62C4AE8870081B069 /* TabItem.swift */; }; + 75E979ED2C4D2BAE0081B069 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979EC2C4D2BAE0081B069 /* AppState.swift */; }; + 75E979EE2C4D2BAE0081B069 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979EC2C4D2BAE0081B069 /* AppState.swift */; }; + 75E979EF2C4D2BAE0081B069 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979EC2C4D2BAE0081B069 /* AppState.swift */; }; + 75E979F12C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; + 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; + 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; + 75E979F72C4D37940081B069 /* ViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F62C4D37940081B069 /* ViewState.swift */; }; + 75E979F82C4D37940081B069 /* ViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F62C4D37940081B069 /* ViewState.swift */; }; + 75E979F92C4D37940081B069 /* ViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F62C4D37940081B069 /* ViewState.swift */; }; 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */; }; 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; @@ -102,7 +113,6 @@ 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResponseDto.swift; sourceTree = ""; }; 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; - 755944A02C35822700C274C9 /* LaunchScreenController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchScreenController.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStoriesContainerView.swift; sourceTree = ""; }; 75674CE52C3D295F007FAB88 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; @@ -136,6 +146,12 @@ 75E979CB2C4973DA0081B069 /* CartResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartResolver.swift; sourceTree = ""; }; 75E979CF2C4974440081B069 /* CartListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartListView.swift; sourceTree = ""; }; 75E979D32C4974660081B069 /* CartItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartItemView.swift; sourceTree = ""; }; + 75E979D82C4ADAA10081B069 /* ScreenTypeProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenTypeProvider.swift; sourceTree = ""; }; + 75E979DD2C4ADDD20081B069 /* ScreenType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenType.swift; sourceTree = ""; }; + 75E979E62C4AE8870081B069 /* TabItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabItem.swift; sourceTree = ""; }; + 75E979EC2C4D2BAE0081B069 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = ""; }; + 75E979F02C4D2DBE0081B069 /* Timer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; + 75E979F62C4D37940081B069 /* ViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewState.swift; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; @@ -216,6 +232,7 @@ children = ( 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */, 75674D022C3DA14F007FAB88 /* RatingConverter.swift */, + 75E979F02C4D2DBE0081B069 /* Timer.swift */, ); path = Utils; sourceTree = ""; @@ -245,11 +262,11 @@ 75B935552C3564360063E814 /* App */ = { isa = PBXGroup; children = ( - 75A3F4212C3828A400AAC175 /* Info.plist */, + 75E979E12C4AE4630081B069 /* Presentation */, 75ECCD182C36F92A00D6D346 /* Navigation */, - 75B935562C3564360063E814 /* DemoStoreApp.swift */, - 75B935582C3564360063E814 /* ContentView.swift */, 75B9355C2C3564370063E814 /* Preview Content */, + 75B935562C3564360063E814 /* DemoStoreApp.swift */, + 75A3F4212C3828A400AAC175 /* Info.plist */, ); path = App; sourceTree = ""; @@ -321,6 +338,7 @@ 75E979A12C4956580081B069 /* Settings */ = { isa = PBXGroup; children = ( + 75E979F42C4D377F0081B069 /* Data */, 75E979BE2C495A130081B069 /* Presentation */, ); path = Settings; @@ -419,20 +437,11 @@ 75E979AD2C4957960081B069 /* Presentation */ = { isa = PBXGroup; children = ( - 75E979AE2C4957F30081B069 /* Controller */, 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */, ); path = Presentation; sourceTree = ""; }; - 75E979AE2C4957F30081B069 /* Controller */ = { - isa = PBXGroup; - children = ( - 755944A02C35822700C274C9 /* LaunchScreenController.swift */, - ); - path = Controller; - sourceTree = ""; - }; 75E979AF2C49586D0081B069 /* View */ = { isa = PBXGroup; children = ( @@ -505,7 +514,6 @@ isa = PBXGroup; children = ( 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */, - 75A3F4282C38593800AAC175 /* ToolbarView.swift */, 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */, 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */, 75674CEA2C3D2E32007FAB88 /* Stories */, @@ -523,23 +531,6 @@ path = ViewModel; sourceTree = ""; }; - 75E979B92C4959710081B069 /* Presentation */ = { - isa = PBXGroup; - children = ( - 75E979BA2C4959790081B069 /* View */, - 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */, - ); - path = Presentation; - sourceTree = ""; - }; - 75E979BA2C4959790081B069 /* View */ = { - isa = PBXGroup; - children = ( - 75ECCD192C36F94800D6D346 /* BottomBarView.swift */, - ); - path = View; - sourceTree = ""; - }; 75E979BC2C4959F50081B069 /* Presentation */ = { isa = PBXGroup; children = ( @@ -632,6 +623,73 @@ path = DI; sourceTree = ""; }; + 75E979E12C4AE4630081B069 /* Presentation */ = { + isa = PBXGroup; + children = ( + 75E979E22C4AE4790081B069 /* View */, + ); + path = Presentation; + sourceTree = ""; + }; + 75E979E22C4AE4790081B069 /* View */ = { + isa = PBXGroup; + children = ( + 75A3F4282C38593800AAC175 /* ToolbarView.swift */, + 75B935582C3564360063E814 /* ContentView.swift */, + ); + path = View; + sourceTree = ""; + }; + 75E979E32C4AE4B70081B069 /* Data */ = { + isa = PBXGroup; + children = ( + 75E979E62C4AE8870081B069 /* TabItem.swift */, + 75E979DD2C4ADDD20081B069 /* ScreenType.swift */, + 75E979EC2C4D2BAE0081B069 /* AppState.swift */, + ); + path = Data; + sourceTree = ""; + }; + 75E979E42C4AE4C20081B069 /* Domain */ = { + isa = PBXGroup; + children = ( + 75E979E52C4AE52D0081B069 /* Repository */, + ); + path = Domain; + sourceTree = ""; + }; + 75E979E52C4AE52D0081B069 /* Repository */ = { + isa = PBXGroup; + children = ( + 75E979D82C4ADAA10081B069 /* ScreenTypeProvider.swift */, + ); + path = Repository; + sourceTree = ""; + }; + 75E979EA2C4D1D040081B069 /* Presentation */ = { + isa = PBXGroup; + children = ( + 75E979EB2C4D1D0F0081B069 /* View */, + ); + path = Presentation; + sourceTree = ""; + }; + 75E979EB2C4D1D0F0081B069 /* View */ = { + isa = PBXGroup; + children = ( + 75ECCD192C36F94800D6D346 /* BottomBarView.swift */, + ); + path = View; + sourceTree = ""; + }; + 75E979F42C4D377F0081B069 /* Data */ = { + isa = PBXGroup; + children = ( + 75E979F62C4D37940081B069 /* ViewState.swift */, + ); + path = Data; + sourceTree = ""; + }; 75ECCD152C36D6B400D6D346 /* Resources */ = { isa = PBXGroup; children = ( @@ -644,7 +702,10 @@ 75ECCD182C36F92A00D6D346 /* Navigation */ = { isa = PBXGroup; children = ( - 75E979B92C4959710081B069 /* Presentation */, + 75E979EA2C4D1D040081B069 /* Presentation */, + 75E979E42C4AE4C20081B069 /* Domain */, + 75E979E32C4AE4B70081B069 /* Data */, + 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */, ); path = Navigation; sourceTree = ""; @@ -883,9 +944,10 @@ 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */, 75674CF72C3D92E0007FAB88 /* RecommendedProductDto.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, + 75E979E72C4AE8870081B069 /* TabItem.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */, - 755944A12C35822700C274C9 /* LaunchScreenController.swift in Sources */, + 75E979DE2C4ADDD20081B069 /* ScreenType.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */, @@ -903,12 +965,16 @@ 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */, 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */, + 75E979F12C4D2DBE0081B069 /* Timer.swift in Sources */, + 75E979F72C4D37940081B069 /* ViewState.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, 75E979D02C4974440081B069 /* CartListView.swift in Sources */, 75E979D42C4974660081B069 /* CartItemView.swift in Sources */, + 75E979DC2C4ADD7F0081B069 /* ScreenTypeProvider.swift in Sources */, 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */, + 75E979ED2C4D2BAE0081B069 /* AppState.swift in Sources */, 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, @@ -920,6 +986,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75E979EE2C4D2BAE0081B069 /* AppState.swift in Sources */, + 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */, + 75E979F82C4D37940081B069 /* ViewState.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -927,6 +996,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75E979EF2C4D2BAE0081B069 /* AppState.swift in Sources */, + 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */, + 75E979F92C4D37940081B069 /* ViewState.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1069,6 +1141,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C20BDB80283375AFE665FF96 /* Pods-demo-store-ios.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; @@ -1099,6 +1172,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = AC654F53174F1754F6E72BDB /* Pods-demo-store-ios.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; From 36001ddbba56345201e65625ae587f636525cf91 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Sun, 21 Jul 2024 14:40:10 +0200 Subject: [PATCH 61/85] feat: Add timer to others screens --- Feature/Cart/Presentation/View/CartScreenView.swift | 2 +- Feature/Home/Presentation/View/HomeScreenView.swift | 2 +- Feature/Product/Presentation/View/ProductsScreenView.swift | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Feature/Cart/Presentation/View/CartScreenView.swift b/Feature/Cart/Presentation/View/CartScreenView.swift index 1e81213..33042cf 100644 --- a/Feature/Cart/Presentation/View/CartScreenView.swift +++ b/Feature/Cart/Presentation/View/CartScreenView.swift @@ -31,7 +31,7 @@ struct CartScreenView: View { ProgressView() .progressViewStyle(CircularProgressViewStyle()) .onAppear { - DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + Timer.after { isLoading = false } } diff --git a/Feature/Home/Presentation/View/HomeScreenView.swift b/Feature/Home/Presentation/View/HomeScreenView.swift index d915e42..1e373b0 100644 --- a/Feature/Home/Presentation/View/HomeScreenView.swift +++ b/Feature/Home/Presentation/View/HomeScreenView.swift @@ -19,7 +19,7 @@ struct HomeScreenView: View { ProgressView() .progressViewStyle(CircularProgressViewStyle()) .onAppear { - DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + Timer.after { isLoading = false } } diff --git a/Feature/Product/Presentation/View/ProductsScreenView.swift b/Feature/Product/Presentation/View/ProductsScreenView.swift index e01e681..72acc71 100644 --- a/Feature/Product/Presentation/View/ProductsScreenView.swift +++ b/Feature/Product/Presentation/View/ProductsScreenView.swift @@ -6,7 +6,6 @@ struct ProductsScreenView: View { @EnvironmentObject var navigationManager: NavigationManager @ObservedObject var viewModel = HomeViewModel() - @State private var selectedImageIndex = 0 @State private var isLoading = true @State private var counter = 1 @@ -19,7 +18,7 @@ struct ProductsScreenView: View { ProgressView() .progressViewStyle(CircularProgressViewStyle()) .onAppear { - DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + Timer.after { isLoading = false } } @@ -208,7 +207,7 @@ struct ProductsScreenView: View { title: NSLocalizedString("recommend_like_title", comment: "") ) .onAppear { - viewModel.loadRecommenderRecommendations( currentProductId: "665") + viewModel.loadRecommenderRecommendations(currentProductId: "665") } Spacer().frame(height: 36) From 970aa18614dd6df9498b4021e3e5fb10cc214e9d Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Sun, 21 Jul 2024 14:53:56 +0200 Subject: [PATCH 62/85] fix: Remove useless func --- App/Navigation/NavigationManager.swift | 26 ++++--------------- .../View/SettingsScreenView.swift | 7 ++++- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/App/Navigation/NavigationManager.swift b/App/Navigation/NavigationManager.swift index 05daaf0..34868c1 100644 --- a/App/Navigation/NavigationManager.swift +++ b/App/Navigation/NavigationManager.swift @@ -24,11 +24,6 @@ class NavigationManager: ObservableObject { self.screenHistory.append(self.currentScreen) } - func navigateTo(_ screen: Screen) where Screen: ScreenTypeProvider { - let screenWrapper = ScreenWrapper(screen: screen) - self.navigateToRootScreen(screen: screenWrapper) - } - func navigateToRootScreen(screen: ScreenWrapper, selectedTab: RootScreenType? = .home) { self.currentScreen = screen self.selectedTab = selectedTab @@ -36,15 +31,6 @@ class NavigationManager: ObservableObject { self.currentRootScreenType = screen.type ?? .home } - func setVisibility(hideToolbar: Bool, hideBottomBar: Bool) { - self.isToolbarHidden = hideToolbar - self.isBottomBarHidden = hideBottomBar - } - - func resetSelection() { - self.selectedTab = nil - } - func navigateBack() { if screenHistory.count > 1 { screenHistory.removeLast() @@ -54,16 +40,14 @@ class NavigationManager: ObservableObject { } } - func rootScreen(for type: RootScreenType) -> ScreenWrapper { - guard let initializer = rootScreenInitializers[type] else { - return ScreenWrapper(screen: AnyView(EmptyView()), type: nil) - } - return ScreenWrapper(screen: initializer(), type: type) - } - func navigateToScreen(_ view: AnyView) { let secondaryScreen = ScreenWrapper(screen: view, type: nil) self.currentScreen = secondaryScreen self.screenHistory.append(secondaryScreen) } + + func setVisibility(hideToolbar: Bool, hideBottomBar: Bool) { + self.isToolbarHidden = hideToolbar + self.isBottomBarHidden = hideBottomBar + } } diff --git a/Feature/Settings/Presentation/View/SettingsScreenView.swift b/Feature/Settings/Presentation/View/SettingsScreenView.swift index f9cc685..6b7e00e 100644 --- a/Feature/Settings/Presentation/View/SettingsScreenView.swift +++ b/Feature/Settings/Presentation/View/SettingsScreenView.swift @@ -20,7 +20,12 @@ struct SettingsScreenView: View { case .error(let errorMessage): SettingsErrorScreenView(errorMessage: errorMessage) { - navigationManager.navigateTo(HomeScreenView()) + navigationManager.navigateToRootScreen( + screen: ScreenWrapper( + screen: HomeScreenView() + ), + selectedTab: .home + ) } case .data: From 9bddc9c536f758b9be156a158216b399f9e920ad Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Sun, 21 Jul 2024 23:26:56 +0200 Subject: [PATCH 63/85] refactor: Remove comments --- App/Navigation/NavigationManager.swift | 1 - Feature/Settings/Presentation/View/SettingsScreenView.swift | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/App/Navigation/NavigationManager.swift b/App/Navigation/NavigationManager.swift index 34868c1..fa0e186 100644 --- a/App/Navigation/NavigationManager.swift +++ b/App/Navigation/NavigationManager.swift @@ -10,7 +10,6 @@ class NavigationManager: ObservableObject { private var screenHistory: [ScreenWrapper] = [] - // Массив экранов для табов private let rootScreenInitializers: [RootScreenType: () -> AnyView] = [ .home: { AnyView(HomeScreenView()) }, .products: { AnyView(ProductsScreenView()) }, diff --git a/Feature/Settings/Presentation/View/SettingsScreenView.swift b/Feature/Settings/Presentation/View/SettingsScreenView.swift index 6b7e00e..253e093 100644 --- a/Feature/Settings/Presentation/View/SettingsScreenView.swift +++ b/Feature/Settings/Presentation/View/SettingsScreenView.swift @@ -43,7 +43,7 @@ struct SettingsScreenView: View { private func loadData() { Timer.after { - let success = true // Replace with actual condition to check data loading success + let success = true if success { viewState = .data } else { From bbcd377cff301ca6b244f80cbcc5d886d80ac6e2 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 23 Jul 2024 19:57:57 +0200 Subject: [PATCH 64/85] refactor: The location of files in the project directory has been changed & remove IDE comments --- .../RootScreenType.enum.swift} | 0 App/{Navigation/Data => Models}/TabItem.swift | 0 .../Models/ViewState.enum.swift | 0 .../Repository/ScreenTypeProvider.swift | 46 --- .../Protocols/ScreenTypeProvider.swift | 5 + .../Data => ViewModels}/AppState.swift | 0 .../NavigationManager.swift | 0 .../BottomBar}/BottomBarView.swift | 0 .../View => Views}/ContentView.swift | 0 .../Views/Screens}/CartScreenView.swift | 7 + .../Views/Screens}/HomeScreenView.swift | 18 +- .../Views/Screens}/ProductsScreenView.swift | 7 + App/Views/Screens/ScreenWrapper.swift | 18 + .../Views/Screens}/SettingsScreenView.swift | 7 + .../Views/Screens}/SplashScreenView.swift | 0 .../Views/ToolBar/DetailsToolbarView.swift | 0 .../View => Views/ToolBar}/ToolbarView.swift | 0 Core/Core.h | 9 - ...tItemView.swift => CartListItemView.swift} | 2 +- .../Cart/Presentation/View/CartListView.swift | 2 +- Feature/Feature.h | 9 - .../ListDiscoverProductsView.swift} | 6 +- .../FullRecommendationListView.swift | 0 .../ShortRecommendationListView.swift | 0 .../StoriesViewController.swift | 0 .../View}/ProductListItemView.swift | 0 .../Mapper/RecommendedProductMapper.swift | 38 ++ .../Mapper/SearchProductResponseMapper.swift | 92 +++++ .../Search/Data/Model/SearchCategory.swift | 9 + .../Data/Model/SearchFashionColor.swift | 6 + .../Search/Data/Model/SearchFashionSize.swift | 6 + Feature/Search/Data/Model/SearchFilter.swift | 6 + .../Data/Model/SearchIndustrialFilters.swift | 6 + .../Search/Data/Model/SearchPriceRange.swift | 6 + Feature/Search/Data/Model/SearchProduct.swift | 29 ++ .../Data/Model/SearchProductResponse.swift | 14 + Feature/Search/Data/Model/SearchQuery.swift | 7 + .../Search/Data/Model/SearchRedirect.swift | 8 + .../Search/Data/Model/SearchResponseDto.swift | 221 ----------- Feature/Search/Data/Model/SearchSuggest.swift | 7 + .../Presentation/View/SearchScreenView.swift | 2 +- .../ViewModel/SearchViewModel.swift | 4 +- Pods/Pods.xcodeproj/project.pbxproj | 9 +- demo-store-ios.xcodeproj/project.pbxproj | 348 ++++++++++-------- 44 files changed, 495 insertions(+), 459 deletions(-) rename App/{Navigation/Data/ScreenType.swift => Models/RootScreenType.enum.swift} (100%) rename App/{Navigation/Data => Models}/TabItem.swift (100%) rename Feature/Settings/Data/ViewState.swift => App/Models/ViewState.enum.swift (100%) delete mode 100644 App/Navigation/Domain/Repository/ScreenTypeProvider.swift create mode 100644 App/Navigation/Protocols/ScreenTypeProvider.swift rename App/{Navigation/Data => ViewModels}/AppState.swift (100%) rename App/{Navigation => ViewModels}/NavigationManager.swift (100%) rename App/{Navigation/Presentation/View => Views/BottomBar}/BottomBarView.swift (100%) rename App/{Presentation/View => Views}/ContentView.swift (100%) rename {Feature/Cart/Presentation/View => App/Views/Screens}/CartScreenView.swift (97%) rename {Feature/Home/Presentation/View => App/Views/Screens}/HomeScreenView.swift (86%) rename {Feature/Product/Presentation/View => App/Views/Screens}/ProductsScreenView.swift (98%) create mode 100644 App/Views/Screens/ScreenWrapper.swift rename {Feature/Settings/Presentation/View => App/Views/Screens}/SettingsScreenView.swift (93%) rename {Feature/Splash/Presentation => App/Views/Screens}/SplashScreenView.swift (100%) rename Feature/Home/Presentation/View/DetailsToolbar.swift => App/Views/ToolBar/DetailsToolbarView.swift (100%) rename App/{Presentation/View => Views/ToolBar}/ToolbarView.swift (100%) rename Feature/Cart/Presentation/View/{CartItemView.swift => CartListItemView.swift} (98%) rename Feature/Home/Presentation/View/{Discover/MainDiscoverView.swift => ListDiscoverProducts/ListDiscoverProductsView.swift} (95%) rename Feature/Home/Presentation/View/{Recommendation => ListRecommendation}/FullRecommendationListView.swift (100%) rename Feature/Home/Presentation/View/{Recommendation => ListRecommendation}/ShortRecommendationListView.swift (100%) rename Feature/Home/Presentation/View/Stories/{Controller => }/StoriesViewController.swift (100%) rename Feature/{Home/Presentation/View/Recommendation => Product/Presentation/View}/ProductListItemView.swift (100%) create mode 100644 Feature/Search/Data/Mapper/RecommendedProductMapper.swift create mode 100644 Feature/Search/Data/Mapper/SearchProductResponseMapper.swift create mode 100644 Feature/Search/Data/Model/SearchCategory.swift create mode 100644 Feature/Search/Data/Model/SearchFashionColor.swift create mode 100644 Feature/Search/Data/Model/SearchFashionSize.swift create mode 100644 Feature/Search/Data/Model/SearchFilter.swift create mode 100644 Feature/Search/Data/Model/SearchIndustrialFilters.swift create mode 100644 Feature/Search/Data/Model/SearchPriceRange.swift create mode 100644 Feature/Search/Data/Model/SearchProduct.swift create mode 100644 Feature/Search/Data/Model/SearchProductResponse.swift create mode 100644 Feature/Search/Data/Model/SearchQuery.swift create mode 100644 Feature/Search/Data/Model/SearchRedirect.swift delete mode 100644 Feature/Search/Data/Model/SearchResponseDto.swift create mode 100644 Feature/Search/Data/Model/SearchSuggest.swift diff --git a/App/Navigation/Data/ScreenType.swift b/App/Models/RootScreenType.enum.swift similarity index 100% rename from App/Navigation/Data/ScreenType.swift rename to App/Models/RootScreenType.enum.swift diff --git a/App/Navigation/Data/TabItem.swift b/App/Models/TabItem.swift similarity index 100% rename from App/Navigation/Data/TabItem.swift rename to App/Models/TabItem.swift diff --git a/Feature/Settings/Data/ViewState.swift b/App/Models/ViewState.enum.swift similarity index 100% rename from Feature/Settings/Data/ViewState.swift rename to App/Models/ViewState.enum.swift diff --git a/App/Navigation/Domain/Repository/ScreenTypeProvider.swift b/App/Navigation/Domain/Repository/ScreenTypeProvider.swift deleted file mode 100644 index f49ca4a..0000000 --- a/App/Navigation/Domain/Repository/ScreenTypeProvider.swift +++ /dev/null @@ -1,46 +0,0 @@ -import Foundation -import SwiftUI - -protocol ScreenTypeProvider { - static var screenType: RootScreenType { get } -} - -struct ScreenWrapper: Identifiable { - let id = UUID() - let screen: AnyView - let type: RootScreenType? - - init(screen: T) where T: ScreenTypeProvider { - self.screen = AnyView(screen) - self.type = T.screenType - } - - init(screen: AnyView, type: RootScreenType?) { - self.screen = screen - self.type = type - } -} - -extension HomeScreenView: ScreenTypeProvider { - static var screenType: RootScreenType { - .home - } -} - -extension ProductsScreenView: ScreenTypeProvider { - static var screenType: RootScreenType { - .products - } -} - -extension CartScreenView: ScreenTypeProvider { - static var screenType: RootScreenType { - .cart - } -} - -extension SettingsScreenView: ScreenTypeProvider { - static var screenType: RootScreenType { - .settings - } -} diff --git a/App/Navigation/Protocols/ScreenTypeProvider.swift b/App/Navigation/Protocols/ScreenTypeProvider.swift new file mode 100644 index 0000000..87375d5 --- /dev/null +++ b/App/Navigation/Protocols/ScreenTypeProvider.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol ScreenTypeProvider { + static var screenType: RootScreenType { get } +} diff --git a/App/Navigation/Data/AppState.swift b/App/ViewModels/AppState.swift similarity index 100% rename from App/Navigation/Data/AppState.swift rename to App/ViewModels/AppState.swift diff --git a/App/Navigation/NavigationManager.swift b/App/ViewModels/NavigationManager.swift similarity index 100% rename from App/Navigation/NavigationManager.swift rename to App/ViewModels/NavigationManager.swift diff --git a/App/Navigation/Presentation/View/BottomBarView.swift b/App/Views/BottomBar/BottomBarView.swift similarity index 100% rename from App/Navigation/Presentation/View/BottomBarView.swift rename to App/Views/BottomBar/BottomBarView.swift diff --git a/App/Presentation/View/ContentView.swift b/App/Views/ContentView.swift similarity index 100% rename from App/Presentation/View/ContentView.swift rename to App/Views/ContentView.swift diff --git a/Feature/Cart/Presentation/View/CartScreenView.swift b/App/Views/Screens/CartScreenView.swift similarity index 97% rename from Feature/Cart/Presentation/View/CartScreenView.swift rename to App/Views/Screens/CartScreenView.swift index 33042cf..8b13498 100644 --- a/Feature/Cart/Presentation/View/CartScreenView.swift +++ b/App/Views/Screens/CartScreenView.swift @@ -1,4 +1,11 @@ import SwiftUI +import Foundation + +extension CartScreenView: ScreenTypeProvider { + static var screenType: RootScreenType { + .cart + } +} struct CartScreenView: View { diff --git a/Feature/Home/Presentation/View/HomeScreenView.swift b/App/Views/Screens/HomeScreenView.swift similarity index 86% rename from Feature/Home/Presentation/View/HomeScreenView.swift rename to App/Views/Screens/HomeScreenView.swift index 1e373b0..7588c5f 100644 --- a/Feature/Home/Presentation/View/HomeScreenView.swift +++ b/App/Views/Screens/HomeScreenView.swift @@ -1,4 +1,11 @@ import SwiftUI +import Foundation + +extension HomeScreenView: ScreenTypeProvider { + static var screenType: RootScreenType { + .home + } +} struct HomeScreenView: View { @@ -25,27 +32,32 @@ struct HomeScreenView: View { } .frame(height: 250) } else { - MainDiscoverView() + + ListDiscoverProductsView() + HomeStoriesContainerView() + ShortRecommendationListView( recommendedProducts: viewModel.arrivalsProducts, title: NSLocalizedString("arrivals_title", comment: "") - ) - .onAppear { + ).onAppear { viewModel.loadArrivalsRecommendations(currentProductId: "670") } + ShortRecommendationListView( recommendedProducts: viewModel.topTrendProducts, title: NSLocalizedString("top_trend_title", comment: "") ).onAppear { viewModel.loadTopTrendRecommendations(currentProductId: "656") } + ShortRecommendationListView( recommendedProducts: viewModel.recommenderProducts, title: NSLocalizedString("reccomender_title", comment: "") ).onAppear { viewModel.loadRecommenderRecommendations(currentProductId: "651") } + } } .padding(.vertical, 16) diff --git a/Feature/Product/Presentation/View/ProductsScreenView.swift b/App/Views/Screens/ProductsScreenView.swift similarity index 98% rename from Feature/Product/Presentation/View/ProductsScreenView.swift rename to App/Views/Screens/ProductsScreenView.swift index 72acc71..cb9c290 100644 --- a/Feature/Product/Presentation/View/ProductsScreenView.swift +++ b/App/Views/Screens/ProductsScreenView.swift @@ -1,4 +1,11 @@ import SwiftUI +import Foundation + +extension ProductsScreenView: ScreenTypeProvider { + static var screenType: RootScreenType { + .products + } +} struct ProductsScreenView: View { diff --git a/App/Views/Screens/ScreenWrapper.swift b/App/Views/Screens/ScreenWrapper.swift new file mode 100644 index 0000000..1335075 --- /dev/null +++ b/App/Views/Screens/ScreenWrapper.swift @@ -0,0 +1,18 @@ +import Foundation +import SwiftUI + +struct ScreenWrapper: Identifiable { + let id = UUID() + let screen: AnyView + let type: RootScreenType? + + init(screen: T) where T: ScreenTypeProvider { + self.screen = AnyView(screen) + self.type = T.screenType + } + + init(screen: AnyView, type: RootScreenType?) { + self.screen = screen + self.type = type + } +} diff --git a/Feature/Settings/Presentation/View/SettingsScreenView.swift b/App/Views/Screens/SettingsScreenView.swift similarity index 93% rename from Feature/Settings/Presentation/View/SettingsScreenView.swift rename to App/Views/Screens/SettingsScreenView.swift index 253e093..6adedaa 100644 --- a/Feature/Settings/Presentation/View/SettingsScreenView.swift +++ b/App/Views/Screens/SettingsScreenView.swift @@ -1,4 +1,11 @@ import SwiftUI +import Foundation + +extension SettingsScreenView: ScreenTypeProvider { + static var screenType: RootScreenType { + .settings + } +} struct SettingsScreenView: View { diff --git a/Feature/Splash/Presentation/SplashScreenView.swift b/App/Views/Screens/SplashScreenView.swift similarity index 100% rename from Feature/Splash/Presentation/SplashScreenView.swift rename to App/Views/Screens/SplashScreenView.swift diff --git a/Feature/Home/Presentation/View/DetailsToolbar.swift b/App/Views/ToolBar/DetailsToolbarView.swift similarity index 100% rename from Feature/Home/Presentation/View/DetailsToolbar.swift rename to App/Views/ToolBar/DetailsToolbarView.swift diff --git a/App/Presentation/View/ToolbarView.swift b/App/Views/ToolBar/ToolbarView.swift similarity index 100% rename from App/Presentation/View/ToolbarView.swift rename to App/Views/ToolBar/ToolbarView.swift diff --git a/Core/Core.h b/Core/Core.h index b35997f..155c269 100644 --- a/Core/Core.h +++ b/Core/Core.h @@ -1,10 +1,3 @@ -// -// Core.h -// Core -// -// Created by Daniel Green on 2024-07-18. -// - #import //! Project version number for Core. @@ -14,5 +7,3 @@ FOUNDATION_EXPORT double CoreVersionNumber; FOUNDATION_EXPORT const unsigned char CoreVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/Feature/Cart/Presentation/View/CartItemView.swift b/Feature/Cart/Presentation/View/CartListItemView.swift similarity index 98% rename from Feature/Cart/Presentation/View/CartItemView.swift rename to Feature/Cart/Presentation/View/CartListItemView.swift index 5b17f2e..39a8e27 100644 --- a/Feature/Cart/Presentation/View/CartItemView.swift +++ b/Feature/Cart/Presentation/View/CartListItemView.swift @@ -1,7 +1,7 @@ import SwiftUI -struct CartItemView: View { +struct CartListItemView: View { var cartItem: ProductCartItem var removeFromCart: () -> Void diff --git a/Feature/Cart/Presentation/View/CartListView.swift b/Feature/Cart/Presentation/View/CartListView.swift index fc88acc..02706c2 100644 --- a/Feature/Cart/Presentation/View/CartListView.swift +++ b/Feature/Cart/Presentation/View/CartListView.swift @@ -7,7 +7,7 @@ struct CartListView: View { var body: some View { List { ForEach(cartItems) { cartItem in - CartItemView( + CartListItemView( cartItem: cartItem, removeFromCart: { removeFromCart(cartItem.product.id) diff --git a/Feature/Feature.h b/Feature/Feature.h index c766412..5f65f7c 100644 --- a/Feature/Feature.h +++ b/Feature/Feature.h @@ -1,10 +1,3 @@ -// -// Feature.h -// Feature -// -// Created by Daniel Green on 2024-07-18. -// - #import //! Project version number for Feature. @@ -14,5 +7,3 @@ FOUNDATION_EXPORT double FeatureVersionNumber; FOUNDATION_EXPORT const unsigned char FeatureVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/Feature/Home/Presentation/View/Discover/MainDiscoverView.swift b/Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.swift similarity index 95% rename from Feature/Home/Presentation/View/Discover/MainDiscoverView.swift rename to Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.swift index 24ed121..539e5ec 100644 --- a/Feature/Home/Presentation/View/Discover/MainDiscoverView.swift +++ b/Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.swift @@ -6,7 +6,7 @@ struct ImageItem { let count: Int } -struct MainDiscoverView: View { +struct ListDiscoverProductsView: View { let imageItems: [ImageItem] = [ ImageItem(urlString: "https://m.media-amazon.com/images/I/71qqPTyiatS._AC_UY580_.jpg", type: "Summer style", count: 10), ImageItem(urlString: "https://ankerliebe.com/wp-content/uploads/2022/10/6f147a6d-b07c-43b9-9185-74516049e68a.jpg", type: "Evening style", count: 5), @@ -58,8 +58,8 @@ struct MainDiscoverView: View { } } -struct MainDiscoverView_Previews: PreviewProvider { +struct ListDiscoverProductsView_Previews: PreviewProvider { static var previews: some View { - MainDiscoverView() + ListDiscoverProductsView() } } diff --git a/Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift b/Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.swift similarity index 100% rename from Feature/Home/Presentation/View/Recommendation/FullRecommendationListView.swift rename to Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.swift diff --git a/Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift b/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.swift similarity index 100% rename from Feature/Home/Presentation/View/Recommendation/ShortRecommendationListView.swift rename to Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.swift diff --git a/Feature/Home/Presentation/View/Stories/Controller/StoriesViewController.swift b/Feature/Home/Presentation/View/Stories/StoriesViewController.swift similarity index 100% rename from Feature/Home/Presentation/View/Stories/Controller/StoriesViewController.swift rename to Feature/Home/Presentation/View/Stories/StoriesViewController.swift diff --git a/Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift b/Feature/Product/Presentation/View/ProductListItemView.swift similarity index 100% rename from Feature/Home/Presentation/View/Recommendation/ProductListItemView.swift rename to Feature/Product/Presentation/View/ProductListItemView.swift diff --git a/Feature/Search/Data/Mapper/RecommendedProductMapper.swift b/Feature/Search/Data/Mapper/RecommendedProductMapper.swift new file mode 100644 index 0000000..c042f4a --- /dev/null +++ b/Feature/Search/Data/Mapper/RecommendedProductMapper.swift @@ -0,0 +1,38 @@ +import Foundation + +extension RecommendedProduct { + static func from(product: SearchProduct) -> RecommendedProduct { + return RecommendedProduct( + id: product.id, + barcode: product.barcode, + name: product.name, + brand: product.brand, + model: product.model, + description: product.description, + imageUrl: product.imageUrl, + resizedImageUrl: product.resizedImageUrl, + url: product.url, + deeplinkIos: product.deeplinkIos, + categories: [], + locations: [], + price: product.price, + priceFormatted: product.priceFormatted, + priceFull: product.priceFull, + priceFullFormatted: product.priceFullFormatted, + oldPrice: product.oldPrice, + oldPriceFormatted: product.oldPriceFormatted, + oldPriceFull: product.oldPriceFull, + oldPriceFullFormatted: product.oldPriceFullFormatted, + currency: product.currency, + salesRate: product.salesRate, + discount: product.discount, + rating: Int(product.relativeSalesRate), + relativeSalesRate: product.relativeSalesRate, + paramsRaw: product.params, + fashionOriginalSizes: [], + fashionSizes: [], + fashionColors: [], + resizedImages: product.resizedImages + ) + } +} diff --git a/Feature/Search/Data/Mapper/SearchProductResponseMapper.swift b/Feature/Search/Data/Mapper/SearchProductResponseMapper.swift new file mode 100644 index 0000000..02ef1d6 --- /dev/null +++ b/Feature/Search/Data/Mapper/SearchProductResponseMapper.swift @@ -0,0 +1,92 @@ +import Foundation +import REES46 + +extension SearchProductResponse { + static func from(_ response: SearchResponse) -> SearchProductResponse { + return SearchProductResponse( + categories: response.categories.map { category in + SearchCategory( + id: category.id, + name: category.name, + url: category.url, + alias: category.alias, + parentId: category.parentId + ) + }, + products: response.products.map { product in + SearchProduct( + id: product.id, + barcode: product.barcode, + name: product.name, + brand: product.brand, + model: product.model, + description: product.description, + imageUrl: product.imageUrl, + resizedImageUrl: product.resizedImageUrl, + resizedImages: product.resizedImages, + url: product.url, + deeplinkIos: product.deeplinkIos, + price: product.price, + priceFormatted: product.priceFormatted, + priceFull: product.priceFull, + priceFullFormatted: product.priceFullFormatted, + oldPrice: product.oldPrice, + oldPriceFormatted: product.oldPriceFormatted, + oldPriceFull: product.oldPriceFull, + oldPriceFullFormatted: product.oldPriceFullFormatted, + currency: product.currency, + salesRate: product.salesRate, + discount: product.discount, + relativeSalesRate: product.relativeSalesRate, + isNew: product.isNew, + params: product.params + ) + }, + productsTotal: response.productsTotal, + queries: response.queries.map { query in + SearchQuery( + name: query.name, + url: query.url, + deeplinkIos: query.deeplinkIos + ) + }, + filters: response.filters?.mapValues { filter in + SearchFilter( + count: filter.count, + values: filter.values + ) + }, + industrialFilters: response.industrialFilters.map { filters in + SearchIndustrialFilters( + fashionSizes: filters.fashionSizes.map { size in + SearchFashionSize( + count: size.count, + size: size.size + ) + }, + fashionColors: filters.fashionColors.map { color in + SearchFashionColor( + count: color.count, + color: color.color + ) + } + ) + }, + brands: response.brands, + priceRange: response.priceRange.map { range in + SearchPriceRange( + min: range.min, + max: range.max + ) + }, + redirect: response.redirect.map { redirect in + SearchRedirect( + query: redirect.query, + redirectUrl: redirect.redirectUrl, + deeplink: redirect.deeplink, + deeplinkIos: redirect.deeplinkIos + ) + } + ) + } +} diff --git a/Feature/Search/Data/Model/SearchCategory.swift b/Feature/Search/Data/Model/SearchCategory.swift new file mode 100644 index 0000000..3f66564 --- /dev/null +++ b/Feature/Search/Data/Model/SearchCategory.swift @@ -0,0 +1,9 @@ +import Foundation + +struct SearchCategory { + let id: String + let name: String + let url: String? + let alias: String? + let parentId: String? +} diff --git a/Feature/Search/Data/Model/SearchFashionColor.swift b/Feature/Search/Data/Model/SearchFashionColor.swift new file mode 100644 index 0000000..0487ea8 --- /dev/null +++ b/Feature/Search/Data/Model/SearchFashionColor.swift @@ -0,0 +1,6 @@ +import Foundation + +struct SearchFashionColor { + let count: Int + let color: String +} diff --git a/Feature/Search/Data/Model/SearchFashionSize.swift b/Feature/Search/Data/Model/SearchFashionSize.swift new file mode 100644 index 0000000..336a700 --- /dev/null +++ b/Feature/Search/Data/Model/SearchFashionSize.swift @@ -0,0 +1,6 @@ +import Foundation + +struct SearchFashionSize { + let count: Int + let size: String +} diff --git a/Feature/Search/Data/Model/SearchFilter.swift b/Feature/Search/Data/Model/SearchFilter.swift new file mode 100644 index 0000000..2b09861 --- /dev/null +++ b/Feature/Search/Data/Model/SearchFilter.swift @@ -0,0 +1,6 @@ +import Foundation + +struct SearchFilter { + let count: Int + let values: [String: Int] +} diff --git a/Feature/Search/Data/Model/SearchIndustrialFilters.swift b/Feature/Search/Data/Model/SearchIndustrialFilters.swift new file mode 100644 index 0000000..4ea201a --- /dev/null +++ b/Feature/Search/Data/Model/SearchIndustrialFilters.swift @@ -0,0 +1,6 @@ +import Foundation + +struct SearchIndustrialFilters { + let fashionSizes: [SearchFashionSize] + let fashionColors: [SearchFashionColor] +} diff --git a/Feature/Search/Data/Model/SearchPriceRange.swift b/Feature/Search/Data/Model/SearchPriceRange.swift new file mode 100644 index 0000000..691fbe2 --- /dev/null +++ b/Feature/Search/Data/Model/SearchPriceRange.swift @@ -0,0 +1,6 @@ +import Foundation + +struct SearchPriceRange { + let min: Double + let max: Double +} diff --git a/Feature/Search/Data/Model/SearchProduct.swift b/Feature/Search/Data/Model/SearchProduct.swift new file mode 100644 index 0000000..f38f384 --- /dev/null +++ b/Feature/Search/Data/Model/SearchProduct.swift @@ -0,0 +1,29 @@ +import Foundation + +struct SearchProduct: Identifiable { + let id: String + let barcode: String + let name: String + let brand: String + let model: String + let description: String + let imageUrl: String + let resizedImageUrl: String + let resizedImages: [String: String] + let url: String + let deeplinkIos: String + let price: Double + let priceFormatted: String + let priceFull: Double + let priceFullFormatted: String + let oldPrice: Double + let oldPriceFormatted: String + let oldPriceFull: Double + let oldPriceFullFormatted: String + let currency: String + let salesRate: Int + let discount: Int + let relativeSalesRate: Float + let isNew: Bool? + let params: [[String: Any]]? +} diff --git a/Feature/Search/Data/Model/SearchProductResponse.swift b/Feature/Search/Data/Model/SearchProductResponse.swift new file mode 100644 index 0000000..acaac86 --- /dev/null +++ b/Feature/Search/Data/Model/SearchProductResponse.swift @@ -0,0 +1,14 @@ +import Foundation +import REES46 + +struct SearchProductResponse { + let categories: [SearchCategory] + let products: [SearchProduct] + let productsTotal: Int + let queries: [SearchQuery] + let filters: [String: SearchFilter]? + let industrialFilters: SearchIndustrialFilters? + let brands: [String]? + let priceRange: SearchPriceRange? + let redirect: SearchRedirect? +} diff --git a/Feature/Search/Data/Model/SearchQuery.swift b/Feature/Search/Data/Model/SearchQuery.swift new file mode 100644 index 0000000..b299e5a --- /dev/null +++ b/Feature/Search/Data/Model/SearchQuery.swift @@ -0,0 +1,7 @@ +import Foundation + +struct SearchQuery { + let name: String + let url: String + let deeplinkIos: String +} diff --git a/Feature/Search/Data/Model/SearchRedirect.swift b/Feature/Search/Data/Model/SearchRedirect.swift new file mode 100644 index 0000000..40ebf9d --- /dev/null +++ b/Feature/Search/Data/Model/SearchRedirect.swift @@ -0,0 +1,8 @@ +import Foundation + +struct SearchRedirect { + let query: String + let redirectUrl: String + let deeplink: String? + let deeplinkIos: String? +} diff --git a/Feature/Search/Data/Model/SearchResponseDto.swift b/Feature/Search/Data/Model/SearchResponseDto.swift deleted file mode 100644 index a05da0d..0000000 --- a/Feature/Search/Data/Model/SearchResponseDto.swift +++ /dev/null @@ -1,221 +0,0 @@ -import Foundation -import REES46 - -struct LocalFilter { - let count: Int - let values: [String: Int] -} - -struct LocalIndustrialFilters { - let fashionSizes: [LocalFashionSize] - let fashionColors: [LocalFashionColor] -} - -struct LocalFashionSize { - let count: Int - let size: String -} - -struct LocalFashionColor { - let count: Int - let color: String -} - -struct LocalPriceRange { - let min: Double - let max: Double -} - -struct LocalSuggest { - let name: String - let url: String - let deeplinkIos: String -} - -struct LocalQuery { - let name: String - let url: String - let deeplinkIos: String -} - -struct LocalCategory { - let id: String - let name: String - let url: String? - let alias: String? - let parentId: String? -} - -struct LocalRedirect { - let query: String - let redirectUrl: String - let deeplink: String? - let deeplinkIos: String? -} - -struct LocalSearchResponse { - let categories: [LocalCategory] - let products: [LocalProduct] - let productsTotal: Int - let queries: [LocalQuery] - let filters: [String: LocalFilter]? - let industrialFilters: LocalIndustrialFilters? - let brands: [String]? - let priceRange: LocalPriceRange? - let redirect: LocalRedirect? -} - -struct LocalProduct: Identifiable { - let id: String - let barcode: String - let name: String - let brand: String - let model: String - let description: String - let imageUrl: String - let resizedImageUrl: String - let resizedImages: [String: String] - let url: String - let deeplinkIos: String - let price: Double - let priceFormatted: String - let priceFull: Double - let priceFullFormatted: String - let oldPrice: Double - let oldPriceFormatted: String - let oldPriceFull: Double - let oldPriceFullFormatted: String - let currency: String - let salesRate: Int - let discount: Int - let relativeSalesRate: Float - let isNew: Bool? - let params: [[String: Any]]? -} - -extension LocalSearchResponse { - static func from(_ response: SearchResponse) -> LocalSearchResponse { - return LocalSearchResponse( - categories: response.categories.map { category in - LocalCategory( - id: category.id, - name: category.name, - url: category.url, - alias: category.alias, - parentId: category.parentId - ) - }, - products: response.products.map { product in - LocalProduct( - id: product.id, - barcode: product.barcode, - name: product.name, - brand: product.brand, - model: product.model, - description: product.description, - imageUrl: product.imageUrl, - resizedImageUrl: product.resizedImageUrl, - resizedImages: product.resizedImages, - url: product.url, - deeplinkIos: product.deeplinkIos, - price: product.price, - priceFormatted: product.priceFormatted, - priceFull: product.priceFull, - priceFullFormatted: product.priceFullFormatted, - oldPrice: product.oldPrice, - oldPriceFormatted: product.oldPriceFormatted, - oldPriceFull: product.oldPriceFull, - oldPriceFullFormatted: product.oldPriceFullFormatted, - currency: product.currency, - salesRate: product.salesRate, - discount: product.discount, - relativeSalesRate: product.relativeSalesRate, - isNew: product.isNew, - params: product.params - ) - }, - productsTotal: response.productsTotal, - queries: response.queries.map { query in - LocalQuery( - name: query.name, - url: query.url, - deeplinkIos: query.deeplinkIos - ) - }, - filters: response.filters?.mapValues { filter in - LocalFilter( - count: filter.count, - values: filter.values - ) - }, - industrialFilters: response.industrialFilters.map { filters in - LocalIndustrialFilters( - fashionSizes: filters.fashionSizes.map { size in - LocalFashionSize( - count: size.count, - size: size.size - ) - }, - fashionColors: filters.fashionColors.map { color in - LocalFashionColor( - count: color.count, - color: color.color - ) - } - ) - }, - brands: response.brands, - priceRange: response.priceRange.map { range in - LocalPriceRange( - min: range.min, - max: range.max - ) - }, - redirect: response.redirect.map { redirect in - LocalRedirect( - query: redirect.query, - redirectUrl: redirect.redirectUrl, - deeplink: redirect.deeplink, - deeplinkIos: redirect.deeplinkIos - ) - } - ) - } -} - -extension RecommendedProduct { - static func from(localProduct: LocalProduct) -> RecommendedProduct { - return RecommendedProduct( - id: localProduct.id, - barcode: localProduct.barcode, - name: localProduct.name, - brand: localProduct.brand, - model: localProduct.model, - description: localProduct.description, - imageUrl: localProduct.imageUrl, - resizedImageUrl: localProduct.resizedImageUrl, - url: localProduct.url, - deeplinkIos: localProduct.deeplinkIos, - categories: [], - locations: [], - price: localProduct.price, - priceFormatted: localProduct.priceFormatted, - priceFull: localProduct.priceFull, - priceFullFormatted: localProduct.priceFullFormatted, - oldPrice: localProduct.oldPrice, - oldPriceFormatted: localProduct.oldPriceFormatted, - oldPriceFull: localProduct.oldPriceFull, - oldPriceFullFormatted: localProduct.oldPriceFullFormatted, - currency: localProduct.currency, - salesRate: localProduct.salesRate, - discount: localProduct.discount, - rating: Int(localProduct.relativeSalesRate), - relativeSalesRate: localProduct.relativeSalesRate, - paramsRaw: localProduct.params, - fashionOriginalSizes: [], - fashionSizes: [], - fashionColors: [], - resizedImages: localProduct.resizedImages - ) - } -} diff --git a/Feature/Search/Data/Model/SearchSuggest.swift b/Feature/Search/Data/Model/SearchSuggest.swift new file mode 100644 index 0000000..a199d37 --- /dev/null +++ b/Feature/Search/Data/Model/SearchSuggest.swift @@ -0,0 +1,7 @@ +import Foundation + +struct SearchSuggest { + let name: String + let url: String + let deeplinkIos: String +} diff --git a/Feature/Search/Presentation/View/SearchScreenView.swift b/Feature/Search/Presentation/View/SearchScreenView.swift index d806b38..fb2ab57 100644 --- a/Feature/Search/Presentation/View/SearchScreenView.swift +++ b/Feature/Search/Presentation/View/SearchScreenView.swift @@ -129,7 +129,7 @@ struct SearchScreenView: View { if searchResults.productsTotal != 0 { ViewAllButton(count: searchResults.productsTotal) { - let recommendedProducts = searchResults.products.map { RecommendedProduct.from(localProduct: $0) } + let recommendedProducts = searchResults.products.map { RecommendedProduct.from(product: $0) } navigationManager.navigateToScreen( AnyView( SearchResultView( diff --git a/Feature/Search/Presentation/ViewModel/SearchViewModel.swift b/Feature/Search/Presentation/ViewModel/SearchViewModel.swift index 9f5f55c..ef8db5c 100644 --- a/Feature/Search/Presentation/ViewModel/SearchViewModel.swift +++ b/Feature/Search/Presentation/ViewModel/SearchViewModel.swift @@ -7,7 +7,7 @@ class SearchViewModel: ObservableObject { private let sdkManager: SDKManaging @Published var searchText: String = "" - @Published var searchResults: LocalSearchResponse? = nil + @Published var searchResults: SearchProductResponse? = nil @Published var isLoading: Bool = false @Published var errorMessage: String? @Published var searchHistory: [String] = [] @@ -61,7 +61,7 @@ class SearchViewModel: ObservableObject { self?.isLoading = false switch result { case .success(let response): - self?.searchResults = LocalSearchResponse.from(response) + self?.searchResults = SearchProductResponse.from(response) self?.updateSearchHistory(query: query) self?.totalItemCount = self?.searchResults?.productsTotal ?? 0 case .failure(let error): diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index f5b391c..fa7af2d 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -268,10 +268,10 @@ 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoaderError.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift; sourceTree = ""; }; 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryButton.swift; path = REES46/Classes/Button/StoryButton.swift; sourceTree = ""; }; 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserSettings.swift; path = REES46/Classes/Model/UserSettings.swift; 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; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBTextConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift; sourceTree = ""; }; 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsResponse.swift; path = REES46/Classes/Model/ProductsResponse.swift; sourceTree = ""; }; - A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios"; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A05E795ECA6FF0F5767E433F8FE8625C /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideViewController.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift; sourceTree = ""; }; A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift; sourceTree = ""; }; A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoFileUtils.swift; path = REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift; sourceTree = ""; }; @@ -512,14 +512,13 @@ 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */, A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */, ); - name = REES46; path = REES46; sourceTree = ""; }; 45F05160E1AA18223A137E9876780947 /* Products */ = { isa = PBXGroup; children = ( - A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */, + A05E795ECA6FF0F5767E433F8FE8625C /* Pods_demo_store_ios.framework */, 3671B3C220D01E22000CF41146C2B4AB /* REES46 */, ); name = Products; @@ -648,7 +647,7 @@ ); name = "Pods-demo-store-ios"; productName = Pods_demo_store_ios; - productReference = A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */; + productReference = A05E795ECA6FF0F5767E433F8FE8625C /* Pods_demo_store_ios.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 89e493f..7f93263 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -14,10 +14,10 @@ 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */; }; 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */; }; 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.swift */; }; - 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */; }; + 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchProductResponse.swift */; }; 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */; }; 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; - 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */; }; + 75674CDC2C3C1A67007FAB88 /* ListDiscoverProductsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.swift */; }; 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */; }; 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE52C3D295F007FAB88 /* SdkManager.swift */; }; 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */; }; @@ -38,7 +38,7 @@ 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355D2C3564370063E814 /* Preview Assets.xcassets */; }; 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */; }; - 75E1C8ED2C3EACDA005018B4 /* DetailsToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */; }; + 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.swift */; }; 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */; }; 75E979862C4935170081B069 /* Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 75E979852C4935170081B069 /* Core.h */; settings = {ATTRIBUTES = (Public, ); }; }; 75E979892C4935170081B069 /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979832C4935170081B069 /* Core.framework */; }; @@ -49,19 +49,50 @@ 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979C62C496E1C0081B069 /* HomeResolver.swift */; }; 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979CB2C4973DA0081B069 /* CartResolver.swift */; }; 75E979D02C4974440081B069 /* CartListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979CF2C4974440081B069 /* CartListView.swift */; }; - 75E979D42C4974660081B069 /* CartItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979D32C4974660081B069 /* CartItemView.swift */; }; - 75E979DC2C4ADD7F0081B069 /* ScreenTypeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979D82C4ADAA10081B069 /* ScreenTypeProvider.swift */; }; - 75E979DE2C4ADDD20081B069 /* ScreenType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979DD2C4ADDD20081B069 /* ScreenType.swift */; }; + 75E979D42C4974660081B069 /* CartListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979D32C4974660081B069 /* CartListItemView.swift */; }; + 75E979DE2C4ADDD20081B069 /* RootScreenType.enum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979DD2C4ADDD20081B069 /* RootScreenType.enum.swift */; }; 75E979E72C4AE8870081B069 /* TabItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979E62C4AE8870081B069 /* TabItem.swift */; }; 75E979ED2C4D2BAE0081B069 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979EC2C4D2BAE0081B069 /* AppState.swift */; }; - 75E979EE2C4D2BAE0081B069 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979EC2C4D2BAE0081B069 /* AppState.swift */; }; - 75E979EF2C4D2BAE0081B069 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979EC2C4D2BAE0081B069 /* AppState.swift */; }; 75E979F12C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; - 75E979F72C4D37940081B069 /* ViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F62C4D37940081B069 /* ViewState.swift */; }; - 75E979F82C4D37940081B069 /* ViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F62C4D37940081B069 /* ViewState.swift */; }; - 75E979F92C4D37940081B069 /* ViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F62C4D37940081B069 /* ViewState.swift */; }; + 75E979F72C4D37940081B069 /* ViewState.enum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F62C4D37940081B069 /* ViewState.enum.swift */; }; + 75E97A172C501B120081B069 /* ScreenWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A162C501B120081B069 /* ScreenWrapper.swift */; }; + 75E97A1C2C501D660081B069 /* ScreenTypeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A1A2C501D660081B069 /* ScreenTypeProvider.swift */; }; + 75E97A232C5023600081B069 /* SearchFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.swift */; }; + 75E97A242C5023600081B069 /* SearchFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.swift */; }; + 75E97A252C5023600081B069 /* SearchFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.swift */; }; + 75E97A272C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */; }; + 75E97A282C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */; }; + 75E97A292C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */; }; + 75E97A2B2C5023960081B069 /* SearchFashionSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */; }; + 75E97A2C2C5023960081B069 /* SearchFashionSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */; }; + 75E97A2D2C5023960081B069 /* SearchFashionSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */; }; + 75E97A2F2C5023B10081B069 /* SearchFashionColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */; }; + 75E97A302C5023B10081B069 /* SearchFashionColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */; }; + 75E97A312C5023B10081B069 /* SearchFashionColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */; }; + 75E97A372C5024280081B069 /* SearchProductResponseMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A342C5024280081B069 /* SearchProductResponseMapper.swift */; }; + 75E97A392C5024CD0081B069 /* SearchProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.swift */; }; + 75E97A3A2C5024CD0081B069 /* SearchProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.swift */; }; + 75E97A3B2C5024CD0081B069 /* SearchProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.swift */; }; + 75E97A3D2C5024EF0081B069 /* SearchRedirect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */; }; + 75E97A3E2C5024EF0081B069 /* SearchRedirect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */; }; + 75E97A3F2C5024EF0081B069 /* SearchRedirect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */; }; + 75E97A412C5025080081B069 /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A402C5025080081B069 /* SearchCategory.swift */; }; + 75E97A422C5025080081B069 /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A402C5025080081B069 /* SearchCategory.swift */; }; + 75E97A432C5025080081B069 /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A402C5025080081B069 /* SearchCategory.swift */; }; + 75E97A452C5025240081B069 /* SearchQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A442C5025240081B069 /* SearchQuery.swift */; }; + 75E97A462C5025240081B069 /* SearchQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A442C5025240081B069 /* SearchQuery.swift */; }; + 75E97A472C5025240081B069 /* SearchQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A442C5025240081B069 /* SearchQuery.swift */; }; + 75E97A492C50253A0081B069 /* SearchSuggest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A482C50253A0081B069 /* SearchSuggest.swift */; }; + 75E97A4A2C50253A0081B069 /* SearchSuggest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A482C50253A0081B069 /* SearchSuggest.swift */; }; + 75E97A4B2C50253A0081B069 /* SearchSuggest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A482C50253A0081B069 /* SearchSuggest.swift */; }; + 75E97A4D2C50255A0081B069 /* SearchPriceRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */; }; + 75E97A4E2C50255A0081B069 /* SearchPriceRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */; }; + 75E97A4F2C50255A0081B069 /* SearchPriceRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */; }; + 75E97A522C50257D0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */; }; + 75E97A532C50257D0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */; }; + 75E97A542C50257D0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */; }; 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */; }; 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; @@ -110,10 +141,10 @@ 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetRecommendationsUseCase.swift; sourceTree = ""; }; 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; 752F1D482C459680002D4AC3 /* SearchScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.swift; sourceTree = ""; }; - 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResponseDto.swift; sourceTree = ""; }; + 752F1D4A2C46A363002D4AC3 /* SearchProductResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchProductResponse.swift; sourceTree = ""; }; 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; - 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainDiscoverView.swift; sourceTree = ""; }; + 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDiscoverProductsView.swift; sourceTree = ""; }; 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStoriesContainerView.swift; sourceTree = ""; }; 75674CE52C3D295F007FAB88 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; @@ -136,7 +167,7 @@ 75B9355A2C3564370063E814 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 75B9355D2C3564370063E814 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.swift; sourceTree = ""; }; - 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbar.swift; sourceTree = ""; }; + 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbarView.swift; sourceTree = ""; }; 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.swift; sourceTree = ""; }; 75E979832C4935170081B069 /* Core.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Core.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 75E979852C4935170081B069 /* Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Core.h; sourceTree = ""; }; @@ -145,13 +176,26 @@ 75E979C62C496E1C0081B069 /* HomeResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeResolver.swift; sourceTree = ""; }; 75E979CB2C4973DA0081B069 /* CartResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartResolver.swift; sourceTree = ""; }; 75E979CF2C4974440081B069 /* CartListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartListView.swift; sourceTree = ""; }; - 75E979D32C4974660081B069 /* CartItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartItemView.swift; sourceTree = ""; }; - 75E979D82C4ADAA10081B069 /* ScreenTypeProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenTypeProvider.swift; sourceTree = ""; }; - 75E979DD2C4ADDD20081B069 /* ScreenType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenType.swift; sourceTree = ""; }; + 75E979D32C4974660081B069 /* CartListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartListItemView.swift; sourceTree = ""; }; + 75E979DD2C4ADDD20081B069 /* RootScreenType.enum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootScreenType.enum.swift; sourceTree = ""; }; 75E979E62C4AE8870081B069 /* TabItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabItem.swift; sourceTree = ""; }; 75E979EC2C4D2BAE0081B069 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = ""; }; 75E979F02C4D2DBE0081B069 /* Timer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; - 75E979F62C4D37940081B069 /* ViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewState.swift; sourceTree = ""; }; + 75E979F62C4D37940081B069 /* ViewState.enum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewState.enum.swift; sourceTree = ""; }; + 75E97A162C501B120081B069 /* ScreenWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenWrapper.swift; sourceTree = ""; }; + 75E97A1A2C501D660081B069 /* ScreenTypeProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenTypeProvider.swift; sourceTree = ""; }; + 75E97A222C5023600081B069 /* SearchFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFilter.swift; sourceTree = ""; }; + 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchIndustrialFilters.swift; sourceTree = ""; }; + 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFashionSize.swift; sourceTree = ""; }; + 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFashionColor.swift; sourceTree = ""; }; + 75E97A342C5024280081B069 /* SearchProductResponseMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchProductResponseMapper.swift; sourceTree = ""; }; + 75E97A382C5024CD0081B069 /* SearchProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchProduct.swift; sourceTree = ""; }; + 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRedirect.swift; sourceTree = ""; }; + 75E97A402C5025080081B069 /* SearchCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCategory.swift; sourceTree = ""; }; + 75E97A442C5025240081B069 /* SearchQuery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchQuery.swift; sourceTree = ""; }; + 75E97A482C50253A0081B069 /* SearchSuggest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSuggest.swift; sourceTree = ""; }; + 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPriceRange.swift; sourceTree = ""; }; + 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; @@ -195,36 +239,27 @@ 75674CEA2C3D2E32007FAB88 /* Stories */ = { isa = PBXGroup; children = ( - 75674CED2C3D39E8007FAB88 /* Controller */, 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */, + 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */, ); path = Stories; sourceTree = ""; }; - 75674CEC2C3D2E45007FAB88 /* Discover */ = { + 75674CEC2C3D2E45007FAB88 /* ListDiscoverProducts */ = { isa = PBXGroup; children = ( - 75674CDB2C3C1A67007FAB88 /* MainDiscoverView.swift */, - ); - path = Discover; - sourceTree = ""; - }; - 75674CED2C3D39E8007FAB88 /* Controller */ = { - isa = PBXGroup; - children = ( - 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */, + 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.swift */, ); - path = Controller; + path = ListDiscoverProducts; sourceTree = ""; }; - 75674CF02C3D787A007FAB88 /* Recommendation */ = { + 75674CF02C3D787A007FAB88 /* ListRecommendation */ = { isa = PBXGroup; children = ( 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */, 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */, - 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */, ); - path = Recommendation; + path = ListRecommendation; sourceTree = ""; }; 75674CFF2C3DA0EC007FAB88 /* Utils */ = { @@ -262,8 +297,10 @@ 75B935552C3564360063E814 /* App */ = { isa = PBXGroup; children = ( - 75E979E12C4AE4630081B069 /* Presentation */, + 75E979E12C4AE4630081B069 /* Views */, 75ECCD182C36F92A00D6D346 /* Navigation */, + 75E97A1F2C501E650081B069 /* ViewModels */, + 75E97A112C50199F0081B069 /* Models */, 75B9355C2C3564370063E814 /* Preview Content */, 75B935562C3564360063E814 /* DemoStoreApp.swift */, 75A3F4212C3828A400AAC175 /* Info.plist */, @@ -293,7 +330,6 @@ 75E979942C49561B0081B069 /* Feature */ = { isa = PBXGroup; children = ( - 75E979AB2C4957720081B069 /* Splash */, 75E979A62C4956CD0081B069 /* Search */, 75E9799E2C4956400081B069 /* Home */, 75E9799F2C4956470081B069 /* Product */, @@ -308,9 +344,8 @@ isa = PBXGroup; children = ( 75E979A52C4956A30081B069 /* Presentation */, - 75E979A42C49569D0081B069 /* Domain */, - 75E979A32C4956900081B069 /* Data */, 75E979A22C49568B0081B069 /* DI */, + 75E979A42C49569D0081B069 /* Domain */, ); path = Home; sourceTree = ""; @@ -318,7 +353,7 @@ 75E9799F2C4956470081B069 /* Product */ = { isa = PBXGroup; children = ( - 75E979BC2C4959F50081B069 /* Presentation */, + 75E97A202C50207D0081B069 /* Presentation */, 75E979C22C495B780081B069 /* Data */, ); path = Product; @@ -327,8 +362,8 @@ 75E979A02C4956520081B069 /* Cart */ = { isa = PBXGroup; children = ( - 75E979CA2C4973CF0081B069 /* DI */, 75E979B22C4958A90081B069 /* Presentation */, + 75E979CA2C4973CF0081B069 /* DI */, 75E979B52C4958F20081B069 /* Domain */, 75E979C02C495B1D0081B069 /* Data */, ); @@ -338,7 +373,6 @@ 75E979A12C4956580081B069 /* Settings */ = { isa = PBXGroup; children = ( - 75E979F42C4D377F0081B069 /* Data */, 75E979BE2C495A130081B069 /* Presentation */, ); path = Settings; @@ -352,13 +386,6 @@ path = DI; sourceTree = ""; }; - 75E979A32C4956900081B069 /* Data */ = { - isa = PBXGroup; - children = ( - ); - path = Data; - sourceTree = ""; - }; 75E979A42C49569D0081B069 /* Domain */ = { isa = PBXGroup; children = ( @@ -380,35 +407,11 @@ isa = PBXGroup; children = ( 75E979AA2C4956F30081B069 /* Presentation */, - 75E979A92C4956EE0081B069 /* Domain */, - 75E979A82C4956E60081B069 /* Data */, - 75E979A72C4956DE0081B069 /* DI */, + 75E97A322C5023F30081B069 /* Data */, ); path = Search; sourceTree = ""; }; - 75E979A72C4956DE0081B069 /* DI */ = { - isa = PBXGroup; - children = ( - ); - path = DI; - sourceTree = ""; - }; - 75E979A82C4956E60081B069 /* Data */ = { - isa = PBXGroup; - children = ( - 75E979C42C495BAA0081B069 /* Model */, - ); - path = Data; - sourceTree = ""; - }; - 75E979A92C4956EE0081B069 /* Domain */ = { - isa = PBXGroup; - children = ( - ); - path = Domain; - sourceTree = ""; - }; 75E979AA2C4956F30081B069 /* Presentation */ = { isa = PBXGroup; children = ( @@ -418,30 +421,6 @@ path = Presentation; sourceTree = ""; }; - 75E979AB2C4957720081B069 /* Splash */ = { - isa = PBXGroup; - children = ( - 75E979AD2C4957960081B069 /* Presentation */, - 75E979AC2C4957910081B069 /* DI */, - ); - path = Splash; - sourceTree = ""; - }; - 75E979AC2C4957910081B069 /* DI */ = { - isa = PBXGroup; - children = ( - ); - path = DI; - sourceTree = ""; - }; - 75E979AD2C4957960081B069 /* Presentation */ = { - isa = PBXGroup; - children = ( - 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */, - ); - path = Presentation; - sourceTree = ""; - }; 75E979AF2C49586D0081B069 /* View */ = { isa = PBXGroup; children = ( @@ -479,9 +458,8 @@ 75E979B32C4958B20081B069 /* View */ = { isa = PBXGroup; children = ( - 75E979D32C4974660081B069 /* CartItemView.swift */, 75E979CF2C4974440081B069 /* CartListView.swift */, - 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, + 75E979D32C4974660081B069 /* CartListItemView.swift */, ); path = View; sourceTree = ""; @@ -513,12 +491,10 @@ 75E979B72C4959250081B069 /* View */ = { isa = PBXGroup; children = ( - 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */, 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */, - 75E1C8EC2C3EACDA005018B4 /* DetailsToolbar.swift */, 75674CEA2C3D2E32007FAB88 /* Stories */, - 75674CF02C3D787A007FAB88 /* Recommendation */, - 75674CEC2C3D2E45007FAB88 /* Discover */, + 75674CF02C3D787A007FAB88 /* ListRecommendation */, + 75674CEC2C3D2E45007FAB88 /* ListDiscoverProducts */, ); path = View; sourceTree = ""; @@ -531,22 +507,6 @@ path = ViewModel; sourceTree = ""; }; - 75E979BC2C4959F50081B069 /* Presentation */ = { - isa = PBXGroup; - children = ( - 75E979BD2C4959FC0081B069 /* View */, - ); - path = Presentation; - sourceTree = ""; - }; - 75E979BD2C4959FC0081B069 /* View */ = { - isa = PBXGroup; - children = ( - 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */, - ); - path = View; - sourceTree = ""; - }; 75E979BE2C495A130081B069 /* Presentation */ = { isa = PBXGroup; children = ( @@ -558,7 +518,6 @@ 75E979BF2C495A1B0081B069 /* View */ = { isa = PBXGroup; children = ( - 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */, 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */, 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */, ); @@ -602,7 +561,17 @@ 75E979C42C495BAA0081B069 /* Model */ = { isa = PBXGroup; children = ( - 752F1D4A2C46A363002D4AC3 /* SearchResponseDto.swift */, + 752F1D4A2C46A363002D4AC3 /* SearchProductResponse.swift */, + 75E97A222C5023600081B069 /* SearchFilter.swift */, + 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */, + 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */, + 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */, + 75E97A382C5024CD0081B069 /* SearchProduct.swift */, + 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */, + 75E97A402C5025080081B069 /* SearchCategory.swift */, + 75E97A442C5025240081B069 /* SearchQuery.swift */, + 75E97A482C50253A0081B069 /* SearchSuggest.swift */, + 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */, ); path = Model; sourceTree = ""; @@ -623,73 +592,108 @@ path = DI; sourceTree = ""; }; - 75E979E12C4AE4630081B069 /* Presentation */ = { + 75E979E12C4AE4630081B069 /* Views */ = { isa = PBXGroup; children = ( - 75E979E22C4AE4790081B069 /* View */, + 75B935582C3564360063E814 /* ContentView.swift */, + 75E97A142C501A7D0081B069 /* Screens */, + 75E97A152C501A930081B069 /* ToolBar */, + 75E979E22C4AE4790081B069 /* BottomBar */, ); - path = Presentation; + path = Views; sourceTree = ""; }; - 75E979E22C4AE4790081B069 /* View */ = { + 75E979E22C4AE4790081B069 /* BottomBar */ = { isa = PBXGroup; children = ( - 75A3F4282C38593800AAC175 /* ToolbarView.swift */, - 75B935582C3564360063E814 /* ContentView.swift */, + 75ECCD192C36F94800D6D346 /* BottomBarView.swift */, ); - path = View; + path = BottomBar; sourceTree = ""; }; - 75E979E32C4AE4B70081B069 /* Data */ = { + 75E97A112C50199F0081B069 /* Models */ = { isa = PBXGroup; children = ( 75E979E62C4AE8870081B069 /* TabItem.swift */, - 75E979DD2C4ADDD20081B069 /* ScreenType.swift */, - 75E979EC2C4D2BAE0081B069 /* AppState.swift */, + 75E979DD2C4ADDD20081B069 /* RootScreenType.enum.swift */, + 75E979F62C4D37940081B069 /* ViewState.enum.swift */, ); - path = Data; + path = Models; + sourceTree = ""; + }; + 75E97A142C501A7D0081B069 /* Screens */ = { + isa = PBXGroup; + children = ( + 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */, + 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */, + 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */, + 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */, + 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, + 75E97A162C501B120081B069 /* ScreenWrapper.swift */, + ); + path = Screens; sourceTree = ""; }; - 75E979E42C4AE4C20081B069 /* Domain */ = { + 75E97A152C501A930081B069 /* ToolBar */ = { isa = PBXGroup; children = ( - 75E979E52C4AE52D0081B069 /* Repository */, + 75A3F4282C38593800AAC175 /* ToolbarView.swift */, + 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.swift */, ); - path = Domain; + path = ToolBar; sourceTree = ""; }; - 75E979E52C4AE52D0081B069 /* Repository */ = { + 75E97A1B2C501D660081B069 /* Protocols */ = { isa = PBXGroup; children = ( - 75E979D82C4ADAA10081B069 /* ScreenTypeProvider.swift */, + 75E97A1A2C501D660081B069 /* ScreenTypeProvider.swift */, ); - path = Repository; + path = Protocols; sourceTree = ""; }; - 75E979EA2C4D1D040081B069 /* Presentation */ = { + 75E97A1F2C501E650081B069 /* ViewModels */ = { isa = PBXGroup; children = ( - 75E979EB2C4D1D0F0081B069 /* View */, + 75E979EC2C4D2BAE0081B069 /* AppState.swift */, + 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 75E97A202C50207D0081B069 /* Presentation */ = { + isa = PBXGroup; + children = ( + 75E97A212C5020860081B069 /* View */, ); path = Presentation; sourceTree = ""; }; - 75E979EB2C4D1D0F0081B069 /* View */ = { + 75E97A212C5020860081B069 /* View */ = { isa = PBXGroup; children = ( - 75ECCD192C36F94800D6D346 /* BottomBarView.swift */, + 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */, ); path = View; sourceTree = ""; }; - 75E979F42C4D377F0081B069 /* Data */ = { + 75E97A322C5023F30081B069 /* Data */ = { isa = PBXGroup; children = ( - 75E979F62C4D37940081B069 /* ViewState.swift */, + 75E979C42C495BAA0081B069 /* Model */, + 75E97A332C5024010081B069 /* Mapper */, ); path = Data; sourceTree = ""; }; + 75E97A332C5024010081B069 /* Mapper */ = { + isa = PBXGroup; + children = ( + 75E97A342C5024280081B069 /* SearchProductResponseMapper.swift */, + 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */, + ); + path = Mapper; + sourceTree = ""; + }; 75ECCD152C36D6B400D6D346 /* Resources */ = { isa = PBXGroup; children = ( @@ -702,10 +706,7 @@ 75ECCD182C36F92A00D6D346 /* Navigation */ = { isa = PBXGroup; children = ( - 75E979EA2C4D1D040081B069 /* Presentation */, - 75E979E42C4AE4C20081B069 /* Domain */, - 75E979E32C4AE4B70081B069 /* Data */, - 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */, + 75E97A1B2C501D660081B069 /* Protocols */, ); path = Navigation; sourceTree = ""; @@ -938,40 +939,52 @@ 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */, 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */, 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, - 75674CDC2C3C1A67007FAB88 /* MainDiscoverView.swift in Sources */, + 75674CDC2C3C1A67007FAB88 /* ListDiscoverProductsView.swift in Sources */, 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */, + 75E97A3D2C5024EF0081B069 /* SearchRedirect.swift in Sources */, + 75E97A452C5025240081B069 /* SearchQuery.swift in Sources */, + 75E97A412C5025080081B069 /* SearchCategory.swift in Sources */, 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */, 75674CF72C3D92E0007FAB88 /* RecommendedProductDto.swift in Sources */, + 75E97A492C50253A0081B069 /* SearchSuggest.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, + 75E97A522C50257D0081B069 /* RecommendedProductMapper.swift in Sources */, 75E979E72C4AE8870081B069 /* TabItem.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */, - 75E979DE2C4ADDD20081B069 /* ScreenType.swift in Sources */, + 75E979DE2C4ADDD20081B069 /* RootScreenType.enum.swift in Sources */, + 75E97A1C2C501D660081B069 /* ScreenTypeProvider.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */, 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */, 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */, + 75E97A2F2C5023B10081B069 /* SearchFashionColor.swift in Sources */, + 75E97A172C501B120081B069 /* ScreenWrapper.swift in Sources */, 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */, 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */, 75B935592C3564360063E814 /* ContentView.swift in Sources */, 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */, 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, - 75E1C8ED2C3EACDA005018B4 /* DetailsToolbar.swift in Sources */, + 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */, 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */, 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, - 752F1D4B2C46A363002D4AC3 /* SearchResponseDto.swift in Sources */, + 75E97A232C5023600081B069 /* SearchFilter.swift in Sources */, + 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.swift in Sources */, + 75E97A4D2C50255A0081B069 /* SearchPriceRange.swift in Sources */, 75E979F12C4D2DBE0081B069 /* Timer.swift in Sources */, - 75E979F72C4D37940081B069 /* ViewState.swift in Sources */, + 75E979F72C4D37940081B069 /* ViewState.enum.swift in Sources */, + 75E97A2B2C5023960081B069 /* SearchFashionSize.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, + 75E97A272C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, 75E979D02C4974440081B069 /* CartListView.swift in Sources */, - 75E979D42C4974660081B069 /* CartItemView.swift in Sources */, - 75E979DC2C4ADD7F0081B069 /* ScreenTypeProvider.swift in Sources */, + 75E979D42C4974660081B069 /* CartListItemView.swift in Sources */, + 75E97A392C5024CD0081B069 /* SearchProduct.swift in Sources */, 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */, 75E979ED2C4D2BAE0081B069 /* AppState.swift in Sources */, @@ -986,9 +999,18 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75E979EE2C4D2BAE0081B069 /* AppState.swift in Sources */, + 75E97A302C5023B10081B069 /* SearchFashionColor.swift in Sources */, + 75E97A3A2C5024CD0081B069 /* SearchProduct.swift in Sources */, + 75E97A532C50257D0081B069 /* RecommendedProductMapper.swift in Sources */, + 75E97A4A2C50253A0081B069 /* SearchSuggest.swift in Sources */, 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */, - 75E979F82C4D37940081B069 /* ViewState.swift in Sources */, + 75E97A422C5025080081B069 /* SearchCategory.swift in Sources */, + 75E97A242C5023600081B069 /* SearchFilter.swift in Sources */, + 75E97A3E2C5024EF0081B069 /* SearchRedirect.swift in Sources */, + 75E97A4E2C50255A0081B069 /* SearchPriceRange.swift in Sources */, + 75E97A282C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, + 75E97A2C2C5023960081B069 /* SearchFashionSize.swift in Sources */, + 75E97A462C5025240081B069 /* SearchQuery.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -996,9 +1018,19 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75E979EF2C4D2BAE0081B069 /* AppState.swift in Sources */, + 75E97A312C5023B10081B069 /* SearchFashionColor.swift in Sources */, + 75E97A4B2C50253A0081B069 /* SearchSuggest.swift in Sources */, + 75E97A372C5024280081B069 /* SearchProductResponseMapper.swift in Sources */, + 75E97A4F2C50255A0081B069 /* SearchPriceRange.swift in Sources */, + 75E97A472C5025240081B069 /* SearchQuery.swift in Sources */, + 75E97A432C5025080081B069 /* SearchCategory.swift in Sources */, 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */, - 75E979F92C4D37940081B069 /* ViewState.swift in Sources */, + 75E97A252C5023600081B069 /* SearchFilter.swift in Sources */, + 75E97A292C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, + 75E97A3B2C5024CD0081B069 /* SearchProduct.swift in Sources */, + 75E97A542C50257D0081B069 /* RecommendedProductMapper.swift in Sources */, + 75E97A2D2C5023960081B069 /* SearchFashionSize.swift in Sources */, + 75E97A3F2C5024EF0081B069 /* SearchRedirect.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 7c56c1a2f664b2bcb06f3c063a20d3f9f151953b Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 23 Jul 2024 20:57:35 +0200 Subject: [PATCH 65/85] refactor: Change data classes location and add func for initializing start destination screen --- App/ViewModels/NavigationManager.swift | 5 + .../Mapper/RecommendedProductMapper.swift | 50 ------- .../Model/{ProductDto.swift => Product.swift} | 0 .../Data/Model/RecommendedProduct.swift | 72 +++++++++ .../Data/Model/RecommendedProductDto.swift | 36 ----- .../Mapper/RecommendedProductMapper.swift | 80 +++++----- Podfile.lock | 6 +- Pods/Local Podspecs/REES46.podspec.json | 4 +- Pods/Manifest.lock | 6 +- Pods/Pods.xcodeproj/project.pbxproj | 9 +- .../REES46/Classes/PersonalizationSDK.swift | 40 +++-- .../SubscriptionService.swift | 29 +++- .../SubscriptionServiceImpl.swift | 21 ++- .../Classes/SimplePersonalizationSDK.swift | 140 +++++++++++++----- .../StoryCollectionViewCell.swift | 3 - .../StoryViewController.swift | 8 +- .../events/RegisterNotification.swift | 41 +++-- .../Pods-demo-store-ios.debug.xcconfig | 6 +- .../REES46/REES46-Info.plist | 2 +- demo-store-ios.xcodeproj/project.pbxproj | 41 +++-- .../xcschemes/xcschememanagement.plist | 4 +- 21 files changed, 365 insertions(+), 238 deletions(-) delete mode 100644 Feature/Product/Data/Mapper/RecommendedProductMapper.swift rename Feature/Product/Data/Model/{ProductDto.swift => Product.swift} (100%) create mode 100644 Feature/Product/Data/Model/RecommendedProduct.swift delete mode 100644 Feature/Product/Data/Model/RecommendedProductDto.swift diff --git a/App/ViewModels/NavigationManager.swift b/App/ViewModels/NavigationManager.swift index fa0e186..2474e1f 100644 --- a/App/ViewModels/NavigationManager.swift +++ b/App/ViewModels/NavigationManager.swift @@ -18,6 +18,11 @@ class NavigationManager: ObservableObject { ] init(initialScreen: ScreenWrapper) { + self.currentScreen = initialScreen + self.setStartDestinationScreen(initialScreen: initialScreen) + } + + private func setStartDestinationScreen(initialScreen: ScreenWrapper) { self.currentScreen = initialScreen self.currentRootScreenType = initialScreen.type ?? .home self.screenHistory.append(self.currentScreen) diff --git a/Feature/Product/Data/Mapper/RecommendedProductMapper.swift b/Feature/Product/Data/Mapper/RecommendedProductMapper.swift deleted file mode 100644 index d59f398..0000000 --- a/Feature/Product/Data/Mapper/RecommendedProductMapper.swift +++ /dev/null @@ -1,50 +0,0 @@ -import Foundation -import REES46 - -class RecommendedProductMapper { - - static func mapResponseToProducts(response: REES46.RecommenderResponse) -> [RecommendedProduct] { - return response.recommended.map { recommended in - return RecommendedProduct( - id: recommended.id, - barcode: recommended.barcode, - name: recommended.name, - brand: recommended.brand, - model: recommended.model, - description: recommended.description, - imageUrl: recommended.imageUrl, - resizedImageUrl: recommended.resizedImageUrl, - url: recommended.url, - deeplinkIos: recommended.deeplinkIos, - categories: recommended.categories.map { category in - ProductDto( - id: category.id, - name: category.name, - url: category.url, - alias: category.alias, - parentId: category.parentId - ) - }, - locations: recommended.locations, - price: recommended.price, - priceFormatted: recommended.priceFormatted, - priceFull: recommended.priceFull, - priceFullFormatted: recommended.priceFullFormatted, - oldPrice: recommended.oldPrice, - oldPriceFormatted: recommended.oldPriceFormatted, - oldPriceFull: recommended.oldPriceFull, - oldPriceFullFormatted: recommended.oldPriceFullFormatted, - currency: recommended.currency, - salesRate: recommended.salesRate, - discount: recommended.discount, - rating: recommended.rating, - relativeSalesRate: recommended.relativeSalesRate, - paramsRaw: recommended.paramsRaw, - fashionOriginalSizes: recommended.fashionOriginalSizes, - fashionSizes: recommended.fashionSizes, - fashionColors: recommended.fashionColors, - resizedImages: recommended.resizedImages - ) - } - } -} diff --git a/Feature/Product/Data/Model/ProductDto.swift b/Feature/Product/Data/Model/Product.swift similarity index 100% rename from Feature/Product/Data/Model/ProductDto.swift rename to Feature/Product/Data/Model/Product.swift diff --git a/Feature/Product/Data/Model/RecommendedProduct.swift b/Feature/Product/Data/Model/RecommendedProduct.swift new file mode 100644 index 0000000..1f85fc2 --- /dev/null +++ b/Feature/Product/Data/Model/RecommendedProduct.swift @@ -0,0 +1,72 @@ +import Foundation +import REES46 + +struct RecommendedProduct { + let id: String + let barcode: String + let name: String + let brand: String + let model: String + let description: String + let imageUrl: String + let resizedImageUrl: String + let url: String + let deeplinkIos: String + let categories: [ProductDto] + let locations: [REES46.Location] + let price: Double + let priceFormatted: String? + let priceFull: Double + let priceFullFormatted: String? + let oldPrice: Double + let oldPriceFormatted: String? + let oldPriceFull: Double + let oldPriceFullFormatted: String? + let currency: String + let salesRate: Int + let discount: Int + let rating: Int + let relativeSalesRate: Float + let paramsRaw: [[String: Any]]? + let fashionOriginalSizes: [String] + let fashionSizes: [String] + let fashionColors: [String] + let resizedImages: [String: String] +} + +extension RecommendedProduct { + static func from(product: SearchProduct) -> RecommendedProduct { + return RecommendedProduct( + id: product.id, + barcode: product.barcode, + name: product.name, + brand: product.brand, + model: product.model, + description: product.description, + imageUrl: product.imageUrl, + resizedImageUrl: product.resizedImageUrl, + url: product.url, + deeplinkIos: product.deeplinkIos, + categories: [], + locations: [], + price: product.price, + priceFormatted: product.priceFormatted, + priceFull: product.priceFull, + priceFullFormatted: product.priceFullFormatted, + oldPrice: product.oldPrice, + oldPriceFormatted: product.oldPriceFormatted, + oldPriceFull: product.oldPriceFull, + oldPriceFullFormatted: product.oldPriceFullFormatted, + currency: product.currency, + salesRate: product.salesRate, + discount: product.discount, + rating: Int(product.relativeSalesRate), + relativeSalesRate: product.relativeSalesRate, + paramsRaw: product.params, + fashionOriginalSizes: [], + fashionSizes: [], + fashionColors: [], + resizedImages: product.resizedImages + ) + } +} diff --git a/Feature/Product/Data/Model/RecommendedProductDto.swift b/Feature/Product/Data/Model/RecommendedProductDto.swift deleted file mode 100644 index 95202c3..0000000 --- a/Feature/Product/Data/Model/RecommendedProductDto.swift +++ /dev/null @@ -1,36 +0,0 @@ -import Foundation -import REES46 - -struct RecommendedProduct { - let id: String - let barcode: String - let name: String - let brand: String - let model: String - let description: String - let imageUrl: String - let resizedImageUrl: String - let url: String - let deeplinkIos: String - let categories: [ProductDto] - let locations: [REES46.Location] - let price: Double - let priceFormatted: String? - let priceFull: Double - let priceFullFormatted: String? - let oldPrice: Double - let oldPriceFormatted: String? - let oldPriceFull: Double - let oldPriceFullFormatted: String? - let currency: String - let salesRate: Int - let discount: Int - let rating: Int - let relativeSalesRate: Float - let paramsRaw: [[String: Any]]? - let fashionOriginalSizes: [String] - let fashionSizes: [String] - let fashionColors: [String] - let resizedImages: [String: String] -} - diff --git a/Feature/Search/Data/Mapper/RecommendedProductMapper.swift b/Feature/Search/Data/Mapper/RecommendedProductMapper.swift index c042f4a..d59f398 100644 --- a/Feature/Search/Data/Mapper/RecommendedProductMapper.swift +++ b/Feature/Search/Data/Mapper/RecommendedProductMapper.swift @@ -1,38 +1,50 @@ import Foundation +import REES46 -extension RecommendedProduct { - static func from(product: SearchProduct) -> RecommendedProduct { - return RecommendedProduct( - id: product.id, - barcode: product.barcode, - name: product.name, - brand: product.brand, - model: product.model, - description: product.description, - imageUrl: product.imageUrl, - resizedImageUrl: product.resizedImageUrl, - url: product.url, - deeplinkIos: product.deeplinkIos, - categories: [], - locations: [], - price: product.price, - priceFormatted: product.priceFormatted, - priceFull: product.priceFull, - priceFullFormatted: product.priceFullFormatted, - oldPrice: product.oldPrice, - oldPriceFormatted: product.oldPriceFormatted, - oldPriceFull: product.oldPriceFull, - oldPriceFullFormatted: product.oldPriceFullFormatted, - currency: product.currency, - salesRate: product.salesRate, - discount: product.discount, - rating: Int(product.relativeSalesRate), - relativeSalesRate: product.relativeSalesRate, - paramsRaw: product.params, - fashionOriginalSizes: [], - fashionSizes: [], - fashionColors: [], - resizedImages: product.resizedImages - ) +class RecommendedProductMapper { + + static func mapResponseToProducts(response: REES46.RecommenderResponse) -> [RecommendedProduct] { + return response.recommended.map { recommended in + return RecommendedProduct( + id: recommended.id, + barcode: recommended.barcode, + name: recommended.name, + brand: recommended.brand, + model: recommended.model, + description: recommended.description, + imageUrl: recommended.imageUrl, + resizedImageUrl: recommended.resizedImageUrl, + url: recommended.url, + deeplinkIos: recommended.deeplinkIos, + categories: recommended.categories.map { category in + ProductDto( + id: category.id, + name: category.name, + url: category.url, + alias: category.alias, + parentId: category.parentId + ) + }, + locations: recommended.locations, + price: recommended.price, + priceFormatted: recommended.priceFormatted, + priceFull: recommended.priceFull, + priceFullFormatted: recommended.priceFullFormatted, + oldPrice: recommended.oldPrice, + oldPriceFormatted: recommended.oldPriceFormatted, + oldPriceFull: recommended.oldPriceFull, + oldPriceFullFormatted: recommended.oldPriceFullFormatted, + currency: recommended.currency, + salesRate: recommended.salesRate, + discount: recommended.discount, + rating: recommended.rating, + relativeSalesRate: recommended.relativeSalesRate, + paramsRaw: recommended.paramsRaw, + fashionOriginalSizes: recommended.fashionOriginalSizes, + fashionSizes: recommended.fashionSizes, + fashionColors: recommended.fashionColors, + resizedImages: recommended.resizedImages + ) + } } } diff --git a/Podfile.lock b/Podfile.lock index 49afd44..557cfa5 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - REES46 (3.6.19) + - REES46 (3.6.23) DEPENDENCIES: - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) @@ -12,12 +12,12 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: REES46: - :commit: a7dc0ba52750cc671ff34e5cbf52b98b0aae61d9 + :commit: b8ed253322fdc67d191acdddd51efc5a3e0ab7a0 :git: https://github.com/rees46/ios-sdk.git :tag: 3.6.19 SPEC CHECKSUMS: - REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb + REES46: 8c66b0fdb9f0a6c62a15fb04fafe621b2952149b PODFILE CHECKSUM: 95734e4d6187b8b6d19278bbb7d9a6acdb94da14 diff --git a/Pods/Local Podspecs/REES46.podspec.json b/Pods/Local Podspecs/REES46.podspec.json index f831106..6c33854 100644 --- a/Pods/Local Podspecs/REES46.podspec.json +++ b/Pods/Local Podspecs/REES46.podspec.json @@ -1,6 +1,6 @@ { "name": "REES46", - "version": "3.6.19", + "version": "3.6.23", "summary": "REES46 SDK for iOS platform - the wide toolset for eCommerce apps. This SDK can be used to integrate in your own app for iOS in few steps.", "readme": "https://reference.api.rees46.com/#{spec.version.to_s}/README.md", "description": "REES46 SDK for iOS platform - the wide toolset for eCommerce apps:\n\n- Personalization engine.\n- Product recommendations.\n- Personalized products search engine.\n- Bulk emails, push-notifications, SMS and Telegram messages.\n- Transactional emails, push-notifications, Telegram and SMS.\n- Drip campaigns (email, push, Telegram, SMS).\n- Customizable on-site popups.\n- CRM, CDP and customer segments.\n- Net Promoter Score tool for any goal.\n- Stories.\n- In-app push.\n- Loyalty program.\n\nYou can integrate all REES46 tools into your iOS app.", @@ -19,7 +19,7 @@ "source": { "git": "https://github.com/rees46/ios-sdk.git", "branch": "master", - "tag": "3.6.19" + "tag": "3.6.23" }, "platforms": { "ios": "12.0" diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 49afd44..557cfa5 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,5 +1,5 @@ PODS: - - REES46 (3.6.19) + - REES46 (3.6.23) DEPENDENCIES: - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) @@ -12,12 +12,12 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: REES46: - :commit: a7dc0ba52750cc671ff34e5cbf52b98b0aae61d9 + :commit: b8ed253322fdc67d191acdddd51efc5a3e0ab7a0 :git: https://github.com/rees46/ios-sdk.git :tag: 3.6.19 SPEC CHECKSUMS: - REES46: 687320dccba92b13654a5ea57c355bd1f0aed8eb + REES46: 8c66b0fdb9f0a6c62a15fb04fafe621b2952149b PODFILE CHECKSUM: 95734e4d6187b8b6d19278bbb7d9a6acdb94da14 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index fa7af2d..f5b391c 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -268,10 +268,10 @@ 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoaderError.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift; sourceTree = ""; }; 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryButton.swift; path = REES46/Classes/Button/StoryButton.swift; sourceTree = ""; }; 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserSettings.swift; path = REES46/Classes/Model/UserSettings.swift; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 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; }; 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBTextConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift; sourceTree = ""; }; 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsResponse.swift; path = REES46/Classes/Model/ProductsResponse.swift; sourceTree = ""; }; - A05E795ECA6FF0F5767E433F8FE8625C /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios"; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideViewController.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift; sourceTree = ""; }; A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift; sourceTree = ""; }; A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoFileUtils.swift; path = REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift; sourceTree = ""; }; @@ -512,13 +512,14 @@ 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */, A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */, ); + name = REES46; path = REES46; sourceTree = ""; }; 45F05160E1AA18223A137E9876780947 /* Products */ = { isa = PBXGroup; children = ( - A05E795ECA6FF0F5767E433F8FE8625C /* Pods_demo_store_ios.framework */, + A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */, 3671B3C220D01E22000CF41146C2B4AB /* REES46 */, ); name = Products; @@ -647,7 +648,7 @@ ); name = "Pods-demo-store-ios"; productName = Pods_demo_store_ios; - productReference = A05E795ECA6FF0F5767E433F8FE8625C /* Pods_demo_store_ios.framework */; + productReference = A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ diff --git a/Pods/REES46/REES46/Classes/PersonalizationSDK.swift b/Pods/REES46/REES46/Classes/PersonalizationSDK.swift index bb4970a..e37f9b6 100644 --- a/Pods/REES46/REES46/Classes/PersonalizationSDK.swift +++ b/Pods/REES46/REES46/Classes/PersonalizationSDK.swift @@ -117,7 +117,15 @@ public protocol PersonalizationSDK { func search(query: String, limit: Int?, offset: Int?, categoryLimit: Int?, categories: String?, extended: String?, sortBy: String?, sortDir: String?, locations: String?, brands: String?, filters: [String: Any]?, priceMin: Double?, priceMax: Double?, colors: [String]?, fashionSizes: [String]?, exclude: String?, email: String?, timeOut: Double?, disableClarification: Bool?, completion: @escaping(Result) -> Void) func notificationClicked(type: String, code: String, completion: @escaping (Result) -> Void) func notificationReceived(type: String, code: String, completion: @escaping (Result) -> Void) - func subscribeForBackInStock(id: String, email: String?, phone: String?, fashionSize: [String]?, completion: @escaping(Result) -> Void) + func subscribeForBackInStock( + id: String, + email: String?, + phone: String?, + fashionSize: String?, + fashionColor: String?, + barcode: String?, + completion: @escaping(Result) -> Void + ) func unsubscribeForBackInStock(itemIds: [String], email: String?, phone: String? , completion: @escaping (Result) -> Void) func subscribeForPriceDrop(id: String, currentPrice: Double, email: String?, phone: String?, completion: @escaping(Result) -> Void) func getStories(code: String, completion: @escaping(Result) -> Void) @@ -158,15 +166,7 @@ public extension PersonalizationSDK { getProductsFromCart(completion: completion) } - func search( - query: String, - limit: Int? = nil, - offset: Int? = nil, - categoryLimit: Int? = nil, - categories: String? = nil, - extended: String? = nil, - sortBy: String? = nil, - sortDir: String? = nil, locations: String? = nil, brands: String? = nil, filters: [String: Any]? = nil, priceMin: Double? = nil, priceMax: Double? = nil, colors: [String]? = nil, fashionSizes: [String]? = nil, exclude: String? = nil, email: String? = nil, timeOut: Double? = nil, disableClarification: Bool? = nil, completion: @escaping(Result) -> Void) { + func search(query: String, limit: Int? = nil, offset: Int? = nil, categoryLimit: Int? = nil, categories: String? = nil, extended: String? = nil, sortBy: String? = nil, sortDir: String? = nil, locations: String? = nil, brands: String? = nil, filters: [String: Any]? = nil, priceMin: Double? = nil, priceMax: Double? = nil, colors: [String]? = nil, fashionSizes: [String]? = nil, exclude: String? = nil, email: String? = nil, timeOut: Double? = nil, disableClarification: Bool? = nil, completion: @escaping(Result) -> Void) { search(query: query, limit: limit, offset: offset, categoryLimit: categoryLimit, categories: categories, extended: extended, sortBy: sortBy, sortDir: sortDir, locations: locations, brands: brands, filters: filters, priceMin: priceMin, priceMax: priceMax, colors: colors, fashionSizes: fashionSizes, exclude: exclude, email: email, timeOut: timeOut, disableClarification: disableClarification, completion: completion) } @@ -182,8 +182,24 @@ public extension PersonalizationSDK { notificationClicked(type: type, code: code, completion: completion) } - func subscribeForBackInStock(id: String, email: String? = nil, phone: String? = nil, fashionSize: [String]? = nil, completion: @escaping (Result) -> Void) { - subscribeForBackInStock(id: id, email: email, phone: phone, fashionSize: fashionSize, completion: completion) + func subscribeForBackInStock( + id: String, + email: String? = nil, + phone: String? = nil, + fashionSize: String? = nil, + fashionColor: String? = nil, + barcode: String? = nil, + completion: @escaping (Result) -> Void + ) { + subscribeForBackInStock( + id: id, + email: email, + phone: phone, + fashionSize: fashionSize, + fashionColor:fashionColor, + barcode: barcode, + completion: completion + ) } func unsubscribeForBackInStock(itemIds: [String], email: String? = nil, phone: String? = nil, completion: @escaping (Result) -> Void) { diff --git a/Pods/REES46/REES46/Classes/ServiceProtocols/SubscriptionService.swift b/Pods/REES46/REES46/Classes/ServiceProtocols/SubscriptionService.swift index 0f40e9c..e47d929 100644 --- a/Pods/REES46/REES46/Classes/ServiceProtocols/SubscriptionService.swift +++ b/Pods/REES46/REES46/Classes/ServiceProtocols/SubscriptionService.swift @@ -2,9 +2,32 @@ import Foundation protocol SubscriptionService { - func subscribeForPriceDrop(id: String, currentPrice: Double, email: String?, phone: String?, completion: @escaping (Result) -> Void) - func subscribeForBackInStock(id: String, email: String?, phone: String?, fashionSize: [String]?, completion: @escaping (Result) -> Void) - func unsubscribeForBackInStock(itemIds: [String], email: String?, phone: String?, completion: @escaping (Result) -> Void) + + func subscribeForPriceDrop( + id: String, + currentPrice: Double, + email: String?, + phone: String?, + completion: @escaping (Result) -> Void + ) + + func subscribeForBackInStock( + id: String, + email: String?, + phone: String?, + fashionSize: String?, + fashionColor: String?, + barcode: String?, + completion: @escaping (Result) -> Void + ) + + func unsubscribeForBackInStock( + itemIds: [String], + email: String?, + phone: String?, + completion: @escaping (Result) -> Void + ) + func manageSubscription( email: String?, phone: String?, diff --git a/Pods/REES46/REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift b/Pods/REES46/REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift index 23da572..050d846 100644 --- a/Pods/REES46/REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift +++ b/Pods/REES46/REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift @@ -26,6 +26,8 @@ class SubscriptionServiceImpl: SubscriptionService { static let itemIds = "item_ids" static let properties = "properties" static let fashionSize = "fashion_size" + static let fashionColor = "fashion_color" + static let barcode = "barcode" static let email = "email" static let phone = "phone" static let price = "price" @@ -95,7 +97,9 @@ class SubscriptionServiceImpl: SubscriptionService { id: String, email: String? = nil, phone: String? = nil, - fashionSize: [String]? = nil, + fashionSize: String? = nil, + fashionColor: String? = nil, + barcode: String? = nil, completion: @escaping (Result) -> Void ) { guard let sdk = sdk else { @@ -113,9 +117,20 @@ class SubscriptionServiceImpl: SubscriptionService { Constants.itemId: id ] + let properties = NSMutableDictionary() + if let fashionSize = fashionSize { - let tmpSizesArray = sdk.generateString(array: fashionSize) - params[Constants.properties] = [Constants.fashionSize: tmpSizesArray] + properties[Constants.fashionSize] = fashionSize + } + if let fashionColor = fashionColor { + properties[Constants.fashionColor] = fashionColor + } + if let barcode = barcode { + properties[Constants.barcode] = barcode + } + + if properties.count > 0 { + params[Constants.properties] = properties } if let email = email { diff --git a/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift b/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift index 68050d6..0969e3c 100644 --- a/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift +++ b/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift @@ -1,11 +1,3 @@ -// -// SimplePersonaliztionSDK.swift -// REES46 -// -// Created by REES46 -// Copyright (c) 2023. All rights reserved. -// - import UIKit import Foundation import AdSupport @@ -17,6 +9,8 @@ class SimplePersonalizationSDK: PersonalizationSDK { struct Constants { static let shopId: String = "shop_id" + static let deviceIdKey = "device_id" + static let deviceToken = "device_token" static let searchQuery: String = "search_query" static let deviceId: String = "did" static let userSeance: String = "seance" @@ -44,12 +38,10 @@ class SimplePersonalizationSDK: PersonalizationSDK { } var storiesCode: String? - var shopId: String var deviceId: String var userSeance: String var stream: String - var baseURL: String let baseInitJsonFileName = ".json" let autoSendPushToken: Bool @@ -60,18 +52,13 @@ class SimplePersonalizationSDK: PersonalizationSDK { var userEmail: String? var userPhone: String? var userLoyaltyId: String? - var segment: String var urlSession: URLSession - var userInfo: InitResponse = InitResponse() let sessionQueue = SessionQueue.manager - private var requestOperation: RequestOperation? - let bodyMutableData = NSMutableData() - private let initSemaphore = DispatchSemaphore(value: 0) private let serialSemaphore = DispatchSemaphore(value: 0) @@ -106,13 +93,17 @@ class SimplePersonalizationSDK: PersonalizationSDK { autoSendPushToken: Bool = true, completion: ((SDKError?) -> Void)? = nil ) { - - self.shopId = shopId self.autoSendPushToken = autoSendPushToken global_EL = enableLogs - self.baseURL = "https://" + apiDomain + "/" + +#if DEBUG + let basePath = ProcessInfo.processInfo.environment["BASE_PATH"] ?? "" +#else + let basePath = apiDomain +#endif + self.baseURL = "https://" + basePath + "/" self.userEmail = userEmail self.userPhone = userPhone @@ -127,7 +118,7 @@ class SimplePersonalizationSDK: PersonalizationSDK { segment = ["A", "B"].randomElement() ?? "A" // Trying to fetch user session (permanent user Id) - deviceId = UserDefaults.standard.string(forKey: "device_id") ?? "" + deviceId = UserDefaults.standard.string(forKey: Constants.deviceIdKey) ?? "" urlSession = URLSession.shared sessionQueue.addOperation { @@ -138,25 +129,24 @@ class SimplePersonalizationSDK: PersonalizationSDK { self.userInfo = res self.userSeance = res.seance self.deviceId = res.deviceId - if let completion = completion { - completion(nil) + completion?(nil) + // Automatically handle push token if autoSendPushToken is true + if self.autoSendPushToken { + self.handleAutoSendPushToken() } } else { - if let completion = completion { - completion(.decodeError) - } + completion?(.decodeError) } self.initSemaphore.signal() case .failure(let error): - if let completion = completion { - completion(error) - } + completion?(error) self.initSemaphore.signal() - break } } self.initSemaphore.wait() } + + initializeNotificationRegistrar() } func getDeviceId() -> String { @@ -179,8 +169,65 @@ class SimplePersonalizationSDK: PersonalizationSDK { pushTokenService.setPushToken(token: token, isFirebaseNotification: isFirebaseNotification, completion: completion) } - func getAllNotifications(type: String, phone: String? = nil, email: String? = nil, userExternalId: String? = nil, userLoyaltyId: String? = nil, channel: String?, limit: Int?, page: Int?, dateFrom: String?, completion: @escaping (Result) -> Void) { - notificationService.getAllNotifications(type: type, phone: phone, email: email, userExternalId: userExternalId, userLoyaltyId: userLoyaltyId, channel: channel, limit: limit, page: page, dateFrom: dateFrom, completion: completion) + private func initializeNotificationRegistrar() { + if autoSendPushToken { + UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { [weak self] granted, error in + guard let self = self else { return } + + if granted { + DispatchQueue.main.async { + UIApplication.shared.registerForRemoteNotifications() + } + + // Attempt to send the push token if available + if let deviceToken = UserDefaults.standard.data(forKey: Constants.deviceToken) { + let notificationRegistrar = NotificationRegistrar(sdk: self) + notificationRegistrar.registerWithDeviceToken(deviceToken: deviceToken) + } + } else if let error = error { +#if DEBUG + print("Error requesting notification authorization: \(error.localizedDescription)") +#endif + } + } + } else { +#if DEBUG + print("Auto-send push token is disabled.") +#endif + } + } + + private func handleAutoSendPushToken() { + if let deviceToken = UserDefaults.standard.data(forKey: Constants.deviceToken) { + let notificationRegistrar = NotificationRegistrar(sdk: self) + notificationRegistrar.registerWithDeviceToken(deviceToken: deviceToken) + } + } + + func getAllNotifications( + type: String, + phone: String? = nil, + email: String? = nil, + userExternalId: String? = nil, + userLoyaltyId: String? = nil, + channel: String?, + limit: Int?, + page: Int?, + dateFrom: String?, + completion: @escaping (Result) -> Void + ) { + notificationService.getAllNotifications( + type: type, + phone: phone, + email: email, + userExternalId: userExternalId, + userLoyaltyId: userLoyaltyId, + channel: channel, + limit: limit, + page: page, + dateFrom: dateFrom, + completion: completion + ) } func configureURLSession(configuration: URLSessionConfiguration) { @@ -249,14 +296,15 @@ class SimplePersonalizationSDK: PersonalizationSDK { func search(query: String, limit: Int?, offset: Int?, categoryLimit: Int?, categories: String?, extended: String?, sortBy: String?, sortDir: String?, locations: String?, brands: String?, filters: [String: Any]?, priceMin: Double?, priceMax: Double?, colors: [String]?, fashionSizes: [String]?, exclude: String?, email: String?, timeOut: Double?, disableClarification: Bool?, completion: @escaping (Result) -> Void) { sessionQueue.addOperation { - let path = "search" var params: [String: String] = [ - "shop_id": self.shopId, - "did": self.deviceId, - "sid": self.userSeance, - "type": "full_search", - "search_query": query, + Constants.shopId: self.shopId, + Constants.deviceId: self.deviceId, + Constants.userSeance: self.userSeance, + Constants.segment: Constants.type, + Constants.segment: self.segment, + Constants.type: "full_search", + Constants.searchQuery: query, ] if let limit = limit { @@ -762,8 +810,24 @@ class SimplePersonalizationSDK: PersonalizationSDK { ) } - func subscribeForBackInStock(id: String, email: String? = nil, phone: String? = nil, fashionSize: [String]? = nil, completion: @escaping (Result) -> Void) { - subscriptionService.subscribeForBackInStock(id: id, email: email, phone: phone, fashionSize: fashionSize, completion: completion) + func subscribeForBackInStock( + id: String, + email: String? = nil, + phone: String? = nil, + fashionSize: String? = nil, + fashionColor: String? = nil, + barcode: String? = nil, + completion: @escaping (Result) -> Void + ) { + subscriptionService.subscribeForBackInStock( + id: id, + email: email, + phone: phone, + fashionSize: fashionSize, + fashionColor: fashionColor, + barcode: barcode, + completion: completion + ) } func unsubscribeForBackInStock(itemIds: [String], email: String? = nil, phone: String? = nil, completion: @escaping (Result) -> Void) { diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift index 15d7779..cc793aa 100644 --- a/Pods/REES46/REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift @@ -823,9 +823,6 @@ class StoryCollectionViewCell: UICollectionViewCell { UserDefaults.standard.set(currentSlide.id, forKey: "LastViewedSlideMemorySetting") - //#warning ("TODO Production") - //cellDelegate?.didTapUrlButton(url: promoCodeDeeplinkIos, slide: currentSlide) - cellDelegate?.sendStructSelectedPromocodeSlide(promoCodeSlide: selectedPromoCodeElement!) cellDelegate?.didTapOpenLinkExternalServiceMethod(url: promoCodeDeeplinkIos, slide: currentSlide) return diff --git a/Pods/REES46/REES46/Classes/Stories/StoryViewController/StoryViewController.swift b/Pods/REES46/REES46/Classes/Stories/StoryViewController/StoryViewController.swift index a16107f..36a2862 100644 --- a/Pods/REES46/REES46/Classes/Stories/StoryViewController/StoryViewController.swift +++ b/Pods/REES46/REES46/Classes/Stories/StoryViewController/StoryViewController.swift @@ -782,6 +782,10 @@ class StoryViewController: UINavigationController, UINavigationControllerDelegat } public func openUrl(link: String) { +#if DEBUG + print("Opening product in device browser") +#endif + if let linkUrl = URL(string: link) { pauseTimer() @@ -791,10 +795,12 @@ class StoryViewController: UINavigationController, UINavigationControllerDelegat NotificationCenter.default.addObserver(self, selector: #selector(continueTimer), name: Notification.Name("WebKitClosedContinueTimerSetting"), object: nil) } - presentInternalSdkWebKit(webUrl: linkUrl, completion: nil) + UIApplication.shared.open(linkUrl, options: [:], completionHandler: nil) let sIdDetect: String = UserDefaults.standard.string(forKey: "LastViewedSlideMemorySetting") ?? "" NotificationCenter.default.post(name: .init(rawValue: "PauseVideoLongTap"), object: nil, userInfo: ["slideID": sIdDetect]) + + dismiss(animated: true) } } diff --git a/Pods/REES46/REES46/Classes/services/notification/events/RegisterNotification.swift b/Pods/REES46/REES46/Classes/services/notification/events/RegisterNotification.swift index fb4a2fe..5e8ebe0 100644 --- a/Pods/REES46/REES46/Classes/services/notification/events/RegisterNotification.swift +++ b/Pods/REES46/REES46/Classes/services/notification/events/RegisterNotification.swift @@ -2,47 +2,56 @@ import Foundation import UIKit class NotificationRegistrar { + private let sdk: PersonalizationSDK - private let mainPushTokenLastUploadDateKey = "mainPushTokenLastUploadDateKey" - + + struct Constants { + static let deviceIdKey = "device_id" + static let mainPushTokenLastUploadDateKey = "mainPushTokenLastUploadDateKey" + static let oneWeekInSeconds: TimeInterval = 7 * 24 * 60 * 60 + } + init(sdk: PersonalizationSDK) { self.sdk = sdk } - + func registerWithDeviceToken(deviceToken: Data) { - guard let sdk = sdk as? SimplePersonalizationSDK, - sdk.autoSendPushToken == true - else { return } - - if let pushTokenLastUpdateDate = UserDefaults.standard.object(forKey: self.mainPushTokenLastUploadDateKey) as? Date { + if let pushTokenLastUpdateDate = UserDefaults.standard.object(forKey: Constants.mainPushTokenLastUploadDateKey) as? Date { let currentDate = Date() let timeSincePushTokenLastUpdate = currentDate.timeIntervalSince(pushTokenLastUpdateDate) - let oneWeekInSeconds: TimeInterval = 7 * 24 * 60 * 60 - - guard timeSincePushTokenLastUpdate >= oneWeekInSeconds else { + guard timeSincePushTokenLastUpdate >= Constants.oneWeekInSeconds else { + // Token was sent within the last week; no need to send again + let nextPossibleSendDate = pushTokenLastUpdateDate.addingTimeInterval(Constants.oneWeekInSeconds) +#if DEBUG + print("Push token already sent recently. Next possible send date: \(nextPossibleSendDate)") +#endif return } } - + let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() sdk.setPushTokenNotification(token: token) { [weak self] tokenResponse in guard let self = self else { return } switch tokenResponse { case .success(): - UserDefaults.standard.setValue(Date(), forKey: self.mainPushTokenLastUploadDateKey) - return + let currentDate = Date() + UserDefaults.standard.setValue(currentDate, forKey: Constants.mainPushTokenLastUploadDateKey) + let nextPossibleSendDate = currentDate.addingTimeInterval(Constants.oneWeekInSeconds) +#if DEBUG + print("Push token successfully sent. Last upload date: \(currentDate). Next possible send date: \(nextPossibleSendDate)") +#endif case .failure(let error): self.handleRegistrationError(error) } } } - + private func handleRegistrationError(_ error: SDKError) { switch error { case let .custom(customError): print("SDK Push Token Error:", customError) default: - print("SDK Push Token server, \(error.description)\n") + print("SDK Push Token server error: \(error.description)\n") } } } diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig index 3d3516b..f6da505 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" +OTHER_LDFLAGS = $(inherited) -framework "REES46" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/REES46/REES46-Info.plist b/Pods/Target Support Files/REES46/REES46-Info.plist index bd1dfc7..cbd119e 100644 --- a/Pods/Target Support Files/REES46/REES46-Info.plist +++ b/Pods/Target Support Files/REES46/REES46-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.6.19 + 3.6.23 CFBundleSignature ???? CFBundleVersion diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 7f93263..ed9506c 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -23,9 +23,6 @@ 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */; }; 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; - 75674CF52C3D92CC007FAB88 /* ProductDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* ProductDto.swift */; }; - 75674CF72C3D92E0007FAB88 /* RecommendedProductDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */; }; - 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */; }; 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */; }; 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D022C3DA14F007FAB88 /* RatingConverter.swift */; }; @@ -71,7 +68,6 @@ 75E97A2F2C5023B10081B069 /* SearchFashionColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */; }; 75E97A302C5023B10081B069 /* SearchFashionColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */; }; 75E97A312C5023B10081B069 /* SearchFashionColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */; }; - 75E97A372C5024280081B069 /* SearchProductResponseMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A342C5024280081B069 /* SearchProductResponseMapper.swift */; }; 75E97A392C5024CD0081B069 /* SearchProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.swift */; }; 75E97A3A2C5024CD0081B069 /* SearchProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.swift */; }; 75E97A3B2C5024CD0081B069 /* SearchProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.swift */; }; @@ -90,9 +86,10 @@ 75E97A4D2C50255A0081B069 /* SearchPriceRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */; }; 75E97A4E2C50255A0081B069 /* SearchPriceRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */; }; 75E97A4F2C50255A0081B069 /* SearchPriceRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */; }; - 75E97A522C50257D0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */; }; - 75E97A532C50257D0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */; }; - 75E97A542C50257D0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */; }; + 75E97A5A2C502DBF0081B069 /* SearchProductResponseMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A342C5024280081B069 /* SearchProductResponseMapper.swift */; }; + 75E97A5F2C502F3C0081B069 /* Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Product.swift */; }; + 75E97A642C50320F0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; + 75E97A652C50320F0081B069 /* RecommendedProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */; }; 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */; }; 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; @@ -150,8 +147,8 @@ 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; - 75674CF42C3D92CC007FAB88 /* ProductDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDto.swift; sourceTree = ""; }; - 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductDto.swift; sourceTree = ""; }; + 75674CF42C3D92CC007FAB88 /* Product.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Product.swift; sourceTree = ""; }; + 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProduct.swift; sourceTree = ""; }; 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortRecommendationListView.swift; sourceTree = ""; }; 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageLoader.swift; sourceTree = ""; }; @@ -195,7 +192,6 @@ 75E97A442C5025240081B069 /* SearchQuery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchQuery.swift; sourceTree = ""; }; 75E97A482C50253A0081B069 /* SearchSuggest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSuggest.swift; sourceTree = ""; }; 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPriceRange.swift; sourceTree = ""; }; - 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; @@ -278,6 +274,7 @@ 75E979842C4935170081B069 /* Core */, 75B935552C3564360063E814 /* App */, 75E979942C49561B0081B069 /* Feature */, + 75ECCD152C36D6B400D6D346 /* Resources */, 75B935542C3564360063E814 /* Products */, 8FED5CC7CDC6607CEFB8FDC9 /* Pods */, ECE8154AB54931A903490932 /* Frameworks */, @@ -298,8 +295,8 @@ isa = PBXGroup; children = ( 75E979E12C4AE4630081B069 /* Views */, - 75ECCD182C36F92A00D6D346 /* Navigation */, 75E97A1F2C501E650081B069 /* ViewModels */, + 75ECCD182C36F92A00D6D346 /* Navigation */, 75E97A112C50199F0081B069 /* Models */, 75B9355C2C3564370063E814 /* Preview Content */, 75B935562C3564360063E814 /* DemoStoreApp.swift */, @@ -321,7 +318,6 @@ children = ( 75ECCD1B2C37F09100D6D346 /* DI */, 75674CFF2C3DA0EC007FAB88 /* Utils */, - 75ECCD152C36D6B400D6D346 /* Resources */, 75E979852C4935170081B069 /* Core.h */, ); path = Core; @@ -552,8 +548,8 @@ 75E979C32C495B7E0081B069 /* Model */ = { isa = PBXGroup; children = ( - 75674CF42C3D92CC007FAB88 /* ProductDto.swift */, - 75674CF62C3D92E0007FAB88 /* RecommendedProductDto.swift */, + 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */, + 75674CF42C3D92CC007FAB88 /* Product.swift */, ); path = Model; sourceTree = ""; @@ -579,7 +575,6 @@ 75E979C52C495BC30081B069 /* Mapper */ = { isa = PBXGroup; children = ( - 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */, ); path = Mapper; sourceTree = ""; @@ -688,8 +683,8 @@ 75E97A332C5024010081B069 /* Mapper */ = { isa = PBXGroup; children = ( + 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */, 75E97A342C5024280081B069 /* SearchProductResponseMapper.swift */, - 75E97A512C50257D0081B069 /* RecommendedProductMapper.swift */, ); path = Mapper; sourceTree = ""; @@ -700,7 +695,8 @@ 75B9355A2C3564370063E814 /* Assets.xcassets */, 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */, ); - path = Resources; + name = Resources; + path = Core/Resources; sourceTree = ""; }; 75ECCD182C36F92A00D6D346 /* Navigation */ = { @@ -935,7 +931,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75E97A642C50320F0081B069 /* RecommendedProductMapper.swift in Sources */, + 75E97A652C50320F0081B069 /* RecommendedProduct.swift in Sources */, 752F1D3A2C41E01D002D4AC3 /* ProductCartItemDto.swift in Sources */, + 75E97A5F2C502F3C0081B069 /* Product.swift in Sources */, 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */, 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */, 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, @@ -946,10 +945,8 @@ 75E97A452C5025240081B069 /* SearchQuery.swift in Sources */, 75E97A412C5025080081B069 /* SearchCategory.swift in Sources */, 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */, - 75674CF72C3D92E0007FAB88 /* RecommendedProductDto.swift in Sources */, 75E97A492C50253A0081B069 /* SearchSuggest.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, - 75E97A522C50257D0081B069 /* RecommendedProductMapper.swift in Sources */, 75E979E72C4AE8870081B069 /* TabItem.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */, @@ -963,7 +960,6 @@ 75E97A2F2C5023B10081B069 /* SearchFashionColor.swift in Sources */, 75E97A172C501B120081B069 /* ScreenWrapper.swift in Sources */, 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, - 75674CFC2C3D9964007FAB88 /* RecommendedProductMapper.swift in Sources */, 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */, 75B935592C3564360063E814 /* ContentView.swift in Sources */, 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */, @@ -974,6 +970,7 @@ 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */, 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, 75E97A232C5023600081B069 /* SearchFilter.swift in Sources */, + 75E97A5A2C502DBF0081B069 /* SearchProductResponseMapper.swift in Sources */, 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.swift in Sources */, 75E97A4D2C50255A0081B069 /* SearchPriceRange.swift in Sources */, 75E979F12C4D2DBE0081B069 /* Timer.swift in Sources */, @@ -991,7 +988,6 @@ 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, - 75674CF52C3D92CC007FAB88 /* ProductDto.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1001,7 +997,6 @@ files = ( 75E97A302C5023B10081B069 /* SearchFashionColor.swift in Sources */, 75E97A3A2C5024CD0081B069 /* SearchProduct.swift in Sources */, - 75E97A532C50257D0081B069 /* RecommendedProductMapper.swift in Sources */, 75E97A4A2C50253A0081B069 /* SearchSuggest.swift in Sources */, 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */, 75E97A422C5025080081B069 /* SearchCategory.swift in Sources */, @@ -1020,7 +1015,6 @@ files = ( 75E97A312C5023B10081B069 /* SearchFashionColor.swift in Sources */, 75E97A4B2C50253A0081B069 /* SearchSuggest.swift in Sources */, - 75E97A372C5024280081B069 /* SearchProductResponseMapper.swift in Sources */, 75E97A4F2C50255A0081B069 /* SearchPriceRange.swift in Sources */, 75E97A472C5025240081B069 /* SearchQuery.swift in Sources */, 75E97A432C5025080081B069 /* SearchCategory.swift in Sources */, @@ -1028,7 +1022,6 @@ 75E97A252C5023600081B069 /* SearchFilter.swift in Sources */, 75E97A292C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, 75E97A3B2C5024CD0081B069 /* SearchProduct.swift in Sources */, - 75E97A542C50257D0081B069 /* RecommendedProductMapper.swift in Sources */, 75E97A2D2C5023960081B069 /* SearchFashionSize.swift in Sources */, 75E97A3F2C5024EF0081B069 /* SearchRedirect.swift in Sources */, ); diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist index 6f8cfeb..cd0079d 100644 --- a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,12 +7,12 @@ Core.xcscheme_^#shared#^_ orderHint - 3 + 4 Feature.xcscheme_^#shared#^_ orderHint - 4 + 3 common.xcscheme_^#shared#^_ From 7ae37500189abb0c12a8c30350438afd44fce7a7 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Tue, 23 Jul 2024 21:11:58 +0200 Subject: [PATCH 66/85] refactor: Add environments and move utils in package --- App/Views/ContentView.swift | 8 +++---- App/Views/MainViews.swift | 12 ++++++++++ Core/DI/SdkManager.swift | 9 +++---- .../Views}/RatingConverter.swift | 0 .../Views}/RemoteImageLoader.swift | 0 demo-store-ios.xcodeproj/project.pbxproj | 24 +++++++++++++++++-- .../xcschemes/demo-store-ios.xcscheme | 22 +++++++++++++++++ 7 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 App/Views/MainViews.swift rename Core/{Utils => Presentation/Views}/RatingConverter.swift (100%) rename Core/{Utils => Presentation/Views}/RemoteImageLoader.swift (100%) diff --git a/App/Views/ContentView.swift b/App/Views/ContentView.swift index b8c484f..0ab8711 100644 --- a/App/Views/ContentView.swift +++ b/App/Views/ContentView.swift @@ -2,16 +2,16 @@ import SwiftUI struct ContentView: View { - @StateObject var navigationManager = NavigationManager(initialScreen: ScreenWrapper(screen: HomeScreenView())) + @StateObject var navigationManager = NavigationManager( + initialScreen: ScreenWrapper(screen: HomeScreenView()) + ) var body: some View { VStack(spacing: 0) { ToolbarView() .background(Color.black) - navigationManager.currentScreen.screen - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - .background(Color.white) + MainViews() BottomBarView() .frame(height: 70) diff --git a/App/Views/MainViews.swift b/App/Views/MainViews.swift new file mode 100644 index 0000000..a7f1199 --- /dev/null +++ b/App/Views/MainViews.swift @@ -0,0 +1,12 @@ +import Foundation +import SwiftUI + +struct MainViews: View { + @EnvironmentObject var navigationManager: NavigationManager + + var body: some View { + navigationManager.currentScreen.screen + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .background(Color.white) + } +} diff --git a/Core/DI/SdkManager.swift b/Core/DI/SdkManager.swift index 33e3569..86348d9 100644 --- a/Core/DI/SdkManager.swift +++ b/Core/DI/SdkManager.swift @@ -13,23 +13,20 @@ class SDKManager: SDKManaging { initializeSDK() } - private let SHOP_ID = "357382bf66ac0ce2f1722677c59511" - private let API_DOMAIN = "api.rees46.ru" private let USER_EMAIL: String? = nil private let USER_PHONE: String? = nil private let USER_LOYALTY_ID: String? = nil - private let SDK_STREAM = "ios" private let NOTIFICATION_TYPE = "DEMO NOTIFICATION TYPE" private let NOTIFICATION_ID = "DEMO NOTIFICATION ID" private func initializeSDK() { sdk = createPersonalizationSDK( - shopId: SHOP_ID, + shopId: ProcessInfo.processInfo.environment["SHOP_ID"] ?? "", userEmail: USER_EMAIL, userPhone: USER_PHONE, userLoyaltyId: USER_LOYALTY_ID, - apiDomain: API_DOMAIN, - stream: SDK_STREAM, + apiDomain: ProcessInfo.processInfo.environment["API_DOMAIN_PATH"] ?? "api.rees46.ru", + stream: ProcessInfo.processInfo.environment["SDK_STREAM"] ?? "ios", enableLogs: true, autoSendPushToken: true ) { error in diff --git a/Core/Utils/RatingConverter.swift b/Core/Presentation/Views/RatingConverter.swift similarity index 100% rename from Core/Utils/RatingConverter.swift rename to Core/Presentation/Views/RatingConverter.swift diff --git a/Core/Utils/RemoteImageLoader.swift b/Core/Presentation/Views/RemoteImageLoader.swift similarity index 100% rename from Core/Utils/RemoteImageLoader.swift rename to Core/Presentation/Views/RemoteImageLoader.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index ed9506c..ccb017d 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -90,6 +90,7 @@ 75E97A5F2C502F3C0081B069 /* Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Product.swift */; }; 75E97A642C50320F0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; 75E97A652C50320F0081B069 /* RecommendedProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */; }; + 75E97A6B2C5037130081B069 /* MainViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A6A2C5037130081B069 /* MainViews.swift */; }; 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */; }; 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; @@ -192,6 +193,7 @@ 75E97A442C5025240081B069 /* SearchQuery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchQuery.swift; sourceTree = ""; }; 75E97A482C50253A0081B069 /* SearchSuggest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSuggest.swift; sourceTree = ""; }; 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPriceRange.swift; sourceTree = ""; }; + 75E97A6A2C5037130081B069 /* MainViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViews.swift; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; @@ -261,8 +263,6 @@ 75674CFF2C3DA0EC007FAB88 /* Utils */ = { isa = PBXGroup; children = ( - 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */, - 75674D022C3DA14F007FAB88 /* RatingConverter.swift */, 75E979F02C4D2DBE0081B069 /* Timer.swift */, ); path = Utils; @@ -316,6 +316,7 @@ 75E979842C4935170081B069 /* Core */ = { isa = PBXGroup; children = ( + 75E97A6C2C5037730081B069 /* Presentation */, 75ECCD1B2C37F09100D6D346 /* DI */, 75674CFF2C3DA0EC007FAB88 /* Utils */, 75E979852C4935170081B069 /* Core.h */, @@ -594,6 +595,7 @@ 75E97A142C501A7D0081B069 /* Screens */, 75E97A152C501A930081B069 /* ToolBar */, 75E979E22C4AE4790081B069 /* BottomBar */, + 75E97A6A2C5037130081B069 /* MainViews.swift */, ); path = Views; sourceTree = ""; @@ -689,6 +691,23 @@ path = Mapper; sourceTree = ""; }; + 75E97A6C2C5037730081B069 /* Presentation */ = { + isa = PBXGroup; + children = ( + 75E97A6D2C50377C0081B069 /* Views */, + ); + path = Presentation; + sourceTree = ""; + }; + 75E97A6D2C50377C0081B069 /* Views */ = { + isa = PBXGroup; + children = ( + 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */, + 75674D022C3DA14F007FAB88 /* RatingConverter.swift */, + ); + path = Views; + sourceTree = ""; + }; 75ECCD152C36D6B400D6D346 /* Resources */ = { isa = PBXGroup; children = ( @@ -948,6 +967,7 @@ 75E97A492C50253A0081B069 /* SearchSuggest.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, 75E979E72C4AE8870081B069 /* TabItem.swift in Sources */, + 75E97A6B2C5037130081B069 /* MainViews.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */, 75E979DE2C4ADDD20081B069 /* RootScreenType.enum.swift in Sources */, diff --git a/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme index d1c2e67..27ab682 100644 --- a/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme +++ b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme @@ -74,6 +74,28 @@ ReferencedContainer = "container:demo-store-ios.xcodeproj"> + + + + + + + + + + Date: Tue, 23 Jul 2024 22:00:22 +0200 Subject: [PATCH 67/85] refactor: Move struct in package model --- Feature/Home/Model/ImageItem.swift | 7 +++++++ .../ListDiscoverProducts/ListDiscoverProductsView.swift | 8 ++------ .../Pods-demo-store-ios.release.xcconfig | 6 +++--- 3 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 Feature/Home/Model/ImageItem.swift diff --git a/Feature/Home/Model/ImageItem.swift b/Feature/Home/Model/ImageItem.swift new file mode 100644 index 0000000..d283b9c --- /dev/null +++ b/Feature/Home/Model/ImageItem.swift @@ -0,0 +1,7 @@ +import SwiftUI + +struct ImageItem { + let urlString: String + let type: String + let count: Int +} diff --git a/Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.swift b/Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.swift index 539e5ec..ffac579 100644 --- a/Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.swift +++ b/Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.swift @@ -1,12 +1,8 @@ import SwiftUI -struct ImageItem { - let urlString: String - let type: String - let count: Int -} - struct ListDiscoverProductsView: View { + + //TODO Use real data from SDK let imageItems: [ImageItem] = [ ImageItem(urlString: "https://m.media-amazon.com/images/I/71qqPTyiatS._AC_UY580_.jpg", type: "Summer style", count: 10), ImageItem(urlString: "https://ankerliebe.com/wp-content/uploads/2022/10/6f147a6d-b07c-43b9-9185-74516049e68a.jpg", type: "Evening style", count: 5), diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig index 3d3516b..f6da505 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "ImageIO" -framework "REES46" -framework "SDWebImage" -framework "SDWebImageSwiftUI" -weak_framework "Combine" -weak_framework "SwiftUI" +OTHER_LDFLAGS = $(inherited) -framework "REES46" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) From b18ade30a6fd4c4383a6293d02dc26a491f91308 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 24 Jul 2024 17:12:52 +0200 Subject: [PATCH 68/85] refactor: Add actual resolver, initialization view models,use cases and repositories. Add config variables and initializing services class for resolver. Moved files --- .gitignore | 152 ++++++++++------ App/DemoStoreApp.swift | 4 + App/Views/Screens/CartScreenView.swift | 78 ++++----- App/Views/Screens/HomeScreenView.swift | 90 +++++----- App/Views/Screens/ProductsScreenView.swift | 76 ++++---- App/Views/Screens/SettingsScreenView.swift | 56 +++--- Core/DI/DependenciesInitialization.swift | 11 ++ Core/DI/SdkManager.swift | 45 ----- Core/DI/SdkResolver.swift | 7 + Core/Presentation/Views/LoadingView.swift | 22 +++ Core/Utils/AppConvigVariables.swift | 9 + Feature/Cart/DI/CartResolver.swift | 23 +-- .../{ => Implementation}/CartRepository.swift | 10 +- .../Protocols/CartRepositoryProtocol.swift | 9 + .../ViewModel/CartViewModel.swift | 22 +-- Feature/Home/DI/HomeResolver.swift | 24 +-- .../UseCase/GetRecommendationsUseCase.swift | 10 +- .../Stories/HomeStoriesContainerView.swift | 1 - .../View/Stories/StoriesViewController.swift | 3 +- .../ViewModel/HomeViewModel.swift | 31 ++-- Feature/Product/DI/ProductsResolver.swift | 8 + .../View/ProductListItemView.swift | 3 +- .../ViewModel/ProductsViewModel.swift | 27 +++ Feature/Search/DI/SearchResolver.swift | 8 + .../Presentation/View/SearchScreenView.swift | 6 +- .../ViewModel/SearchViewModel.swift | 9 +- ...s-demo-store-ios-acknowledgements.markdown | 36 +--- ...Pods-demo-store-ios-acknowledgements.plist | 42 +---- ...os-frameworks-Debug-input-files.xcfilelist | 3 +- ...s-frameworks-Debug-output-files.xcfilelist | 3 +- ...-frameworks-Release-input-files.xcfilelist | 3 +- ...frameworks-Release-output-files.xcfilelist | 3 +- .../Pods-demo-store-ios-frameworks.sh | 6 +- demo-store-ios.xcodeproj/project.pbxproj | 163 +++++++++++++++--- .../xcschemes/demo-store-ios.xcscheme | 10 ++ 35 files changed, 569 insertions(+), 444 deletions(-) create mode 100644 Core/DI/DependenciesInitialization.swift delete mode 100644 Core/DI/SdkManager.swift create mode 100644 Core/DI/SdkResolver.swift create mode 100644 Core/Presentation/Views/LoadingView.swift create mode 100644 Core/Utils/AppConvigVariables.swift rename Feature/Cart/Domain/Repository/{ => Implementation}/CartRepository.swift (92%) create mode 100644 Feature/Cart/Domain/Repository/Protocols/CartRepositoryProtocol.swift create mode 100644 Feature/Product/DI/ProductsResolver.swift create mode 100644 Feature/Product/Presentation/ViewModel/ProductsViewModel.swift create mode 100644 Feature/Search/DI/SearchResolver.swift diff --git a/.gitignore b/.gitignore index 330d167..bd0a823 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,42 @@ +# Created by https://www.gitignore.io/api/xcode,swift,macos,objective-c + +### macOS ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Objective-C ### # Xcode # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore -## User settings -xcuserdata/ - -## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) -*.xcscmblueprint -*.xccheckout - -## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +## Build generated build/ DerivedData/ -*.moved-aside + +## Various settings *.pbxuser !default.pbxuser *.mode1v3 @@ -21,15 +45,59 @@ DerivedData/ !default.mode2v3 *.perspectivev3 !default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xccheckout +*.xcscmblueprint ## Obj-C/Swift specific *.hmap - -## App packaging *.ipa *.dSYM.zip *.dSYM +# CocoaPods - Refactored to standalone file + + +# Carthage - Refactored to standalone file + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/test_output +fastlane/Match/ +.env.default + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + +### Objective-C Patch ### + +### Swift ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated + +## Various settings + +## Other + +## Obj-C/Swift specific + ## Playgrounds timeline.xctimeline playground.xcworkspace @@ -39,52 +107,36 @@ playground.xcworkspace # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. # Packages/ # Package.pins -# Package.resolved -# *.xcodeproj -# -# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata -# hence it is not needed unless you have added a package configuration file to your project -# .swiftpm - .build/ -# CocoaPods -# -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control -# -# Pods/ -# -# Add this line if you want to avoid checking in source code from the Xcode workspace -# *.xcworkspace +# CocoaPods - Refactored to standalone file -# Carthage +# Carthage - Refactored to standalone file + +### Xcode ### +# Xcode # -# Add this line if you want to avoid checking in source code from Carthage dependencies. -# Carthage/Checkouts +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore -Carthage/Build/ +## Build generated -# Accio dependency management -Dependencies/ -.accio/ +## Various settings -# fastlane -# -# It is recommended to not store the screenshots in the git repo. -# Instead, use fastlane to re-generate the screenshots whenever they are needed. -# For more information about the recommended setup visit: -# https://docs.fastlane.tools/best-practices/source-control/#source-control +## Other -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots/**/*.png -fastlane/test_output +### Xcode Patch ### +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcworkspace/contents.xcworkspacedata +*.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +/*.gcno +*.xcworkspacedata +*.xcuserdata -# Code Injection -# -# After new code Injection tools there's a generated folder /iOSInjectionProject -# https://github.com/johnno1962/injectionforxcode +## Cocoapods ## +Pods/ -iOSInjectionProject/ +# End of https://www.gitignore.io/api/xcode,swift,macos,objective-c +/fastlane/fastlane/Appfile +/Gemfile.lock diff --git a/App/DemoStoreApp.swift b/App/DemoStoreApp.swift index a942cd1..6fdd39f 100644 --- a/App/DemoStoreApp.swift +++ b/App/DemoStoreApp.swift @@ -4,6 +4,10 @@ import SwiftUI struct DemoStoreApp: App { @StateObject private var appState = AppState() + init() { + DependenciesInitialization.initialize() + } + var body: some Scene { WindowGroup { if appState.showSplash { diff --git a/App/Views/Screens/CartScreenView.swift b/App/Views/Screens/CartScreenView.swift index 8b13498..eb175b7 100644 --- a/App/Views/Screens/CartScreenView.swift +++ b/App/Views/Screens/CartScreenView.swift @@ -1,5 +1,6 @@ import SwiftUI import Foundation +import Resolver extension CartScreenView: ScreenTypeProvider { static var screenType: RootScreenType { @@ -10,15 +11,12 @@ extension CartScreenView: ScreenTypeProvider { struct CartScreenView: View { @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var cartViewModel: CartViewModel - @State private var isLoading = true + @Injected var viewModel: CartViewModel - init(cartViewModel: CartViewModel = CartResolver.shared.resolveCartViewModel()) { - self.cartViewModel = cartViewModel - } + @State private var isLoading = true var totalPrice: Int { - let total = cartViewModel.cartItems.reduce(0) { (result, cartItem) in + let total = viewModel.cartItems.reduce(0) { (result, cartItem) in if let priceString = cartItem.product.priceFormatted, let price = Int(priceString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) { return result + (price * cartItem.quantity) @@ -29,49 +27,39 @@ struct CartScreenView: View { } var body: some View { - NavigationView { - ScrollView { - VStack(spacing: 0) { - Spacer().frame(height: 20) + ScrollView { + VStack(spacing: 0) { + Spacer().frame(height: 20) + + if isLoading { + LoadingView(isLoading: $isLoading) + } else if viewModel.cartItems.isEmpty { + EmptyCartView() + .frame(height: 250) + } else { + CartListView( + cartItems: viewModel.cartItems, + removeFromCart: { productId in + viewModel.removeFromCart(productId: productId) + } + ).frame(height: 250) - if isLoading { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .onAppear { - Timer.after { - isLoading = false - } - } - .frame(height: 250) - } else if cartViewModel.cartItems.isEmpty { - EmptyCartView() - .frame(height: 250) - } else { - CartListView( - cartItems: cartViewModel.cartItems, - removeFromCart: { productId in - cartViewModel.removeFromCart(productId: productId) - } - ).frame(height: 250) - - TotalPriceSection(totalPrice: totalPrice) - - NavigationButtonsView( - navigationManager: navigationManager, - cartViewModel: cartViewModel - ) - } + TotalPriceSection(totalPrice: totalPrice) - if !isLoading { - RecommendationSection(recommendedProducts: cartViewModel.recommenderProducts) - } + NavigationButtonsView( + navigationManager: navigationManager + ) } - .navigationBarTitle("cart_tab_title") - .onAppear { - navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) - cartViewModel.loadRecommenderRecommendations(currentProductId: "665") + + if !isLoading { + RecommendationSection(recommendedProducts: viewModel.recommenderProducts) } } + .navigationBarTitle("cart_tab_title") + .onAppear { + navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) + viewModel.loadRecommenderRecommendations(currentProductId: "665") + } } } } @@ -144,8 +132,8 @@ struct TotalPriceSection: View { } struct NavigationButtonsView: View { + @ObservedObject var navigationManager: NavigationManager - @ObservedObject var cartViewModel:CartViewModel var body: some View { VStack{ diff --git a/App/Views/Screens/HomeScreenView.swift b/App/Views/Screens/HomeScreenView.swift index 7588c5f..32fee52 100644 --- a/App/Views/Screens/HomeScreenView.swift +++ b/App/Views/Screens/HomeScreenView.swift @@ -1,5 +1,6 @@ import SwiftUI import Foundation +import Resolver extension HomeScreenView: ScreenTypeProvider { static var screenType: RootScreenType { @@ -8,65 +9,52 @@ extension HomeScreenView: ScreenTypeProvider { } struct HomeScreenView: View { - + @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var viewModel: HomeViewModel + @Injected var viewModel: HomeViewModel @State private var isLoading = true - - init(viewModel: HomeViewModel = HomeResolver.shared.resolve()) { - self.viewModel = viewModel - } var body: some View { - NavigationView { - ScrollView { - VStack(spacing: 16) { - if isLoading { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .onAppear { - Timer.after { - isLoading = false - } - } - .frame(height: 250) - } else { - - ListDiscoverProductsView() - - HomeStoriesContainerView() - - ShortRecommendationListView( - recommendedProducts: viewModel.arrivalsProducts, - title: NSLocalizedString("arrivals_title", comment: "") - ).onAppear { - viewModel.loadArrivalsRecommendations(currentProductId: "670") - } - - ShortRecommendationListView( - recommendedProducts: viewModel.topTrendProducts, - title: NSLocalizedString("top_trend_title", comment: "") - ).onAppear { - viewModel.loadTopTrendRecommendations(currentProductId: "656") - } - - ShortRecommendationListView( - recommendedProducts: viewModel.recommenderProducts, - title: NSLocalizedString("reccomender_title", comment: "") - ).onAppear { - viewModel.loadRecommenderRecommendations(currentProductId: "651") - } - + ScrollView { + VStack(spacing: 16) { + if isLoading { + LoadingView(isLoading: $isLoading) + } else { + + ListDiscoverProductsView() + + HomeStoriesContainerView() + + ShortRecommendationListView( + recommendedProducts: viewModel.arrivalsProducts, + title: NSLocalizedString("arrivals_title", comment: "") + ).onAppear { + viewModel.loadArrivalsRecommendations(currentProductId: "670") + } + + ShortRecommendationListView( + recommendedProducts: viewModel.topTrendProducts, + title: NSLocalizedString("top_trend_title", comment: "") + ).onAppear { + viewModel.loadTopTrendRecommendations(currentProductId: "656") } + + ShortRecommendationListView( + recommendedProducts: viewModel.recommenderProducts, + title: NSLocalizedString("reccomender_title", comment: "") + ).onAppear { + viewModel.loadRecommenderRecommendations(currentProductId: "651") + } + } - .padding(.vertical, 16) - .frame(maxWidth: .infinity, alignment: .top) - } - .navigationTitle("main_tab_title") - .onAppear { - navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) } + .padding(.vertical, 16) + .frame(maxWidth: .infinity, alignment: .top) + } + .navigationTitle("main_tab_title") + .onAppear { + navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) } } } diff --git a/App/Views/Screens/ProductsScreenView.swift b/App/Views/Screens/ProductsScreenView.swift index cb9c290..3e6e6ce 100644 --- a/App/Views/Screens/ProductsScreenView.swift +++ b/App/Views/Screens/ProductsScreenView.swift @@ -1,5 +1,6 @@ import SwiftUI import Foundation +import Resolver extension ProductsScreenView: ScreenTypeProvider { static var screenType: RootScreenType { @@ -11,58 +12,49 @@ struct ProductsScreenView: View { var product: RecommendedProduct? @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var viewModel = HomeViewModel() - + @Injected var viewModel: ProductsViewModel + @State private var selectedImageIndex = 0 @State private var isLoading = true @State private var counter = 1 var body: some View { - NavigationView { - ScrollView { - VStack(alignment: .leading) { - if isLoading { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .onAppear { - Timer.after { - isLoading = false - } - } - .frame(height: 250) - } else { + ScrollView { + VStack(alignment: .leading) { + if isLoading { + LoadingView(isLoading: $isLoading) + } else { + + if product != nil { + topSection + + productImagesSection - if product != nil { - topSection - - productImagesSection - - productDetailsSection - - priceSection - - actionSection - - } else { - Text("No product available") - .font(.headline) - .foregroundColor(.black) - .padding() - .frame(height:300) - } - recomendSection + productDetailsSection + + priceSection + + actionSection + + } else { + Text("No product available") + .font(.headline) + .foregroundColor(.black) + .padding() + .frame(height:300) } + recomendSection } - .background(Color.white) } - .onAppear { - if let product = product { - print("DATA \(product)") - } else { - print("DATA is nil") - } - navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) + .background(Color.white) + } + .onAppear { + if let product = product { + print("DATA \(product)") + } else { + print("DATA is nil") } + navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) } } diff --git a/App/Views/Screens/SettingsScreenView.swift b/App/Views/Screens/SettingsScreenView.swift index 6adedaa..e406487 100644 --- a/App/Views/Screens/SettingsScreenView.swift +++ b/App/Views/Screens/SettingsScreenView.swift @@ -15,36 +15,36 @@ struct SettingsScreenView: View { @State private var viewState: ViewState = .loading var body: some View { - NavigationView { - VStack { - switch viewState { - case .loading: - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .onAppear { - loadData() - } - - case .error(let errorMessage): - SettingsErrorScreenView(errorMessage: errorMessage) { - navigationManager.navigateToRootScreen( - screen: ScreenWrapper( - screen: HomeScreenView() - ), - selectedTab: .home - ) - } - - case .data: - SettingsInputCodeView(storeKey: $storeKey) + VStack { + Spacer() + + switch viewState { + case .loading: + LoadingView(isLoading: .constant(true)) + + case .error(let errorMessage): + SettingsErrorScreenView(errorMessage: errorMessage) { + navigationManager.navigateToRootScreen( + screen: ScreenWrapper( + screen: HomeScreenView() + ), + selectedTab: .home + ) } + + case .data: + SettingsInputCodeView(storeKey: $storeKey) } - .padding() - .navigationTitle("settings_tab_title") - .background(Color.white.edgesIgnoringSafeArea(.all)) - .onAppear{ - navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) - } + + Spacer() + } + .padding() + .navigationTitle("settings_tab_title") + .background(Color.white.edgesIgnoringSafeArea(.all)) + .onAppear{ + navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) + //TODO: Chage to real loading + loadData() } } diff --git a/Core/DI/DependenciesInitialization.swift b/Core/DI/DependenciesInitialization.swift new file mode 100644 index 0000000..0e58fa3 --- /dev/null +++ b/Core/DI/DependenciesInitialization.swift @@ -0,0 +1,11 @@ +import Resolver + +struct DependenciesInitialization { + static func initialize() { + Resolver.registerSdk() + Resolver.registerHomeServices() + Resolver.registerProductsServices() + Resolver.registerCartServices() + Resolver.registerSearchServices() + } +} diff --git a/Core/DI/SdkManager.swift b/Core/DI/SdkManager.swift deleted file mode 100644 index 86348d9..0000000 --- a/Core/DI/SdkManager.swift +++ /dev/null @@ -1,45 +0,0 @@ -import REES46 - -protocol SDKManaging { - var sdk: PersonalizationSDK? { get } -} - -class SDKManager: SDKManaging { - static let shared = SDKManager() - - var sdk: PersonalizationSDK? - - private init() { - initializeSDK() - } - - private let USER_EMAIL: String? = nil - private let USER_PHONE: String? = nil - private let USER_LOYALTY_ID: String? = nil - private let NOTIFICATION_TYPE = "DEMO NOTIFICATION TYPE" - private let NOTIFICATION_ID = "DEMO NOTIFICATION ID" - - private func initializeSDK() { - sdk = createPersonalizationSDK( - shopId: ProcessInfo.processInfo.environment["SHOP_ID"] ?? "", - userEmail: USER_EMAIL, - userPhone: USER_PHONE, - userLoyaltyId: USER_LOYALTY_ID, - apiDomain: ProcessInfo.processInfo.environment["API_DOMAIN_PATH"] ?? "api.rees46.ru", - stream: ProcessInfo.processInfo.environment["SDK_STREAM"] ?? "ios", - enableLogs: true, - autoSendPushToken: true - ) { error in - if let error = error { - print("SDK Initialization failed: \(error.localizedDescription)") - } else { - print("SDK Initialization succeeded") - if let sessionId = self.sdk?.getSession() { - print("SDK Session ID: \(sessionId)") - } else { - print("Failed to retrieve SDK session ID") - } - } - } - } -} diff --git a/Core/DI/SdkResolver.swift b/Core/DI/SdkResolver.swift new file mode 100644 index 0000000..b06fc8d --- /dev/null +++ b/Core/DI/SdkResolver.swift @@ -0,0 +1,7 @@ +import Resolver + +extension Resolver { + static func registerSdk() { + register { SDKManager() as SDKManagingProtocol }.scope(.shared) + } +} diff --git a/Core/Presentation/Views/LoadingView.swift b/Core/Presentation/Views/LoadingView.swift new file mode 100644 index 0000000..3756a55 --- /dev/null +++ b/Core/Presentation/Views/LoadingView.swift @@ -0,0 +1,22 @@ +import SwiftUI + +struct LoadingView: View { + + @Binding var isLoading: Bool + + var body: some View { + if isLoading { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .onAppear { + Timer.scheduledTimer( + withTimeInterval: 2.0, + repeats: false + ) { _ in + isLoading = false + } + } + .frame(height: 250) + } + } +} diff --git a/Core/Utils/AppConvigVariables.swift b/Core/Utils/AppConvigVariables.swift new file mode 100644 index 0000000..9a7c379 --- /dev/null +++ b/Core/Utils/AppConvigVariables.swift @@ -0,0 +1,9 @@ +// Config.swift +import Foundation + +struct AppConfigVariables { + static let blockId: String = ProcessInfo.processInfo.environment["BLOCK_ID"] ?? "" + static let shopId: String = ProcessInfo.processInfo.environment["SHOP_ID"] ?? "" + static let apiDomain: String = ProcessInfo.processInfo.environment["API_DOMAIN_PATH"] ?? "api.rees46.ru" + static let sdkStream: String = ProcessInfo.processInfo.environment["SDK_STREAM"] ?? "ios" +} diff --git a/Feature/Cart/DI/CartResolver.swift b/Feature/Cart/DI/CartResolver.swift index de3054c..af0d270 100644 --- a/Feature/Cart/DI/CartResolver.swift +++ b/Feature/Cart/DI/CartResolver.swift @@ -1,22 +1,9 @@ import Foundation +import Resolver -class CartResolver { - static let shared = CartResolver() - - private init() {} - - func resolveCartViewModel() -> CartViewModel { - return CartViewModel( - cartRepository: resolveCartRepository(), - getRecommendationsUseCase: resolveGetRecommendationsUseCase() - ) - } - - func resolveCartRepository() -> CartRepository { - return CartRepository.shared - } - - func resolveGetRecommendationsUseCase() -> GetRecommendationsUseCase { - return GetRecommendationsUseCase() +extension Resolver { + static func registerCartServices() { + register { CartViewModel() }.scope(.application) + register { CartRepository() as CartRepositoryProtocol }.scope(.application) } } diff --git a/Feature/Cart/Domain/Repository/CartRepository.swift b/Feature/Cart/Domain/Repository/Implementation/CartRepository.swift similarity index 92% rename from Feature/Cart/Domain/Repository/CartRepository.swift rename to Feature/Cart/Domain/Repository/Implementation/CartRepository.swift index 6e1541b..aaebb8b 100644 --- a/Feature/Cart/Domain/Repository/CartRepository.swift +++ b/Feature/Cart/Domain/Repository/Implementation/CartRepository.swift @@ -1,14 +1,12 @@ import Foundation import Combine -class CartRepository: ObservableObject { - - static let shared = CartRepository() - - private init() {} +class CartRepository: ObservableObject, CartRepositoryProtocol { @Published var cartItems: [ProductCartItem] = [] - + + var cartItemsPublisher: Published<[ProductCartItem]>.Publisher { $cartItems } + func addToCart(product: RecommendedProduct, quantity: Int) { if let index = cartItems.firstIndex(where: { $0.product.id == product.id }) { cartItems[index].quantity += quantity diff --git a/Feature/Cart/Domain/Repository/Protocols/CartRepositoryProtocol.swift b/Feature/Cart/Domain/Repository/Protocols/CartRepositoryProtocol.swift new file mode 100644 index 0000000..ce5a726 --- /dev/null +++ b/Feature/Cart/Domain/Repository/Protocols/CartRepositoryProtocol.swift @@ -0,0 +1,9 @@ +import Foundation +import Combine + +protocol CartRepositoryProtocol { + var cartItemsPublisher: Published<[ProductCartItem]>.Publisher { get } + func addToCart(product: RecommendedProduct, quantity: Int) + func updateCartItem(productId: String, quantity: Int) + func removeFromCart(productId: String) +} diff --git a/Feature/Cart/Presentation/ViewModel/CartViewModel.swift b/Feature/Cart/Presentation/ViewModel/CartViewModel.swift index 74810fd..b656762 100644 --- a/Feature/Cart/Presentation/ViewModel/CartViewModel.swift +++ b/Feature/Cart/Presentation/ViewModel/CartViewModel.swift @@ -1,22 +1,20 @@ import Foundation import Combine +import Resolver -class CartViewModel: ObservableObject { +class CartViewModel { + @Published var cartItems: [ProductCartItem] = [] @Published var recommenderProducts: [RecommendedProduct] = [] @Published var isLoading: Bool = true - private let getRecommendationsUseCase: GetRecommendationsUseCase - private let cartRepository: CartRepository + @Injected var cartRepository: CartRepositoryProtocol + @Injected var getRecommendationsUseCase: GetRecommendationsUseCase + private var cancellables = Set() - private let blockId = "977cb67194a72fdc7b424f49d69a862d" - - init(cartRepository: CartRepository, getRecommendationsUseCase: GetRecommendationsUseCase) { - self.cartRepository = cartRepository - self.getRecommendationsUseCase = getRecommendationsUseCase - - cartRepository.$cartItems + init() { + cartRepository.cartItemsPublisher .sink { [weak self] cartItems in self?.cartItems = cartItems self?.isLoading = false @@ -37,7 +35,9 @@ class CartViewModel: ObservableObject { } func loadRecommenderRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { products in + getRecommendationsUseCase.execute( + currentProductId: currentProductId + ) { products in self.recommenderProducts = products } } diff --git a/Feature/Home/DI/HomeResolver.swift b/Feature/Home/DI/HomeResolver.swift index 9459f3d..add7b94 100644 --- a/Feature/Home/DI/HomeResolver.swift +++ b/Feature/Home/DI/HomeResolver.swift @@ -1,23 +1,9 @@ import Foundation +import Resolver -class HomeResolver { - static let shared = HomeResolver() - - private init() {} - - func resolve() -> T { - if T.self == HomeViewModel.self { - return HomeViewModel() as! T - } - if T.self == CartRepository.self { - return CartRepository.shared as! T - } - if T.self == GetRecommendationsUseCase.self { - return GetRecommendationsUseCase() as! T - } - if T.self == SDKManaging.self { - return SDKManager.shared as! T - } - fatalError("Unsupported type") +extension Resolver { + static func registerHomeServices() { + register { HomeViewModel() }.scope(.application) + register { GetRecommendationsUseCase() }.scope(.application) } } diff --git a/Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift b/Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift index 28f2637..315956c 100644 --- a/Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift +++ b/Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift @@ -1,14 +1,18 @@ import Foundation import Combine import REES46 +import Resolver class GetRecommendationsUseCase { - private let sdkManager = SDKManager.shared + @Injected var sdkManager: SDKManagingProtocol - func execute(blockId: String, currentProductId: String, completion: @escaping ([RecommendedProduct]) -> Void) { + func execute( + currentProductId: String, + completion: @escaping ([RecommendedProduct]) -> Void + ) { sdkManager.sdk?.recommend( - blockId: blockId, + blockId: AppConfigVariables.blockId, currentProductId: currentProductId ) { response in switch response { diff --git a/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift b/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift index 4992e63..bee14fd 100644 --- a/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift +++ b/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift @@ -14,7 +14,6 @@ struct HomeStoriesContainerView: View { StoriesViewControllerRepresentable() .frame(height: 200) } - .environmentObject(HomeViewModel()) } } diff --git a/Feature/Home/Presentation/View/Stories/StoriesViewController.swift b/Feature/Home/Presentation/View/Stories/StoriesViewController.swift index a05a573..d0f7b67 100644 --- a/Feature/Home/Presentation/View/Stories/StoriesViewController.swift +++ b/Feature/Home/Presentation/View/Stories/StoriesViewController.swift @@ -1,6 +1,7 @@ import SwiftUI import UIKit import REES46 +import Resolver class StoriesViewController: UIViewController { @@ -35,7 +36,7 @@ class StoriesViewController: UIViewController { struct StoriesViewControllerRepresentable: UIViewControllerRepresentable { - @EnvironmentObject var viewModel: HomeViewModel + @Injected var viewModel: HomeViewModel func makeUIViewController(context: Context) -> StoriesViewController { let viewController = StoriesViewController() diff --git a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift index 6bb6f6d..5c710f3 100644 --- a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift +++ b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift @@ -1,44 +1,41 @@ import Foundation import Combine import REES46 +import Resolver -class HomeViewModel: ObservableObject { +class HomeViewModel { - private let blockId = "977cb67194a72fdc7b424f49d69a862d" + @Injected var sdkManager: SDKManagingProtocol + @Injected var cartRepository: CartRepositoryProtocol + @Injected var getRecommendationsUseCase: GetRecommendationsUseCase @Published var arrivalsProducts: [RecommendedProduct] = [] @Published var topTrendProducts: [RecommendedProduct] = [] @Published var recommenderProducts: [RecommendedProduct] = [] @Published var isLoading = true - private let cartRepository: CartRepository - private let getRecommendationsUseCase: GetRecommendationsUseCase - let sdkManager: SDKManaging - - init(sdkManager: SDKManaging = HomeResolver.shared.resolve(), - cartRepository: CartRepository = HomeResolver.shared.resolve(), - getRecommendationsUseCase: GetRecommendationsUseCase = HomeResolver.shared.resolve()) { - self.sdkManager = sdkManager - self.cartRepository = cartRepository - self.getRecommendationsUseCase = getRecommendationsUseCase - } - func loadArrivalsRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { [weak self] products in + getRecommendationsUseCase.execute( + currentProductId: currentProductId + ) { [weak self] products in self?.arrivalsProducts = products self?.isLoading = false } } func loadTopTrendRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { [weak self] products in + getRecommendationsUseCase.execute( + currentProductId: currentProductId + ) { [weak self] products in self?.topTrendProducts = products self?.isLoading = false } } func loadRecommenderRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute(blockId: blockId, currentProductId: currentProductId) { [weak self] products in + getRecommendationsUseCase.execute( + currentProductId: currentProductId + ) { [weak self] products in self?.recommenderProducts = products self?.isLoading = false } diff --git a/Feature/Product/DI/ProductsResolver.swift b/Feature/Product/DI/ProductsResolver.swift new file mode 100644 index 0000000..48ed3ec --- /dev/null +++ b/Feature/Product/DI/ProductsResolver.swift @@ -0,0 +1,8 @@ +import Foundation +import Resolver + +extension Resolver { + static func registerProductsServices() { + register { ProductsViewModel() }.scope(.application) + } +} diff --git a/Feature/Product/Presentation/View/ProductListItemView.swift b/Feature/Product/Presentation/View/ProductListItemView.swift index 44cc38a..bc7ef69 100644 --- a/Feature/Product/Presentation/View/ProductListItemView.swift +++ b/Feature/Product/Presentation/View/ProductListItemView.swift @@ -1,9 +1,10 @@ import SwiftUI +import Resolver struct ProductListItemView: View { @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var viewModel = HomeViewModel() + @Injected var viewModel: ProductsViewModel var product: RecommendedProduct var containerWidth: CGFloat diff --git a/Feature/Product/Presentation/ViewModel/ProductsViewModel.swift b/Feature/Product/Presentation/ViewModel/ProductsViewModel.swift new file mode 100644 index 0000000..3f62444 --- /dev/null +++ b/Feature/Product/Presentation/ViewModel/ProductsViewModel.swift @@ -0,0 +1,27 @@ +import Foundation +import Combine +import REES46 +import Resolver + +class ProductsViewModel { + + @Injected var cartRepository: CartRepositoryProtocol + @Injected var getRecommendationsUseCase: GetRecommendationsUseCase + + @Published var recommenderProducts: [RecommendedProduct] = [] + @Published var isLoading = true + + func loadRecommenderRecommendations(currentProductId: String) { + getRecommendationsUseCase.execute( + currentProductId: currentProductId + ) { [weak self] products in + self?.recommenderProducts = products + self?.isLoading = false + } + } + + func addToCart(product: RecommendedProduct, quantity: Int) { + cartRepository.addToCart(product: product, quantity: quantity) + } + +} diff --git a/Feature/Search/DI/SearchResolver.swift b/Feature/Search/DI/SearchResolver.swift new file mode 100644 index 0000000..a1defd3 --- /dev/null +++ b/Feature/Search/DI/SearchResolver.swift @@ -0,0 +1,8 @@ +import Foundation +import Resolver + +extension Resolver { + static func registerSearchServices() { + register { SearchViewModel() }.scope(.application) + } +} diff --git a/Feature/Search/Presentation/View/SearchScreenView.swift b/Feature/Search/Presentation/View/SearchScreenView.swift index fb2ab57..a5d9818 100644 --- a/Feature/Search/Presentation/View/SearchScreenView.swift +++ b/Feature/Search/Presentation/View/SearchScreenView.swift @@ -1,18 +1,18 @@ import SwiftUI import Combine import REES46 +import Resolver struct SearchScreenView: View { @EnvironmentObject var navigationManager: NavigationManager - @ObservedObject var viewModel = SearchViewModel() - + @Injected var viewModel: SearchViewModel var body: some View { VStack(alignment: .leading) { HStack { ZStack { - TextField("search_hint", text: $viewModel.searchText) + TextField("search_hint", text: .constant(viewModel.searchText)) .padding(.leading, 10) .padding(.trailing, 40) .frame(height: 40) diff --git a/Feature/Search/Presentation/ViewModel/SearchViewModel.swift b/Feature/Search/Presentation/ViewModel/SearchViewModel.swift index ef8db5c..b0a4c0a 100644 --- a/Feature/Search/Presentation/ViewModel/SearchViewModel.swift +++ b/Feature/Search/Presentation/ViewModel/SearchViewModel.swift @@ -1,10 +1,11 @@ import SwiftUI import Combine import REES46 +import Resolver -class SearchViewModel: ObservableObject { +class SearchViewModel { - private let sdkManager: SDKManaging + @Injected var sdkManager: SDKManagingProtocol @Published var searchText: String = "" @Published var searchResults: SearchProductResponse? = nil @@ -16,9 +17,7 @@ class SearchViewModel: ObservableObject { private var cancellables = Set() - init(sdkManager: SDKManaging = SDKManager.shared) { - self.sdkManager = sdkManager - + init() { $searchText .debounce(for: .milliseconds(300), scheduler: RunLoop.main) .sink { [weak self] searchText in diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown index f85cc84..7ad5b39 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.markdown @@ -24,33 +24,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE REES46 SOFTWARE. -## SDWebImage - -Copyright (c) 2009-2020 Olivier Poitrey rs@dailymotion.com - -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. - +## Resolver +MIT License -## SDWebImageSwiftUI - -Copyright (c) 2019 lizhuoli1126@126.com +Copyright (c) 2018 Michael Long Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -59,15 +37,15 @@ 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 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. +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/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist index 6d8ba7b..58675f1 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-acknowledgements.plist @@ -43,37 +43,9 @@ THE REES46 SOFTWARE. FooterText - Copyright (c) 2009-2020 Olivier Poitrey rs@dailymotion.com - -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. + MIT License - - License - MIT - Title - SDWebImage - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2019 lizhuoli1126@126.com <lizhuoli1126@126.com> +Copyright (c) 2018 Michael Long Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -82,21 +54,21 @@ 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 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. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. License MIT Title - SDWebImageSwiftUI + Resolver Type PSGroupSpecifier diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist index 0914b96..31f2737 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-input-files.xcfilelist @@ -1,4 +1,3 @@ ${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh ${BUILT_PRODUCTS_DIR}/REES46/REES46.framework -${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework -${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework \ No newline at end of file +${BUILT_PRODUCTS_DIR}/Resolver/Resolver.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist index eb96684..c356a31 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Debug-output-files.xcfilelist @@ -1,3 +1,2 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageSwiftUI.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Resolver.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist index 0914b96..31f2737 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-input-files.xcfilelist @@ -1,4 +1,3 @@ ${PODS_ROOT}/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh ${BUILT_PRODUCTS_DIR}/REES46/REES46.framework -${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework -${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework \ No newline at end of file +${BUILT_PRODUCTS_DIR}/Resolver/Resolver.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist index eb96684..c356a31 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks-Release-output-files.xcfilelist @@ -1,3 +1,2 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/REES46.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImageSwiftUI.framework \ No newline at end of file +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Resolver.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh index b3209ff..3e6fd18 100755 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-frameworks.sh @@ -177,13 +177,11 @@ code_sign_if_enabled() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/REES46/REES46.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Resolver/Resolver.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/REES46/REES46.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" - install_framework "${BUILT_PRODUCTS_DIR}/SDWebImageSwiftUI/SDWebImageSwiftUI.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Resolver/Resolver.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index ccb017d..8357a6a 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -19,8 +19,6 @@ 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; 75674CDC2C3C1A67007FAB88 /* ListDiscoverProductsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.swift */; }; 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */; }; - 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE52C3D295F007FAB88 /* SdkManager.swift */; }; - 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */; }; 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */; }; @@ -91,6 +89,22 @@ 75E97A642C50320F0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; 75E97A652C50320F0081B069 /* RecommendedProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */; }; 75E97A6B2C5037130081B069 /* MainViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A6A2C5037130081B069 /* MainViews.swift */; }; + 75E97A712C5041920081B069 /* ImageItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A6F2C5041780081B069 /* ImageItem.swift */; }; + 75E97A782C512F8C0081B069 /* DependenciesInitialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A772C512F8C0081B069 /* DependenciesInitialization.swift */; }; + 75E97A822C5133AD0081B069 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.swift */; }; + 75E97A832C5133AD0081B069 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.swift */; }; + 75E97A842C5133AD0081B069 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.swift */; }; + 75E97A882C51414D0081B069 /* CartRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A872C51414D0081B069 /* CartRepositoryProtocol.swift */; }; + 75E97A8D2C5142F10081B069 /* ProductsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A8C2C5142F10081B069 /* ProductsViewModel.swift */; }; + 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A912C5143630081B069 /* ProductsResolver.swift */; }; + 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA12C5147A20081B069 /* SdkResolver.swift */; }; + 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA42C5147F30081B069 /* HomeViewModel.swift */; }; + 75E97AA82C5148420081B069 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA72C5148420081B069 /* SdkManager.swift */; }; + 75E97AA92C5148860081B069 /* SDKManagerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A9F2C51478D0081B069 /* SDKManagerProtocol.swift */; }; + 75E97AAC2C514B4D0081B069 /* SearchResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAB2C514B4D0081B069 /* SearchResolver.swift */; }; + 75E97AB02C514D2D0081B069 /* AppConvigVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */; }; + 75E97AB12C514D2D0081B069 /* AppConvigVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */; }; + 75E97AB22C514D2D0081B069 /* AppConvigVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */; }; 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */; }; 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */; }; 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; @@ -144,8 +158,6 @@ 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDiscoverProductsView.swift; sourceTree = ""; }; 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStoriesContainerView.swift; sourceTree = ""; }; - 75674CE52C3D295F007FAB88 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; - 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; 75674CF42C3D92CC007FAB88 /* Product.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Product.swift; sourceTree = ""; }; @@ -194,6 +206,20 @@ 75E97A482C50253A0081B069 /* SearchSuggest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSuggest.swift; sourceTree = ""; }; 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPriceRange.swift; sourceTree = ""; }; 75E97A6A2C5037130081B069 /* MainViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViews.swift; sourceTree = ""; }; + 75E97A6F2C5041780081B069 /* ImageItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageItem.swift; sourceTree = ""; }; + 75E97A772C512F8C0081B069 /* DependenciesInitialization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DependenciesInitialization.swift; sourceTree = ""; }; + 75E97A812C5133AD0081B069 /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = ""; }; + 75E97A872C51414D0081B069 /* CartRepositoryProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepositoryProtocol.swift; sourceTree = ""; }; + 75E97A8C2C5142F10081B069 /* ProductsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsViewModel.swift; sourceTree = ""; }; + 75E97A912C5143630081B069 /* ProductsResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsResolver.swift; sourceTree = ""; }; + 75E97A9F2C51478D0081B069 /* SDKManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKManagerProtocol.swift; sourceTree = ""; }; + 75E97AA12C5147A20081B069 /* SdkResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkResolver.swift; sourceTree = ""; }; + 75E97AA32C5147EF0081B069 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; + 75E97AA42C5147F30081B069 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; + 75E97AA62C51482F0081B069 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; + 75E97AA72C5148420081B069 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SdkManager.swift; path = ../../../../../Desktop/Protocols/SdkManager.swift; sourceTree = ""; }; + 75E97AAB2C514B4D0081B069 /* SearchResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResolver.swift; sourceTree = ""; }; + 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppConvigVariables.swift; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsScreenView.swift; sourceTree = ""; }; 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; @@ -264,6 +290,7 @@ isa = PBXGroup; children = ( 75E979F02C4D2DBE0081B069 /* Timer.swift */, + 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */, ); path = Utils; sourceTree = ""; @@ -294,6 +321,7 @@ 75B935552C3564360063E814 /* App */ = { isa = PBXGroup; children = ( + 75E97A7F2C51319A0081B069 /* New Group */, 75E979E12C4AE4630081B069 /* Views */, 75E97A1F2C501E650081B069 /* ViewModels */, 75ECCD182C36F92A00D6D346 /* Navigation */, @@ -327,11 +355,11 @@ 75E979942C49561B0081B069 /* Feature */ = { isa = PBXGroup; children = ( - 75E979A62C4956CD0081B069 /* Search */, 75E9799E2C4956400081B069 /* Home */, 75E9799F2C4956470081B069 /* Product */, - 75E979A02C4956520081B069 /* Cart */, 75E979A12C4956580081B069 /* Settings */, + 75E979A02C4956520081B069 /* Cart */, + 75E979A62C4956CD0081B069 /* Search */, 75E979952C49561B0081B069 /* Feature.h */, ); path = Feature; @@ -340,9 +368,10 @@ 75E9799E2C4956400081B069 /* Home */ = { isa = PBXGroup; children = ( - 75E979A52C4956A30081B069 /* Presentation */, 75E979A22C49568B0081B069 /* DI */, + 75E979A52C4956A30081B069 /* Presentation */, 75E979A42C49569D0081B069 /* Domain */, + 75E97A6E2C5041660081B069 /* Model */, ); path = Home; sourceTree = ""; @@ -350,6 +379,7 @@ 75E9799F2C4956470081B069 /* Product */ = { isa = PBXGroup; children = ( + 75E97A902C51434B0081B069 /* DI */, 75E97A202C50207D0081B069 /* Presentation */, 75E979C22C495B780081B069 /* Data */, ); @@ -359,8 +389,8 @@ 75E979A02C4956520081B069 /* Cart */ = { isa = PBXGroup; children = ( - 75E979B22C4958A90081B069 /* Presentation */, 75E979CA2C4973CF0081B069 /* DI */, + 75E979B22C4958A90081B069 /* Presentation */, 75E979B52C4958F20081B069 /* Domain */, 75E979C02C495B1D0081B069 /* Data */, ); @@ -403,6 +433,7 @@ 75E979A62C4956CD0081B069 /* Search */ = { isa = PBXGroup; children = ( + 75E97AAA2C514B3D0081B069 /* DI */, 75E979AA2C4956F30081B069 /* Presentation */, 75E97A322C5023F30081B069 /* Data */, ); @@ -480,7 +511,8 @@ 75E979B62C4958FD0081B069 /* Repository */ = { isa = PBXGroup; children = ( - 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */, + 75E97A862C5141320081B069 /* Implementation */, + 75E97A852C5140F70081B069 /* Protocols */, ); path = Repository; sourceTree = ""; @@ -499,7 +531,7 @@ 75E979B82C49593E0081B069 /* ViewModel */ = { isa = PBXGroup; children = ( - 75674CE72C3D299A007FAB88 /* HomeViewModel.swift */, + 75E97AA42C5147F30081B069 /* HomeViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -541,7 +573,6 @@ isa = PBXGroup; children = ( 75E979C32C495B7E0081B069 /* Model */, - 75E979C52C495BC30081B069 /* Mapper */, ); path = Data; sourceTree = ""; @@ -573,13 +604,6 @@ path = Model; sourceTree = ""; }; - 75E979C52C495BC30081B069 /* Mapper */ = { - isa = PBXGroup; - children = ( - ); - path = Mapper; - sourceTree = ""; - }; 75E979CA2C4973CF0081B069 /* DI */ = { isa = PBXGroup; children = ( @@ -592,10 +616,10 @@ isa = PBXGroup; children = ( 75B935582C3564360063E814 /* ContentView.swift */, + 75E97A6A2C5037130081B069 /* MainViews.swift */, 75E97A142C501A7D0081B069 /* Screens */, 75E97A152C501A930081B069 /* ToolBar */, 75E979E22C4AE4790081B069 /* BottomBar */, - 75E97A6A2C5037130081B069 /* MainViews.swift */, ); path = Views; sourceTree = ""; @@ -660,6 +684,7 @@ 75E97A202C50207D0081B069 /* Presentation */ = { isa = PBXGroup; children = ( + 75E97A8B2C5142DD0081B069 /* ViewModel */, 75E97A212C5020860081B069 /* View */, ); path = Presentation; @@ -694,6 +719,7 @@ 75E97A6C2C5037730081B069 /* Presentation */ = { isa = PBXGroup; children = ( + 75E97A802C51322F0081B069 /* ViewModel */, 75E97A6D2C50377C0081B069 /* Views */, ); path = Presentation; @@ -704,10 +730,85 @@ children = ( 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */, 75674D022C3DA14F007FAB88 /* RatingConverter.swift */, + 75E97A812C5133AD0081B069 /* LoadingView.swift */, ); path = Views; sourceTree = ""; }; + 75E97A6E2C5041660081B069 /* Model */ = { + isa = PBXGroup; + children = ( + 75E97A6F2C5041780081B069 /* ImageItem.swift */, + ); + path = Model; + sourceTree = ""; + }; + 75E97A7F2C51319A0081B069 /* New Group */ = { + isa = PBXGroup; + children = ( + ); + path = "New Group"; + sourceTree = ""; + }; + 75E97A802C51322F0081B069 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 75E97AA72C5148420081B069 /* SdkManager.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 75E97A852C5140F70081B069 /* Protocols */ = { + isa = PBXGroup; + children = ( + 75E97A872C51414D0081B069 /* CartRepositoryProtocol.swift */, + ); + path = Protocols; + sourceTree = ""; + }; + 75E97A862C5141320081B069 /* Implementation */ = { + isa = PBXGroup; + children = ( + 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */, + ); + path = Implementation; + sourceTree = ""; + }; + 75E97A8B2C5142DD0081B069 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 75E97A8C2C5142F10081B069 /* ProductsViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + 75E97A902C51434B0081B069 /* DI */ = { + isa = PBXGroup; + children = ( + 75E97A912C5143630081B069 /* ProductsResolver.swift */, + ); + path = DI; + sourceTree = ""; + }; + 75E97A952C5146EB0081B069 /* Protocols */ = { + isa = PBXGroup; + children = ( + 75E97AA32C5147EF0081B069 /* HomeViewModel.swift */, + 75E97A9F2C51478D0081B069 /* SDKManagerProtocol.swift */, + 75E97AA62C51482F0081B069 /* SdkManager.swift */, + ); + name = Protocols; + path = ../../../../Desktop/Protocols; + sourceTree = ""; + }; + 75E97AAA2C514B3D0081B069 /* DI */ = { + isa = PBXGroup; + children = ( + 75E97AAB2C514B4D0081B069 /* SearchResolver.swift */, + ); + path = DI; + sourceTree = ""; + }; 75ECCD152C36D6B400D6D346 /* Resources */ = { isa = PBXGroup; children = ( @@ -729,7 +830,9 @@ 75ECCD1B2C37F09100D6D346 /* DI */ = { isa = PBXGroup; children = ( - 75674CE52C3D295F007FAB88 /* SdkManager.swift */, + 75E97A772C512F8C0081B069 /* DependenciesInitialization.swift */, + 75E97AA12C5147A20081B069 /* SdkResolver.swift */, + 75E97A952C5146EB0081B069 /* Protocols */, ); path = DI; sourceTree = ""; @@ -950,11 +1053,15 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75E97AA92C5148860081B069 /* SDKManagerProtocol.swift in Sources */, + 75E97AAC2C514B4D0081B069 /* SearchResolver.swift in Sources */, 75E97A642C50320F0081B069 /* RecommendedProductMapper.swift in Sources */, + 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */, 75E97A652C50320F0081B069 /* RecommendedProduct.swift in Sources */, 752F1D3A2C41E01D002D4AC3 /* ProductCartItemDto.swift in Sources */, + 75E97A8D2C5142F10081B069 /* ProductsViewModel.swift in Sources */, 75E97A5F2C502F3C0081B069 /* Product.swift in Sources */, - 75674CE62C3D295F007FAB88 /* SdkManager.swift in Sources */, + 75E97A782C512F8C0081B069 /* DependenciesInitialization.swift in Sources */, 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */, 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, 75674CDC2C3C1A67007FAB88 /* ListDiscoverProductsView.swift in Sources */, @@ -965,9 +1072,11 @@ 75E97A412C5025080081B069 /* SearchCategory.swift in Sources */, 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */, 75E97A492C50253A0081B069 /* SearchSuggest.swift in Sources */, + 75E97AB02C514D2D0081B069 /* AppConvigVariables.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, 75E979E72C4AE8870081B069 /* TabItem.swift in Sources */, 75E97A6B2C5037130081B069 /* MainViews.swift in Sources */, + 75E97A882C51414D0081B069 /* CartRepositoryProtocol.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */, 75E979DE2C4ADDD20081B069 /* RootScreenType.enum.swift in Sources */, @@ -975,6 +1084,7 @@ 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */, + 75E97A822C5133AD0081B069 /* LoadingView.swift in Sources */, 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */, 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */, 75E97A2F2C5023B10081B069 /* SearchFashionColor.swift in Sources */, @@ -987,8 +1097,10 @@ 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */, - 75674CE82C3D299A007FAB88 /* HomeViewModel.swift in Sources */, + 75E97AA82C5148420081B069 /* SdkManager.swift in Sources */, + 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */, 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, + 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */, 75E97A232C5023600081B069 /* SearchFilter.swift in Sources */, 75E97A5A2C502DBF0081B069 /* SearchProductResponseMapper.swift in Sources */, 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.swift in Sources */, @@ -1000,6 +1112,7 @@ 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, 75E97A272C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, 75E979D02C4974440081B069 /* CartListView.swift in Sources */, + 75E97A712C5041920081B069 /* ImageItem.swift in Sources */, 75E979D42C4974660081B069 /* CartListItemView.swift in Sources */, 75E97A392C5024CD0081B069 /* SearchProduct.swift in Sources */, 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, @@ -1020,9 +1133,11 @@ 75E97A4A2C50253A0081B069 /* SearchSuggest.swift in Sources */, 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */, 75E97A422C5025080081B069 /* SearchCategory.swift in Sources */, + 75E97A832C5133AD0081B069 /* LoadingView.swift in Sources */, 75E97A242C5023600081B069 /* SearchFilter.swift in Sources */, 75E97A3E2C5024EF0081B069 /* SearchRedirect.swift in Sources */, 75E97A4E2C50255A0081B069 /* SearchPriceRange.swift in Sources */, + 75E97AB12C514D2D0081B069 /* AppConvigVariables.swift in Sources */, 75E97A282C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, 75E97A2C2C5023960081B069 /* SearchFashionSize.swift in Sources */, 75E97A462C5025240081B069 /* SearchQuery.swift in Sources */, @@ -1038,9 +1153,11 @@ 75E97A4F2C50255A0081B069 /* SearchPriceRange.swift in Sources */, 75E97A472C5025240081B069 /* SearchQuery.swift in Sources */, 75E97A432C5025080081B069 /* SearchCategory.swift in Sources */, + 75E97A842C5133AD0081B069 /* LoadingView.swift in Sources */, 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */, 75E97A252C5023600081B069 /* SearchFilter.swift in Sources */, 75E97A292C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, + 75E97AB22C514D2D0081B069 /* AppConvigVariables.swift in Sources */, 75E97A3B2C5024CD0081B069 /* SearchProduct.swift in Sources */, 75E97A2D2C5023960081B069 /* SearchFashionSize.swift in Sources */, 75E97A3F2C5024EF0081B069 /* SearchRedirect.swift in Sources */, @@ -1195,6 +1312,7 @@ ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = App/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Demo store"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -1226,6 +1344,7 @@ ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = App/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Demo store"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; diff --git a/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme index 27ab682..dac265b 100644 --- a/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme +++ b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme @@ -95,6 +95,16 @@ value = "ios" isEnabled = "YES"> + + + + Date: Wed, 24 Jul 2024 17:14:42 +0200 Subject: [PATCH 69/85] chore: Add resolver in pods --- Podfile | 1 + Podfile.lock | 9 ++++++++- Pods/Manifest.lock | 9 ++++++++- .../Pods-demo-store-ios.debug.xcconfig | 6 +++--- .../Pods-demo-store-ios.release.xcconfig | 6 +++--- .../xcschemes/xcschememanagement.plist | 4 ++-- 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Podfile b/Podfile index 69bbad9..e9903bc 100644 --- a/Podfile +++ b/Podfile @@ -4,6 +4,7 @@ target 'demo-store-ios' do use_frameworks! pod 'REES46', :git => 'https://github.com/rees46/ios-sdk.git', :branch => 'master', :tag => '3.6.19' + pod "Resolver" end diff --git a/Podfile.lock b/Podfile.lock index 557cfa5..ccf47e9 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,8 +1,14 @@ PODS: - REES46 (3.6.23) + - Resolver (1.5.1) DEPENDENCIES: - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) + - Resolver + +SPEC REPOS: + trunk: + - Resolver EXTERNAL SOURCES: REES46: @@ -18,7 +24,8 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 8c66b0fdb9f0a6c62a15fb04fafe621b2952149b + Resolver: 0e2ce51257e9366c54afe1b9e9be25059e9b9300 -PODFILE CHECKSUM: 95734e4d6187b8b6d19278bbb7d9a6acdb94da14 +PODFILE CHECKSUM: c7370fe6ff1205586ebc35502940f4f806351ae7 COCOAPODS: 1.15.2 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 557cfa5..ccf47e9 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,8 +1,14 @@ PODS: - REES46 (3.6.23) + - Resolver (1.5.1) DEPENDENCIES: - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) + - Resolver + +SPEC REPOS: + trunk: + - Resolver EXTERNAL SOURCES: REES46: @@ -18,7 +24,8 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: REES46: 8c66b0fdb9f0a6c62a15fb04fafe621b2952149b + Resolver: 0e2ce51257e9366c54afe1b9e9be25059e9b9300 -PODFILE CHECKSUM: 95734e4d6187b8b6d19278bbb7d9a6acdb94da14 +PODFILE CHECKSUM: c7370fe6ff1205586ebc35502940f4f806351ae7 COCOAPODS: 1.15.2 diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig index f6da505..9652d66 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/Resolver" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Resolver/Resolver.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "REES46" +OTHER_LDFLAGS = $(inherited) -framework "REES46" -framework "Resolver" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig index f6da505..9652d66 100644 --- a/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig +++ b/Pods/Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig @@ -1,11 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46" "${PODS_CONFIGURATION_BUILD_DIR}/Resolver" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/REES46/REES46.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Resolver/Resolver.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "REES46" +OTHER_LDFLAGS = $(inherited) -framework "REES46" -framework "Resolver" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist index cd0079d..3e8dcc6 100644 --- a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,12 +7,12 @@ Core.xcscheme_^#shared#^_ orderHint - 4 + 5 Feature.xcscheme_^#shared#^_ orderHint - 3 + 4 common.xcscheme_^#shared#^_ From 534ebd7a646ca62d1661982268323f10a35fa8fe Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 24 Jul 2024 18:11:19 +0200 Subject: [PATCH 70/85] chore: Add product blocks code in config variables --- App/Views/Screens/HomeScreenView.swift | 6 +++--- App/Views/Screens/ProductsScreenView.swift | 18 +++++++++------- App/Views/Screens/SettingsScreenView.swift | 2 +- Core/Utils/AppConvigVariables.swift | 4 +++- demo-store-ios.xcodeproj/project.pbxproj | 8 ------- .../xcschemes/demo-store-ios.xcscheme | 21 +++++++++++++++++++ 6 files changed, 38 insertions(+), 21 deletions(-) diff --git a/App/Views/Screens/HomeScreenView.swift b/App/Views/Screens/HomeScreenView.swift index 32fee52..ca850e3 100644 --- a/App/Views/Screens/HomeScreenView.swift +++ b/App/Views/Screens/HomeScreenView.swift @@ -30,21 +30,21 @@ struct HomeScreenView: View { recommendedProducts: viewModel.arrivalsProducts, title: NSLocalizedString("arrivals_title", comment: "") ).onAppear { - viewModel.loadArrivalsRecommendations(currentProductId: "670") + viewModel.loadArrivalsRecommendations(currentProductId: AppConfigVariables.arrivalsCode) } ShortRecommendationListView( recommendedProducts: viewModel.topTrendProducts, title: NSLocalizedString("top_trend_title", comment: "") ).onAppear { - viewModel.loadTopTrendRecommendations(currentProductId: "656") + viewModel.loadTopTrendRecommendations(currentProductId: AppConfigVariables.topTrendsCode) } ShortRecommendationListView( recommendedProducts: viewModel.recommenderProducts, title: NSLocalizedString("reccomender_title", comment: "") ).onAppear { - viewModel.loadRecommenderRecommendations(currentProductId: "651") + viewModel.loadRecommenderRecommendations(currentProductId: AppConfigVariables.recommendationCode) } } diff --git a/App/Views/Screens/ProductsScreenView.swift b/App/Views/Screens/ProductsScreenView.swift index 3e6e6ce..87e966c 100644 --- a/App/Views/Screens/ProductsScreenView.swift +++ b/App/Views/Screens/ProductsScreenView.swift @@ -37,7 +37,7 @@ struct ProductsScreenView: View { actionSection } else { - Text("No product available") + Text("empty_products_title") .font(.headline) .foregroundColor(.black) .padding() @@ -142,7 +142,7 @@ struct ProductsScreenView: View { VStack(alignment: .leading, spacing: 4) { Spacer().frame(height: 20) - Text(product?.oldPriceFormatted ?? "₽ 42") + Text(product?.oldPriceFormatted ?? "") .font(.system(size: 18)) .foregroundColor(.secondary) .strikethrough() @@ -185,7 +185,7 @@ struct ProductsScreenView: View { } } ) { - Text("Add to Cart") + Text("add_to_cart_button_title") .font(.system(size: 17, weight: .bold)) .foregroundColor(.white) .frame(maxWidth: .infinity, maxHeight: 50) @@ -206,7 +206,7 @@ struct ProductsScreenView: View { title: NSLocalizedString("recommend_like_title", comment: "") ) .onAppear { - viewModel.loadRecommenderRecommendations(currentProductId: "665") + viewModel.loadRecommenderRecommendations(currentProductId: AppConfigVariables.recommendationCode) } Spacer().frame(height: 36) @@ -219,11 +219,13 @@ struct CounterSectionView: View { var body: some View { HStack(spacing: 0) { - Button(action: { - if counter > 0 { - counter -= 1 + Button( + action: { + if counter > 0 { + counter -= 1 + } } - }) { + ) { Text("-") .font(.system(size: 20, weight: .bold)) .foregroundColor(.black) diff --git a/App/Views/Screens/SettingsScreenView.swift b/App/Views/Screens/SettingsScreenView.swift index e406487..acf20db 100644 --- a/App/Views/Screens/SettingsScreenView.swift +++ b/App/Views/Screens/SettingsScreenView.swift @@ -70,7 +70,7 @@ struct SettingsErrorScreenView: View { .foregroundColor(.red) .padding() - Button("Retry") { + Button("retry_button_title") { retryAction() } .padding() diff --git a/Core/Utils/AppConvigVariables.swift b/Core/Utils/AppConvigVariables.swift index 9a7c379..e0d3745 100644 --- a/Core/Utils/AppConvigVariables.swift +++ b/Core/Utils/AppConvigVariables.swift @@ -1,4 +1,3 @@ -// Config.swift import Foundation struct AppConfigVariables { @@ -6,4 +5,7 @@ struct AppConfigVariables { static let shopId: String = ProcessInfo.processInfo.environment["SHOP_ID"] ?? "" static let apiDomain: String = ProcessInfo.processInfo.environment["API_DOMAIN_PATH"] ?? "api.rees46.ru" static let sdkStream: String = ProcessInfo.processInfo.environment["SDK_STREAM"] ?? "ios" + static let arrivalsCode: String = ProcessInfo.processInfo.environment["ARRIVALS_CODE"] ?? "" + static let topTrendsCode: String = ProcessInfo.processInfo.environment["TOP_TRENDS"] ?? "" + static let recommendationCode: String = ProcessInfo.processInfo.environment["RECOMMENDATION_CODE"] ?? "" } diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 8357a6a..1ce5142 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -321,7 +321,6 @@ 75B935552C3564360063E814 /* App */ = { isa = PBXGroup; children = ( - 75E97A7F2C51319A0081B069 /* New Group */, 75E979E12C4AE4630081B069 /* Views */, 75E97A1F2C501E650081B069 /* ViewModels */, 75ECCD182C36F92A00D6D346 /* Navigation */, @@ -743,13 +742,6 @@ path = Model; sourceTree = ""; }; - 75E97A7F2C51319A0081B069 /* New Group */ = { - isa = PBXGroup; - children = ( - ); - path = "New Group"; - sourceTree = ""; - }; 75E97A802C51322F0081B069 /* ViewModel */ = { isa = PBXGroup; children = ( diff --git a/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme index dac265b..7d381d6 100644 --- a/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme +++ b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme @@ -74,6 +74,12 @@ ReferencedContainer = "container:demo-store-ios.xcodeproj"> + + + + + + + + + + Date: Wed, 24 Jul 2024 18:27:08 +0200 Subject: [PATCH 71/85] chore: Add localizable strings --- Core/Resources/Localizable.xcstrings | 38 +++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/Core/Resources/Localizable.xcstrings b/Core/Resources/Localizable.xcstrings index 07724ad..f4c3b32 100644 --- a/Core/Resources/Localizable.xcstrings +++ b/Core/Resources/Localizable.xcstrings @@ -16,8 +16,16 @@ "+" : { }, - "Add to Cart" : { - + "add_to_cart_button_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add to Cart" + } + } + } }, "also_bought_title" : { "extractionState" : "manual", @@ -118,6 +126,17 @@ } } }, + "empty_products_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No product available" + } + } + } + }, "Free" : { }, @@ -174,9 +193,6 @@ } } } - }, - "No product available" : { - }, "No product data available" : { @@ -247,8 +263,16 @@ } } }, - "Retry" : { - + "retry_button_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Retry" + } + } + } }, "search_count_result" : { "extractionState" : "manual", From 4d008f208f2f89fc1dc561d9f68337113c08bffd Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 29 Jul 2024 11:24:48 +0200 Subject: [PATCH 72/85] chore(pods): Update sdk version --- Podfile | 2 +- Podfile.lock | 14 +- Pods/Local Podspecs/REES46.podspec.json | 4 +- Pods/Manifest.lock | 14 +- Pods/Pods.xcodeproj/project.pbxproj | 1235 ++++++++++------- .../Classes/SimplePersonalizationSDK.swift | 247 ++-- .../REES46/REES46-Info.plist | 2 +- demo-store-ios.xcodeproj/project.pbxproj | 8 +- 8 files changed, 859 insertions(+), 667 deletions(-) diff --git a/Podfile b/Podfile index e9903bc..5ccba5b 100644 --- a/Podfile +++ b/Podfile @@ -3,7 +3,7 @@ platform :ios, '13.0' target 'demo-store-ios' do use_frameworks! - pod 'REES46', :git => 'https://github.com/rees46/ios-sdk.git', :branch => 'master', :tag => '3.6.19' + pod 'REES46', :git => 'https://github.com/rees46/ios-sdk.git', :branch => 'master', :tag => '3.6.27' pod "Resolver" end diff --git a/Podfile.lock b/Podfile.lock index ccf47e9..5268b22 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,9 +1,9 @@ PODS: - - REES46 (3.6.23) + - REES46 (3.6.27) - Resolver (1.5.1) DEPENDENCIES: - - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) + - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.27`) - Resolver SPEC REPOS: @@ -14,18 +14,18 @@ EXTERNAL SOURCES: REES46: :branch: master :git: https://github.com/rees46/ios-sdk.git - :tag: 3.6.19 + :tag: 3.6.27 CHECKOUT OPTIONS: REES46: - :commit: b8ed253322fdc67d191acdddd51efc5a3e0ab7a0 + :commit: 409a13afc6e700bacde70c5195799759e2c67e84 :git: https://github.com/rees46/ios-sdk.git - :tag: 3.6.19 + :tag: 3.6.27 SPEC CHECKSUMS: - REES46: 8c66b0fdb9f0a6c62a15fb04fafe621b2952149b + REES46: 31b6354944d6f03617e153d5a8ab0309e596a2e4 Resolver: 0e2ce51257e9366c54afe1b9e9be25059e9b9300 -PODFILE CHECKSUM: c7370fe6ff1205586ebc35502940f4f806351ae7 +PODFILE CHECKSUM: 193b27368aafab71fe90c63e381b9011a14c35da COCOAPODS: 1.15.2 diff --git a/Pods/Local Podspecs/REES46.podspec.json b/Pods/Local Podspecs/REES46.podspec.json index 6c33854..8b20184 100644 --- a/Pods/Local Podspecs/REES46.podspec.json +++ b/Pods/Local Podspecs/REES46.podspec.json @@ -1,6 +1,6 @@ { "name": "REES46", - "version": "3.6.23", + "version": "3.6.27", "summary": "REES46 SDK for iOS platform - the wide toolset for eCommerce apps. This SDK can be used to integrate in your own app for iOS in few steps.", "readme": "https://reference.api.rees46.com/#{spec.version.to_s}/README.md", "description": "REES46 SDK for iOS platform - the wide toolset for eCommerce apps:\n\n- Personalization engine.\n- Product recommendations.\n- Personalized products search engine.\n- Bulk emails, push-notifications, SMS and Telegram messages.\n- Transactional emails, push-notifications, Telegram and SMS.\n- Drip campaigns (email, push, Telegram, SMS).\n- Customizable on-site popups.\n- CRM, CDP and customer segments.\n- Net Promoter Score tool for any goal.\n- Stories.\n- In-app push.\n- Loyalty program.\n\nYou can integrate all REES46 tools into your iOS app.", @@ -19,7 +19,7 @@ "source": { "git": "https://github.com/rees46/ios-sdk.git", "branch": "master", - "tag": "3.6.23" + "tag": "3.6.27" }, "platforms": { "ios": "12.0" diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index ccf47e9..5268b22 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,9 +1,9 @@ PODS: - - REES46 (3.6.23) + - REES46 (3.6.27) - Resolver (1.5.1) DEPENDENCIES: - - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.19`) + - REES46 (from `https://github.com/rees46/ios-sdk.git`, branch `master`, tag `3.6.27`) - Resolver SPEC REPOS: @@ -14,18 +14,18 @@ EXTERNAL SOURCES: REES46: :branch: master :git: https://github.com/rees46/ios-sdk.git - :tag: 3.6.19 + :tag: 3.6.27 CHECKOUT OPTIONS: REES46: - :commit: b8ed253322fdc67d191acdddd51efc5a3e0ab7a0 + :commit: 409a13afc6e700bacde70c5195799759e2c67e84 :git: https://github.com/rees46/ios-sdk.git - :tag: 3.6.19 + :tag: 3.6.27 SPEC CHECKSUMS: - REES46: 8c66b0fdb9f0a6c62a15fb04fafe621b2952149b + REES46: 31b6354944d6f03617e153d5a8ab0309e596a2e4 Resolver: 0e2ce51257e9366c54afe1b9e9be25059e9b9300 -PODFILE CHECKSUM: c7370fe6ff1205586ebc35502940f4f806351ae7 +PODFILE CHECKSUM: 193b27368aafab71fe90c63e381b9011a14c35da COCOAPODS: 1.15.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index f5b391c..f17b25e 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,335 +7,359 @@ objects = { /* Begin PBXBuildFile section */ - 000B92572AB3BA2EF78F29FC06720F72 /* FontFamily.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */; }; - 00E4A44ED57BE79A80742EFB71221A8F /* Coverable+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */; }; - 0334759C415B8CF146E61AB99FE69227 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */; }; - 03FFFE029584CC21DD2FDC4369224B1E /* NotificationHandlingServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */; }; - 05438BA0424A6EACD940A12BADEA800A /* UIFont+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */; }; - 05921ED246B06FE8677425ED82B6C032 /* TBTextConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */; }; - 077CADF6F924345A3E25E7D7003BBD5E /* URLSessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */; }; - 091DF2ED562F9F9107EF807638E22662 /* SearchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */; }; - 0CFFB84337D831CA8EF3617D7DB3772E /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A791B748A86BE064FA80C12134F8E728 /* Loader.swift */; }; - 0F50D04988DAEFAB5D74706EE6591588 /* StoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */; }; - 1016ABA1F6A6BFBDE0EA9FC87B86A858 /* ViewConfigService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */; }; - 13EAE9F36834227AC6603F76D54DD1D4 /* SlideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */; }; - 14242A0D3156633A69FB084B10C60EDB /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */; }; - 14D4D1A202CB5C785E18D2ED9A93F81D /* StoriesSlideReloadIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */; }; - 155C4149B624787E4BAAA07B1D4EBD39 /* REES46-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */; }; - 18BA7C889427497D1A009D85662C46CE /* SdkGlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */; }; - 1905EBF3E70183BFC8580F3819F692CC /* NotificationHandlingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */; }; - 1B6FDB2F5513BFAA3FB1BB1B851B236F /* SdkImageReloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */; }; - 1C778D789F4B0897A6037CB978826072 /* RecommendResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */; }; - 1D0FCF6225378C95A3246107F648C538 /* TexBlockConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */; }; - 1DABF66E97AD95FCF260BA3176E86685 /* TrackingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */; }; - 1E35871E2E937C15DD42093DF742998B /* RecommendationsWidgetViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */; }; - 1F215B81847B4CD4B36342CE793CF473 /* RegisterNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */; }; - 20AED63279F202C3174FE802C696B9A1 /* VideoDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */; }; - 20FBF01A41A066522B5DEDF65AE31666 /* SearchWidgetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */; }; - 210280AA598517CF989A582413B25FCB /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */; }; - 216F659702FE03B7987F7AE153DC0185 /* ColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */; }; - 217043CCF240C170FBA603D1CD39C65A /* TrackServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */; }; - 21A6687D0BA31E63C8800D2C9F20CC70 /* ImageLoaderError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */; }; - 246ABC711084B7E4CC7B4A27989AB69E /* PushTokenNotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */; }; - 24A6C06C7F607033FE51591F7D66A682 /* SdkStyleCustomColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */; }; - 2868EA3EDB5D52CB4B54C1C280421595 /* StoriesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */; }; - 289E24AFFFBE57287ADD4AB22F17A4B9 /* SdkDynamicFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */; }; - 28F8EF2658BA628CA99983594C415D09 /* RecommendationsWidgetConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */; }; - 2A3ACC61257E4E88DE782C3CD1BC0CCE /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C82152B76290FC32122F96E2333F17 /* Assets.swift */; }; - 2D32B1BFDFC57E7BAFF6B73C30F42DFC /* NetworkStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */; }; - 34EF675DD2AB530F8C16D96F7D198E33 /* RecommendationsWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */; }; - 3726922467DD0501527002C0C31278E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - 3728D15DC1AE882F703003FDF14D52F0 /* SdkStyleColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */; }; - 38AFD9246E6995657D1EDE99EBC6CEE5 /* RWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */; }; - 39AE9A2AD1B349F39699B3578E56BF00 /* SdkStyleCustomColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */; }; - 3C0BFC786BED0FA23523678B73728154 /* RWebViewController_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */; }; - 41822CFDBD9C86FB87B351EBFEC58073 /* ProductsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */; }; - 42C4319E1A92EB4B2BB51E51D1E14D1F /* SdkQueryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */; }; - 44D5997FBA69F54DF6D3B0D068C7953D /* ImageLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */; }; - 44E68CF722456B675ABF6D715C514AC6 /* SdkStyleCustomFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */; }; - 45EB33BB9930BD56B2C0E09F8F7598DE /* VideoDownloadObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */; }; - 469C92E04B9D2D4F8392EE02C7A39C69 /* Pods-demo-store-ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7116768E9395945F655A57DAECC1A933 /* Pods-demo-store-ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 46DCEDA235C161852B926A0EF943EACC /* Data+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */; }; - 473ABA01905DAFFF8D07DEB476A9D75D /* SdkStyleCustomFontSizeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */; }; - 48A2019E7B6882B3B0C6BFF5A49E2C24 /* StoryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */; }; - 49DEB29E8A22D8F5F67907D19A906F18 /* SearchWidgetTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */; }; - 4CBB873363589E883524864FFBFE17D2 /* CarouselConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */; }; - 4DF1CC4FC7EAEB5C38F32AA1C39C5A07 /* PushTokenHandlerImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */; }; - 53758A7E257766681ECCDFEE4288C35D /* UIFontDescriptorUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */; }; - 53FD279BE6D27EC46BF71734B84F51A8 /* SearchWidgetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */; }; - 56369E2C8C8213D51A72552106A9C264 /* ImageData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */; }; - 56B8E8C41883E4FC7F171F62949E04BD /* SdkStyleCustomColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */; }; - 5A234484C926A75BA80099AEC8CC4611 /* SearchWidgetObjectification.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */; }; - 5DCEC664244099368ABFA62172F815C6 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */; }; - 5E8FB1E21260A9D830B33A759E4627F6 /* UIViewController+PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */; }; - 6447E67AD574E06A2B69690B0B29BC89 /* SdkActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */; }; - 66724EBA9152FA748810F92BAF9F80DC /* SubscriptionServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */; }; - 681A5A71427454B12747295ECDD0D24C /* NetworkRadioType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */; }; - 6DEFEFA0016D535ADBAD7B823B156E7D /* SdkFontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */; }; - 6E6B81FC768C9444F194B10B259FA696 /* SdkStyleUIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */; }; - 71A9026CA64F36A0A121DD4060BB5BB9 /* PushTokenNotificationServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */; }; - 71CDDF6B42C2D0D1CC5A94AB0BE99E23 /* UIBezierPath+Circle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */; }; - 72A17042882104723E9CA92A14D80CC1 /* URLLiteralConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */; }; - 73BBCA8BA8E0D143006C01813759AC18 /* SdkStyleColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */; }; - 78AF773DEA2008B6FE70C40246E48D18 /* TBAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */; }; - 7B10C150677B6261882D5C0C1297F00F /* StoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */; }; - 7CA7335FA31F5B8BF6A8FFA433CEE3AE /* CGSize+Min.swift in Sources */ = {isa = PBXBuildFile; fileRef = F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */; }; - 7EB26E79BA128D1E2F994D902036286C /* SearchWidgetListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */; }; - 81091327D041DE2EDC26B207E3584D0E /* UIBezierPath+ImagePlaceholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */; }; - 835A6430B8B241FF5E042D4415103DDD /* RView_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */; }; - 8AE54E966BB7B8583BF5B5BD952BDF0A /* UIImageView+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */; }; - 8B15040F27C854C43BE632FB8D86B683 /* TextBlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */; }; - 8BACD88871220B13AB285BC476A7F194 /* StoryCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */; }; - 8C1057083C31FF842CEEEF864911D1A4 /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */; }; - 8CE4BF9FB621CF956CB6262F53B07C83 /* NetworkStatusObserverUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */; }; - 8D05D7544E96EB065022900C06BD8BDA /* ReloadButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */; }; - 8D50E5745C533C21E8EAE239F4E59FC3 /* PromoCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */; }; - 90547932EA32076C22D800BDAD445A1F /* SearchWidgetCategoriesButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */; }; - 92E5F181D61E15ACB5931E80F5DDBBDB /* Stories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */; }; - 93C9B6D59CF164493225BB90330ED9CB /* SubscriptionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */; }; - 9550440BCB953E622CC97EFB797E3C07 /* StoriesImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */; }; - 9653EFA6AC3DDF7D0F90B549C485C9F9 /* RequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */; }; - 96F98929440C537CC83107C3747D6480 /* CarouselCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */; }; - 9997384531CF394E13FCDB94F6354C9A /* SessionDataTaskProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */; }; - 99B5996FC38567CF3ED494041F3E3BF1 /* Operative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */; }; - 9D19EE689D681F8493419C2CA1FB6D5E /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */; }; - A09249CC7461C9EC873C4AB82C16124B /* SdkFontInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */; }; - A150E969EA20BF59B3CF070A4240F180 /* HashStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */; }; - A1BE35C271D2217C0B4232D0AB0C8DA3 /* StoriesCollectionViewPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */; }; - A20FF0BB2984AC66216074B1EFBE8F98 /* RawRepresentable+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */; }; - A2D682E7527D83413A35CA870AF7B766 /* SdkApperanceViewScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */; }; - A5234B6659FC63CB96F6BC93C9D05DB7 /* SimplePersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */; }; - A84F0846ABE5B8D3E87FB73531F706A4 /* LoadingPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */; }; - A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A969E1ACC2EEF44464751BAB8DEB684E /* InitResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */; }; - ABCFB3FD321DE180968A5A0B2BB86A62 /* StoriesCollectionViewPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */; }; - AC146C49CFAC1C9EBDB2BAAF57FDD984 /* SettingsManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */; }; - AE87C2623409B5C7F73B12649F5B26E5 /* UIImage+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */; }; - AEB0C53C27CB087C3215538B6F476A33 /* CartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */; }; - B08BD0363F34B4423E46FDBAB017A26C /* VideoFileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */; }; - B14B39DD5BE9A500B163EE27C544AA2B /* CAPropertyAnimation+Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */; }; - B1FF3AA160C3354557A6B38A48756E98 /* Pods-demo-store-ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D4FB2CBD68E89DAE39DADAE996D715 /* Pods-demo-store-ios-dummy.m */; }; - B29CDD67B86238DFC22CB13179C4DAAA /* PersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */; }; - B2C4ADFF7916C0CA794767779FCF79D6 /* CGRect+Center.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */; }; - B3768606656AAEE8FE776B7A823030B1 /* Coverable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */; }; - B3C75BB3596FA47232F49322F2851860 /* SearchWidgetDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */; }; - B56C23C1C826628465D0881A71FC3346 /* SearchWidgetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */; }; - B886B2522D2C093BBCE9844BBC2A84AE /* ViewConfigPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */; }; - BA66BD722D1029DB90B91889AE435938 /* SdkStyleColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */; }; - BBCDC6622412DD3C491775830A55FE4D /* RecommendationsStarsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */; }; - BD49D731800904B988C8A771E0C1A9CC /* SdkStyleCustomFontSizeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */; }; - BF0485F5C192F225E4B519B7F2793DFC /* NetworkConnectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */; }; - BFC831FD30B89FC45404A6CBC78D2BEA /* NetworkConnectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */; }; - BFD7143593CAF751E9C8344B20488F31 /* UISdkWrapLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */; }; - C204C6976B8B9ACE9797F222AA6ECCA5 /* GenericDataTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */; }; - C3B214337422238B6F16DDD4D83FE86A /* SearchWidgetMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */; }; - C800B58B3331444C8BB27C4F89D2CE44 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */; }; - C88C545BF7521C369D2602C552A551A8 /* TextBlockConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */; }; - C9042F117FB2359CFFAE2A484BCAD759 /* SearchWidgetHistoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */; }; - CEDD87245EDA33E6EED478D04CFF3863 /* SdkConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */; }; - D0925D984A33493CBD8748EF9A3B91D3 /* Option.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */; }; - D0A994B97078D246BFD4805C729AC6FC /* SearchWidgetListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */; }; - D0D410CA575CE4E459381557FDEFA3A5 /* StoryBlockImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */; }; - D9B862FA4640C84B16DF0E2AF96459D3 /* TBFontConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */; }; - DA38244A91BEB77E42BD4F150B807505 /* ManagedViewConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */; }; - DEB27EE51D09D55258D69927B56120DB /* InitService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */; }; - E0B0ED3036DA4A0A5A0CA0FD17D1B9DF /* SessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */; }; - E0D9CD065B64C0D661B5FD42FEB79918 /* SdkStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */; }; - E385668DBCD81215689D1543C955E46A /* SdkPopupAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */; }; - E49668B0B739D147E3414D17D4A0BA0E /* SearchWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */; }; - E761A05087F0E09F0DC407500FEE98E2 /* ProductsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */; }; - E7E128BBA990CA16D6C7D2E12C7451B3 /* CGImageSource+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */; }; - E9CC56086B144A2A4193EF27C59F6FB1 /* CarouselCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */; }; - ED9F4F1DEDFDBEFCD5E129DA9755A705 /* PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */; }; - F38F22B4A2A822E5BC40C664C5943FB9 /* Disk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */; }; - F5AB8C4608DCCA8557A248A0EF9D3571 /* NetworkStatusObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */; }; - F685A237C47426370D2AC2956285C3E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - F6DEE3FA2EF0113730454100EEE86756 /* StoriesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */; }; - F83B27F3BA95658EAD242D8EC0FF4C91 /* SlideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */; }; - FA8B5D62D1F65F6083B7FF811EB32EBB /* SearchWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */; }; - FF76EE2CCAF3321D9F471F7D3BC05971 /* SessionOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */; }; + 000B92572AB3BA2EF78F29FC06720F72 /* FontFamily.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D95132DF76F9268898A274E66982D7A /* FontFamily.swift */; }; + 00E4A44ED57BE79A80742EFB71221A8F /* Coverable+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5032FA3898BA2ED9EA1B442884E3B2B9 /* Coverable+UIKit.swift */; }; + 0334759C415B8CF146E61AB99FE69227 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6C4CF9A9F6C229713C39AB29E51469FD /* Assets.xcassets */; }; + 03FFFE029584CC21DD2FDC4369224B1E /* NotificationHandlingServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9684A1A62561C84568992C79EAAF2B97 /* NotificationHandlingServiceImpl.swift */; }; + 05438BA0424A6EACD940A12BADEA800A /* UIFont+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65B47826D26A6C0943D0924CE38F02D5 /* UIFont+FontInjector.swift */; }; + 05921ED246B06FE8677425ED82B6C032 /* TBTextConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4095DAB455ABA0730ED73CAD71DCE206 /* TBTextConfiguration.swift */; }; + 077CADF6F924345A3E25E7D7003BBD5E /* URLSessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55AABAF07513678958C82D21574EE6AD /* URLSessionQueue.swift */; }; + 091DF2ED562F9F9107EF807638E22662 /* SearchResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B22455637D3BEC9BA719B5A2D2D413C /* SearchResponse.swift */; }; + 0CFFB84337D831CA8EF3617D7DB3772E /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89D4E1D8FBF0797712533614C8F902DA /* Loader.swift */; }; + 0F50D04988DAEFAB5D74706EE6591588 /* StoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B148A2F3434DE09C6CD1C048DF5AD76D /* StoryViewController.swift */; }; + 1016ABA1F6A6BFBDE0EA9FC87B86A858 /* ViewConfigService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6979C1E9729725E9B9CA859DAA6793 /* ViewConfigService.swift */; }; + 13EAE9F36834227AC6603F76D54DD1D4 /* SlideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95D224BC8ADE78CF3A02C45A0B5A2734 /* SlideViewController.swift */; }; + 14242A0D3156633A69FB084B10C60EDB /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 729005440B6F90C18F2BC4B11DD14101 /* ImageLoader.swift */; }; + 14D4D1A202CB5C785E18D2ED9A93F81D /* StoriesSlideReloadIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65EE316BAA24A8C3B9088F4FD92ACA81 /* StoriesSlideReloadIndicator.swift */; }; + 155C4149B624787E4BAAA07B1D4EBD39 /* REES46-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D597A807E445BAE72152BCE34621BBA9 /* REES46-dummy.m */; }; + 18BA7C889427497D1A009D85662C46CE /* SdkGlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8477201876AE4346F4EDA080A8DC1D3A /* SdkGlobalHelper.swift */; }; + 1905EBF3E70183BFC8580F3819F692CC /* NotificationHandlingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4DF9B812473B1B6CC3FE24667CF2C1B /* NotificationHandlingService.swift */; }; + 1B6FDB2F5513BFAA3FB1BB1B851B236F /* SdkImageReloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = E23541FDD4FB76F8FB6280CE37DF1568 /* SdkImageReloader.swift */; }; + 1C778D789F4B0897A6037CB978826072 /* RecommendResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = A22870D437334BC692BDBC57357A7F1B /* RecommendResponse.swift */; }; + 1D0FCF6225378C95A3246107F648C538 /* TexBlockConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCFDEBEA464E5DCC274F85FFB32E784F /* TexBlockConfiguration.swift */; }; + 1DABF66E97AD95FCF260BA3176E86685 /* TrackingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10D10E02E6B97F97915448E7635D731E /* TrackingService.swift */; }; + 1E35871E2E937C15DD42093DF742998B /* RecommendationsWidgetViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6C84529591749DD80921D933282C8C4 /* RecommendationsWidgetViewCell.swift */; }; + 1F215B81847B4CD4B36342CE793CF473 /* RegisterNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CFCB47107356A4063304CE05D2268D4 /* RegisterNotification.swift */; }; + 20AED63279F202C3174FE802C696B9A1 /* VideoDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98EAB524494C408BA9511B525A89DBD4 /* VideoDownloadManager.swift */; }; + 20FBF01A41A066522B5DEDF65AE31666 /* SearchWidgetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 865C853D75F1A51216F70B876C0470D1 /* SearchWidgetExtension.swift */; }; + 210280AA598517CF989A582413B25FCB /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8991FCA1A1E59768D8582E07C984323C /* NotificationService.swift */; }; + 216F659702FE03B7987F7AE153DC0185 /* ColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054B17CB40AC8BCD412F6153E91F70A3 /* ColorExtensions.swift */; }; + 217043CCF240C170FBA603D1CD39C65A /* TrackServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F424910F7AC5B74E5E21193BDF86748 /* TrackServiceImpl.swift */; }; + 21A6687D0BA31E63C8800D2C9F20CC70 /* ImageLoaderError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E391F42EF4ED1F7DEB808697763EF58 /* ImageLoaderError.swift */; }; + 21C5236B0A2082EEC1DA024B194EDAF0 /* Pods-demo-store-ios-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7116768E9395945F655A57DAECC1A933 /* Pods-demo-store-ios-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 246ABC711084B7E4CC7B4A27989AB69E /* PushTokenNotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4693CC234E1865FEDCCE54DE6432B3F8 /* PushTokenNotificationService.swift */; }; + 24A6C06C7F607033FE51591F7D66A682 /* SdkStyleCustomColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24F1F2AC006EAEF9AE5F8795547E5E5F /* SdkStyleCustomColorSchemeAwareViewController.swift */; }; + 2868EA3EDB5D52CB4B54C1C280421595 /* StoriesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13A82CEE6333CA39359FD8E3755DABDE /* StoriesView.swift */; }; + 289E24AFFFBE57287ADD4AB22F17A4B9 /* SdkDynamicFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F18713C7B90D58145E7FFA613B147D3 /* SdkDynamicFont.swift */; }; + 28F8EF2658BA628CA99983594C415D09 /* RecommendationsWidgetConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE9112ABE7E60C0ECAF394EFBE817AA8 /* RecommendationsWidgetConstants.swift */; }; + 2A3ACC61257E4E88DE782C3CD1BC0CCE /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 788E8B696A5D042855C2F1BD95FE3D88 /* Assets.swift */; }; + 2B8F5E4C61F8449068912DC64D160E64 /* Pods-demo-store-ios-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D4FB2CBD68E89DAE39DADAE996D715 /* Pods-demo-store-ios-dummy.m */; }; + 2D32B1BFDFC57E7BAFF6B73C30F42DFC /* NetworkStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = D39FC3F00BA45A55026CA72872B3A16C /* NetworkStatus.swift */; }; + 34EF675DD2AB530F8C16D96F7D198E33 /* RecommendationsWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24DF76F79FD76D5D61A7A80DB32A8AE /* RecommendationsWidgetView.swift */; }; + 3728D15DC1AE882F703003FDF14D52F0 /* SdkStyleColorSchemeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5932B7FDF86C8603E0905796916151B5 /* SdkStyleColorSchemeAwareViewController.swift */; }; + 38AFD9246E6995657D1EDE99EBC6CEE5 /* RWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D754AE66A3217DCE8F7AF28EDAABC5E3 /* RWebViewController.swift */; }; + 3961DF7C4269161ED6BD0023F76BCA4F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */; }; + 39AE9A2AD1B349F39699B3578E56BF00 /* SdkStyleCustomColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8F5186C4000554C5C2D93E9E9359B2A /* SdkStyleCustomColorScheme.swift */; }; + 3C0BFC786BED0FA23523678B73728154 /* RWebViewController_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A223CBDBC801475ED6E139948FC6B7A3 /* RWebViewController_Extensions.swift */; }; + 41822CFDBD9C86FB87B351EBFEC58073 /* ProductsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7626FE59EA0083471ED7BFB8A0503CF4 /* ProductsButton.swift */; }; + 42C4319E1A92EB4B2BB51E51D1E14D1F /* SdkQueryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C23B42A733F6F6BB4866A4241F038BA /* SdkQueryBuilder.swift */; }; + 44D5997FBA69F54DF6D3B0D068C7953D /* ImageLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4EA0E3F27697657A9D80F2AC00109BE /* ImageLoading.swift */; }; + 44E68CF722456B675ABF6D715C514AC6 /* SdkStyleCustomFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E88F2967F4B278025EAE135642570B2 /* SdkStyleCustomFonts.swift */; }; + 45EB33BB9930BD56B2C0E09F8F7598DE /* VideoDownloadObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78ABF3748640C16CEB3504FA2B351429 /* VideoDownloadObject.swift */; }; + 46DCEDA235C161852B926A0EF943EACC /* Data+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58D9FD5722E2959987EDFA03D7C2168C /* Data+ImageLoader.swift */; }; + 473ABA01905DAFFF8D07DEB476A9D75D /* SdkStyleCustomFontSizeAwareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E9078AD1415FA4F07660A3D7A1B3EDC /* SdkStyleCustomFontSizeAwareViewController.swift */; }; + 48A2019E7B6882B3B0C6BFF5A49E2C24 /* StoryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C47CA0088C5709393ED4F4B16086926 /* StoryCollectionViewCell.swift */; }; + 49DEB29E8A22D8F5F67907D19A906F18 /* SearchWidgetTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6A62E0EE0F2BE6B027E958A2E513212 /* SearchWidgetTextField.swift */; }; + 4CBB873363589E883524864FFBFE17D2 /* CarouselConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C09A82C94094F8681AFB97A5A0C2A90A /* CarouselConstants.swift */; }; + 4DF1CC4FC7EAEB5C38F32AA1C39C5A07 /* PushTokenHandlerImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CCEC64C2C07530AF89DEDE667B72 /* PushTokenHandlerImpl.swift */; }; + 4F8482D5E03619D0BF470585CC65A21E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */; }; + 5352192BB2E12C809436BAB92A33B08C /* Resolver-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EA9154452194A6C2DE91102D74AB5658 /* Resolver-dummy.m */; }; + 53758A7E257766681ECCDFEE4288C35D /* UIFontDescriptorUsage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C24E81606B1463DA08F8DC6443B8F20 /* UIFontDescriptorUsage.swift */; }; + 53FD279BE6D27EC46BF71734B84F51A8 /* SearchWidgetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7632B3306B5915098424C9B8633E6409 /* SearchWidgetViewController.swift */; }; + 56369E2C8C8213D51A72552106A9C264 /* ImageData.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8647FBFD38262B812B6185CF909E309 /* ImageData.swift */; }; + 56B8E8C41883E4FC7F171F62949E04BD /* SdkStyleCustomColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CCFDA412E7BB6719DDA050BB5C81B5F /* SdkStyleCustomColorSchemeAwareView.swift */; }; + 5A234484C926A75BA80099AEC8CC4611 /* SearchWidgetObjectification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 666329C5E849E30DC1538CD2F4C4AEA6 /* SearchWidgetObjectification.swift */; }; + 5DCEC664244099368ABFA62172F815C6 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B584A1A3FF2C836FDBD2BD8608EDFBB /* UIColor+Extension.swift */; }; + 5E8FB1E21260A9D830B33A759E4627F6 /* UIViewController+PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8BDE782C1EEB93A01F6C9CC377A66E7 /* UIViewController+PromocodeBanner.swift */; }; + 6447E67AD574E06A2B69690B0B29BC89 /* SdkActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFACCDCF6BC71A771C72075C5050C68F /* SdkActivityIndicator.swift */; }; + 66724EBA9152FA748810F92BAF9F80DC /* SubscriptionServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B341830C9437DEEE37BE76520D6B60 /* SubscriptionServiceImpl.swift */; }; + 681A5A71427454B12747295ECDD0D24C /* NetworkRadioType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 423D8F634C8260F7062A982EF97D0116 /* NetworkRadioType.swift */; }; + 6DEFEFA0016D535ADBAD7B823B156E7D /* SdkFontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297C3C9558F82D7DB9D196365AB6F11D /* SdkFontInjector.swift */; }; + 6E6B81FC768C9444F194B10B259FA696 /* SdkStyleUIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC2A107C1BE421B18F06D150867D8A8C /* SdkStyleUIApplication.swift */; }; + 71A9026CA64F36A0A121DD4060BB5BB9 /* PushTokenNotificationServiceImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840E523C4B2C0ABD030537548D229D18 /* PushTokenNotificationServiceImpl.swift */; }; + 71CDDF6B42C2D0D1CC5A94AB0BE99E23 /* UIBezierPath+Circle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 880874F7A9A6F10E605C0BAF6C79CFFE /* UIBezierPath+Circle.swift */; }; + 72A17042882104723E9CA92A14D80CC1 /* URLLiteralConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FD8AB80480E2F8896B1C91034AF5DCA /* URLLiteralConvertible.swift */; }; + 73BBCA8BA8E0D143006C01813759AC18 /* SdkStyleColorScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C0C4C0E5B71319B016EB862BD53C7AE /* SdkStyleColorScheme.swift */; }; + 78AF773DEA2008B6FE70C40246E48D18 /* TBAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7EE8FFAF1DDB6B8FFA9F48F1460182 /* TBAppearanceConfiguration.swift */; }; + 7B10C150677B6261882D5C0C1297F00F /* StoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B4343F4078E421795EF8A8E289D6E20 /* StoryButton.swift */; }; + 7CA7335FA31F5B8BF6A8FFA433CEE3AE /* CGSize+Min.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EE3A771CC6DB61EB094762BCFDBFC5 /* CGSize+Min.swift */; }; + 7EB26E79BA128D1E2F994D902036286C /* SearchWidgetListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09D3C44076AC345FCC99586417DE8DC7 /* SearchWidgetListView.swift */; }; + 81091327D041DE2EDC26B207E3584D0E /* UIBezierPath+ImagePlaceholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ACA082EA9115579E4B9D6D2C1640C19 /* UIBezierPath+ImagePlaceholder.swift */; }; + 835A6430B8B241FF5E042D4415103DDD /* RView_Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F24C8CFEBEB1CA4BF17447369C29408C /* RView_Extensions.swift */; }; + 87AF8F757C19F3FA49377F8C3CD4486D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 18EDD70FAE76ABF902F4CC3C555D727B /* PrivacyInfo.xcprivacy */; }; + 8AE54E966BB7B8583BF5B5BD952BDF0A /* UIImageView+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88EC488C3002448B39D74FA63F181B1 /* UIImageView+ImageLoader.swift */; }; + 8B15040F27C854C43BE632FB8D86B683 /* TextBlockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B456C7FD17C572F1FC7AAD91D989AB93 /* TextBlockView.swift */; }; + 8BACD88871220B13AB285BC476A7F194 /* StoryCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D74BD63FE889F2093A5AD763144E9BB1 /* StoryCollectionViewCell.xib */; }; + 8C1057083C31FF842CEEEF864911D1A4 /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED36F152560F5D592DB5CA8EB35FC8FB /* UserSettings.swift */; }; + 8CE4BF9FB621CF956CB6262F53B07C83 /* NetworkStatusObserverUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C7F01562FA95F0BA9BC1085172DA4A4 /* NetworkStatusObserverUI.swift */; }; + 8D05D7544E96EB065022900C06BD8BDA /* ReloadButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAAC26210F1BA43CE46EF96714104515 /* ReloadButton.swift */; }; + 8D50E5745C533C21E8EAE239F4E59FC3 /* PromoCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33B5658B1B66558E6E37DEB2A9BE9B82 /* PromoCodeView.swift */; }; + 8EC13D530673067992EFE5C59BA07CF7 /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F70619829B9D3A4C395F8ED2FE43DD88 /* Resolver.swift */; }; + 90547932EA32076C22D800BDAD445A1F /* SearchWidgetCategoriesButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585EE06F85888A8317F9D59985AF7E2F /* SearchWidgetCategoriesButton.swift */; }; + 92E5F181D61E15ACB5931E80F5DDBBDB /* Stories.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8E48A3354A21139597AD432F4931D7 /* Stories.swift */; }; + 93C9B6D59CF164493225BB90330ED9CB /* SubscriptionService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C22CFCA4407D228B3178E238BCF78AEA /* SubscriptionService.swift */; }; + 9550440BCB953E622CC97EFB797E3C07 /* StoriesImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = E44AA690C57E372E9DDD34A99BAC5094 /* StoriesImageLoader.swift */; }; + 9653EFA6AC3DDF7D0F90B549C485C9F9 /* RequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA72AB305058A22216BCD20A7AD492E9 /* RequestOperation.swift */; }; + 96F98929440C537CC83107C3747D6480 /* CarouselCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A0A74A60559E37121785A69A5E4FD11 /* CarouselCollectionView.swift */; }; + 9997384531CF394E13FCDB94F6354C9A /* SessionDataTaskProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC94FDD099EC6DF033BE719FCA851769 /* SessionDataTaskProtocol.swift */; }; + 99B5996FC38567CF3ED494041F3E3BF1 /* Operative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46078399770FC3AB917F74E7FCB7E23C /* Operative.swift */; }; + 9D19EE689D681F8493419C2CA1FB6D5E /* UserDefaultsExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01C0641FF52A756754B9AA4EE4F92211 /* UserDefaultsExtension.swift */; }; + A09249CC7461C9EC873C4AB82C16124B /* SdkFontInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3CC78EC1E059D7BFBF1797D4796EF8 /* SdkFontInstaller.swift */; }; + A150E969EA20BF59B3CF070A4240F180 /* HashStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 203D9E554B6AD0CA2DBCFB6004F80052 /* HashStorage.swift */; }; + A1BE35C271D2217C0B4232D0AB0C8DA3 /* StoriesCollectionViewPreviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 458AB880D7CDA00C9A2FCC03D52654BB /* StoriesCollectionViewPreviewCell.swift */; }; + A20FF0BB2984AC66216074B1EFBE8F98 /* RawRepresentable+FontInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7284C1E32418C7CEE227F581217DE057 /* RawRepresentable+FontInjector.swift */; }; + A2D682E7527D83413A35CA870AF7B766 /* SdkApperanceViewScheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9584CF1FF6858C640CEFC52E1C9A1E1 /* SdkApperanceViewScheme.swift */; }; + A5234B6659FC63CB96F6BC93C9D05DB7 /* SimplePersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AA521024584A7CC9019483C5442322B /* SimplePersonalizationSDK.swift */; }; + A84F0846ABE5B8D3E87FB73531F706A4 /* LoadingPlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 006D7B411807B85526039B562CE8E0CB /* LoadingPlaceholderView.swift */; }; + A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 55C639AE46E1BC87F79DD6293883B14C /* REES46-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A969E1ACC2EEF44464751BAB8DEB684E /* InitResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57EF1C44205594F6B4D9A055E7F2297 /* InitResponse.swift */; }; + ABCFB3FD321DE180968A5A0B2BB86A62 /* StoriesCollectionViewPreviewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 361D023E01B21B759CEDD96425B4EB08 /* StoriesCollectionViewPreviewCell.xib */; }; + AC146C49CFAC1C9EBDB2BAAF57FDD984 /* SettingsManageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CBE5668F43E8F4C4798EDE6267D31 /* SettingsManageable.swift */; }; + AE87C2623409B5C7F73B12649F5B26E5 /* UIImage+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F1318A37D33355F02E93D4E1B8CB40 /* UIImage+ImageLoader.swift */; }; + AEB0C53C27CB087C3215538B6F476A33 /* CartItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13310336C32A8CB04EA4C1A04715D7CD /* CartItem.swift */; }; + B08BD0363F34B4423E46FDBAB017A26C /* VideoFileUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D2FC20A497D2FCAF4A23E06B31D5835 /* VideoFileUtils.swift */; }; + B14B39DD5BE9A500B163EE27C544AA2B /* CAPropertyAnimation+Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = 481A23D002D1C55D2014685BDDC523F8 /* CAPropertyAnimation+Key.swift */; }; + B29CDD67B86238DFC22CB13179C4DAAA /* PersonalizationSDK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 824FAD4991B5DFA639F7D00E9EFD9268 /* PersonalizationSDK.swift */; }; + B2C4ADFF7916C0CA794767779FCF79D6 /* CGRect+Center.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89E68D512B837CC27D1E1500044C943B /* CGRect+Center.swift */; }; + B3768606656AAEE8FE776B7A823030B1 /* Coverable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ACE401F6461E22F93B8228E0DA53C49 /* Coverable.swift */; }; + B3C75BB3596FA47232F49322F2851860 /* SearchWidgetDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B682BBBFC00215B0C80DE423C57F5D4C /* SearchWidgetDelegate.swift */; }; + B56C23C1C826628465D0881A71FC3346 /* SearchWidgetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBA380EE62922598664672D457EBC26 /* SearchWidgetModel.swift */; }; + B886B2522D2C093BBCE9844BBC2A84AE /* ViewConfigPlain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71B1F390E7E63CA54A496BE30C7B6CA8 /* ViewConfigPlain.swift */; }; + BA66BD722D1029DB90B91889AE435938 /* SdkStyleColorSchemeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD1814B0CEA7FABAE5AABBEB187D022 /* SdkStyleColorSchemeAwareView.swift */; }; + BBCDC6622412DD3C491775830A55FE4D /* RecommendationsStarsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B812D966FF5B03C7DCA2C719BACD59C2 /* RecommendationsStarsView.swift */; }; + BD49D731800904B988C8A771E0C1A9CC /* SdkStyleCustomFontSizeAwareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE6CC60601982077C5DFD420CF21FF26 /* SdkStyleCustomFontSizeAwareView.swift */; }; + BF0485F5C192F225E4B519B7F2793DFC /* NetworkConnectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40C6A5099A6262B396E779D46EA418A2 /* NetworkConnectionType.swift */; }; + BFC831FD30B89FC45404A6CBC78D2BEA /* NetworkConnectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5085525DE8A8C69991BFD428853AE9B4 /* NetworkConnectionStatus.swift */; }; + BFD7143593CAF751E9C8344B20488F31 /* UISdkWrapLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 610813B0C4C62F01CBB9C8480F4CF5EB /* UISdkWrapLabel.swift */; }; + C204C6976B8B9ACE9797F222AA6ECCA5 /* GenericDataTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB28A541896C734C8E7BCF5E533C9E5 /* GenericDataTask.swift */; }; + C3B214337422238B6F16DDD4D83FE86A /* SearchWidgetMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75818132ED88314125153A5590C1C638 /* SearchWidgetMainView.swift */; }; + C800B58B3331444C8BB27C4F89D2CE44 /* Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 848F6F5834CC4EB7D287A93F2075CA21 /* Navigation.swift */; }; + C88C545BF7521C369D2602C552A551A8 /* TextBlockConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDD2EC39AD926EB8646A3ECEFAD8E840 /* TextBlockConstants.swift */; }; + C9042F117FB2359CFFAE2A484BCAD759 /* SearchWidgetHistoryButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9692A7772995ACB6EB1DF6916C8D138B /* SearchWidgetHistoryButton.swift */; }; + CEDD87245EDA33E6EED478D04CFF3863 /* SdkConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750C69D3CD3838F61CDE14D97051E8B6 /* SdkConfiguration.swift */; }; + D0925D984A33493CBD8748EF9A3B91D3 /* Option.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98E893B8E2FBCE442EEE0B88DF2E3DCE /* Option.swift */; }; + D0A994B97078D246BFD4805C729AC6FC /* SearchWidgetListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4E8346FCEDF183F25A4AF1D2230C94C /* SearchWidgetListViewCell.swift */; }; + D0D410CA575CE4E459381557FDEFA3A5 /* StoryBlockImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E5FC66C1AA0C0EA7D4ADAE5A86695B /* StoryBlockImageCache.swift */; }; + D9B862FA4640C84B16DF0E2AF96459D3 /* TBFontConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF7553DBDD8E9FD91ADA9D50BFA07B0C /* TBFontConfiguration.swift */; }; + DA38244A91BEB77E42BD4F150B807505 /* ManagedViewConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48A76277ECC8E3229ABE54F2446F79FA /* ManagedViewConfig.swift */; }; + DEB27EE51D09D55258D69927B56120DB /* InitService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5265E0ED6D5761A5F5B4280E5DC9699B /* InitService.swift */; }; + E0B0ED3036DA4A0A5A0CA0FD17D1B9DF /* SessionQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D6E9C937ECED5AE5B1C384A64A611BD /* SessionQueue.swift */; }; + E0D9CD065B64C0D661B5FD42FEB79918 /* SdkStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B20CA568E97CD47D30833E8BBA03609 /* SdkStyle.swift */; }; + E385668DBCD81215689D1543C955E46A /* SdkPopupAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44B9BB904CF6B5BBB78ADF0327076D60 /* SdkPopupAlertView.swift */; }; + E49668B0B739D147E3414D17D4A0BA0E /* SearchWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F722C35D2174564A6608F9868B70352 /* SearchWidgetView.swift */; }; + E761A05087F0E09F0DC407500FEE98E2 /* ProductsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52C6ABC60834B40A0B382527159B8D6F /* ProductsResponse.swift */; }; + E7E128BBA990CA16D6C7D2E12C7451B3 /* CGImageSource+ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 235E7EFDE8A999C308AD6CBB82688526 /* CGImageSource+ImageLoader.swift */; }; + E9CC56086B144A2A4193EF27C59F6FB1 /* CarouselCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8153C3C08485CF12D98C18A9D83052E /* CarouselCollectionViewCell.swift */; }; + EA14653F4A93DDC4CBAE110557C64BD8 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D245E0514AAC1A2B9A6D5EA2F383E90F /* UIKit.framework */; }; + ED9F4F1DEDFDBEFCD5E129DA9755A705 /* PromocodeBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98CFAA09A4D847B30FFD98C847B0D344 /* PromocodeBanner.swift */; }; + F38F22B4A2A822E5BC40C664C5943FB9 /* Disk.swift in Sources */ = {isa = PBXBuildFile; fileRef = C91138E3AA2D7155B7A83868FEA30C59 /* Disk.swift */; }; + F5AB8C4608DCCA8557A248A0EF9D3571 /* NetworkStatusObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD0D81D0C7B3972631F6CBE375955939 /* NetworkStatusObserver.swift */; }; + F685A237C47426370D2AC2956285C3E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */; }; + F6DEE3FA2EF0113730454100EEE86756 /* StoriesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B0B3D3E653D2A72D701E49996EEA999F /* StoriesView.xib */; }; + F83B27F3BA95658EAD242D8EC0FF4C91 /* SlideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3E6EBEB144300AFD9EEAFF9DC8F21FB /* SlideView.swift */; }; + FA0353B57B9E752F966A16FD57B8A8BD /* Resolver-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 54D5A038202ECEB63A8F10CD95FFB6CF /* Resolver-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FA8B5D62D1F65F6083B7FF811EB32EBB /* SearchWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 779EAF20FB715103542C4F0A5127A673 /* SearchWidget.swift */; }; + FF76EE2CCAF3321D9F471F7D3BC05971 /* SessionOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96A616905A289463D65645208FF80D52 /* SessionOperation.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 97FD9F25B8F6CE6ACEDF790C858E79E0 /* PBXContainerItemProxy */ = { + C10FBDC4EB0AA27DE6A01E2E13362ED9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 0C03A6912D025B497528F2C7FFE2F1D5; remoteInfo = REES46; }; + D018467322F8729B4606B26B83D40982 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3AF1A4FE1808CDAE51281F7A31DB2A13; + remoteInfo = Resolver; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromoCodeView.swift; path = REES46/Classes/Button/PromoCodeView.swift; sourceTree = ""; }; - 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionServiceImpl.swift; path = REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift; sourceTree = ""; }; - 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInstaller.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift; sourceTree = ""; }; - 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLSessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift; sourceTree = ""; }; - 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigService.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift; sourceTree = ""; }; - 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkRadioType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift; sourceTree = ""; }; - 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadManager.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift; sourceTree = ""; }; - 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Option.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift; sourceTree = ""; }; - 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesImageLoader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift; sourceTree = ""; }; - 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageData.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift; sourceTree = ""; }; - 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesView.swift; path = REES46/Classes/Stories/StoriesView.swift; sourceTree = ""; }; - 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CartItem.swift; path = REES46/Classes/Model/CartItem.swift; sourceTree = ""; }; - 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadingPlaceholderView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift; sourceTree = ""; }; - 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenericDataTask.swift; path = REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift; sourceTree = ""; }; - 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromocodeBanner.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift; sourceTree = ""; }; - 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryBlockImageCache.swift; path = REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift; sourceTree = ""; }; - 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkDynamicFont.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift; sourceTree = ""; }; - 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetMainView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift; sourceTree = ""; }; - 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockView.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockView.swift; sourceTree = ""; }; - 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFonts.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift; sourceTree = ""; }; - 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift; sourceTree = ""; }; - 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesSlideReloadIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift; sourceTree = ""; }; - 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitResponse.swift; path = REES46/Classes/Model/InitResponse.swift; sourceTree = ""; }; - 240A79C469C0F6595705D16927F498E9 /* REES46-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-prefix.pch"; sourceTree = ""; }; - 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleUIApplication.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift; sourceTree = ""; }; - 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SimplePersonalizationSDK.swift; path = REES46/Classes/SimplePersonalizationSDK.swift; sourceTree = ""; }; - 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Extension.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift"; sourceTree = ""; }; - 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetHistoryButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift; sourceTree = ""; }; - 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift; sourceTree = ""; }; - 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stories.swift; path = REES46/Classes/Model/Stories.swift; sourceTree = ""; }; - 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift; sourceTree = ""; }; - 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift; sourceTree = ""; }; - 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetConstants.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift; sourceTree = ""; }; - 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesView.xib; path = REES46/Classes/Resources/StoriesView.xib; sourceTree = ""; }; - 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift"; sourceTree = ""; }; - 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/SessionQueue.swift; sourceTree = ""; }; - 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift; sourceTree = ""; }; - 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsButton.swift; path = REES46/Classes/Button/ProductsButton.swift; sourceTree = ""; }; - 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesCollectionViewPreviewCell.xib; path = REES46/Classes/Resources/StoriesCollectionViewPreviewCell.xib; sourceTree = ""; }; + 006D7B411807B85526039B562CE8E0CB /* LoadingPlaceholderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadingPlaceholderView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/LoadingPlaceholderView.swift; sourceTree = ""; }; + 00F1318A37D33355F02E93D4E1B8CB40 /* UIImage+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImage+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImage+ImageLoader.swift"; sourceTree = ""; }; + 01C0641FF52A756754B9AA4EE4F92211 /* UserDefaultsExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserDefaultsExtension.swift; path = REES46/Classes/Extensions/UserDefaultsExtension.swift; sourceTree = ""; }; + 054B17CB40AC8BCD412F6153E91F70A3 /* ColorExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ColorExtensions.swift; path = REES46/Classes/Shared/ColorExtensions.swift; sourceTree = ""; }; + 077CBE5668F43E8F4C4798EDE6267D31 /* SettingsManageable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsManageable.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift; sourceTree = ""; }; + 09D3C44076AC345FCC99586417DE8DC7 /* SearchWidgetListView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift; sourceTree = ""; }; + 0E391F42EF4ED1F7DEB808697763EF58 /* ImageLoaderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoaderError.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift; sourceTree = ""; }; + 10D10E02E6B97F97915448E7635D731E /* TrackingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackingService.swift; path = REES46/Classes/ServiceProtocols/TrackingService.swift; sourceTree = ""; }; + 13310336C32A8CB04EA4C1A04715D7CD /* CartItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CartItem.swift; path = REES46/Classes/Model/CartItem.swift; sourceTree = ""; }; + 13A82CEE6333CA39359FD8E3755DABDE /* StoriesView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesView.swift; path = REES46/Classes/Stories/StoriesView.swift; sourceTree = ""; }; + 18EDD70FAE76ABF902F4CC3C555D727B /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 1AA521024584A7CC9019483C5442322B /* SimplePersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SimplePersonalizationSDK.swift; path = REES46/Classes/SimplePersonalizationSDK.swift; sourceTree = ""; }; + 1B20CA568E97CD47D30833E8BBA03609 /* SdkStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyle.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift; sourceTree = ""; }; + 1C24E81606B1463DA08F8DC6443B8F20 /* UIFontDescriptorUsage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIFontDescriptorUsage.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift; sourceTree = ""; }; + 1D95132DF76F9268898A274E66982D7A /* FontFamily.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FontFamily.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift; sourceTree = ""; }; + 1E9078AD1415FA4F07660A3D7A1B3EDC /* SdkStyleCustomFontSizeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift; sourceTree = ""; }; + 203D9E554B6AD0CA2DBCFB6004F80052 /* HashStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HashStorage.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift; sourceTree = ""; }; + 235E7EFDE8A999C308AD6CBB82688526 /* CGImageSource+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGImageSource+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift"; sourceTree = ""; }; + 2383236E062C95D57BCB28C578350F39 /* REES46-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "REES46-Info.plist"; sourceTree = ""; }; + 24F1F2AC006EAEF9AE5F8795547E5E5F /* SdkStyleCustomColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareViewController.swift; sourceTree = ""; }; + 297C3C9558F82D7DB9D196365AB6F11D /* SdkFontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInjector.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift; sourceTree = ""; }; + 2B22455637D3BEC9BA719B5A2D2D413C /* SearchResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchResponse.swift; path = REES46/Classes/Model/SearchResponse.swift; sourceTree = ""; }; + 2C0C4C0E5B71319B016EB862BD53C7AE /* SdkStyleColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift; sourceTree = ""; }; + 2F8E48A3354A21139597AD432F4931D7 /* Stories.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stories.swift; path = REES46/Classes/Model/Stories.swift; sourceTree = ""; }; + 33B5658B1B66558E6E37DEB2A9BE9B82 /* PromoCodeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromoCodeView.swift; path = REES46/Classes/Button/PromoCodeView.swift; sourceTree = ""; }; + 34D9CCEC64C2C07530AF89DEDE667B72 /* PushTokenHandlerImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenHandlerImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift; sourceTree = ""; }; + 361D023E01B21B759CEDD96425B4EB08 /* StoriesCollectionViewPreviewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesCollectionViewPreviewCell.xib; path = REES46/Classes/Resources/StoriesCollectionViewPreviewCell.xib; sourceTree = ""; }; 3671B3C220D01E22000CF41146C2B4AB /* REES46 */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = REES46; path = REES46.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIFont+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift"; sourceTree = ""; }; - 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationService.swift; path = REES46/Classes/NotificationService.swift; sourceTree = ""; }; - 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserver.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift; sourceTree = ""; }; - 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReloadButton.swift; path = REES46/Classes/Button/ReloadButton.swift; sourceTree = ""; }; - 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift; sourceTree = ""; }; + 3A0A74A60559E37121785A69A5E4FD11 /* CarouselCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionView.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift; sourceTree = ""; }; + 3C23B42A733F6F6BB4866A4241F038BA /* SdkQueryBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkQueryBuilder.swift; path = REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift; sourceTree = ""; }; + 3C47CA0088C5709393ED4F4B16086926 /* StoryCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/CollectionViewCell/StoryCollectionViewCell.swift; sourceTree = ""; }; + 3C7F01562FA95F0BA9BC1085172DA4A4 /* NetworkStatusObserverUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserverUI.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift; sourceTree = ""; }; + 3D6E9C937ECED5AE5B1C384A64A611BD /* SessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/SessionQueue.swift; sourceTree = ""; }; + 3F424910F7AC5B74E5E21193BDF86748 /* TrackServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackServiceImpl.swift; path = REES46/Classes/ServicesImplementation/TrackServiceImpl.swift; sourceTree = ""; }; 3FE45031A73056A2CFA8E93BF0A50596 /* Pods-demo-store-ios.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-demo-store-ios.modulemap"; sourceTree = ""; }; - 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkConfiguration.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift; sourceTree = ""; }; + 4095DAB455ABA0730ED73CAD71DCE206 /* TBTextConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBTextConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift; sourceTree = ""; }; + 40C6A5099A6262B396E779D46EA418A2 /* NetworkConnectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift; sourceTree = ""; }; + 423D8F634C8260F7062A982EF97D0116 /* NetworkRadioType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkRadioType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkRadioType.swift; sourceTree = ""; }; + 44B9BB904CF6B5BBB78ADF0327076D60 /* SdkPopupAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkPopupAlertView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift; sourceTree = ""; }; 452AF409E3A7679850A94364FEF83BA4 /* Pods-demo-store-ios-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-Info.plist"; sourceTree = ""; }; - 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBFontConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift; sourceTree = ""; }; - 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidget.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift; sourceTree = ""; }; - 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingService.swift; path = REES46/Classes/ServiceProtocols/NotificationHandlingService.swift; sourceTree = ""; }; - 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disk.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift; sourceTree = ""; }; - 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RView_Extensions.swift; path = REES46/Classes/Stories/WebKit/RView_Extensions.swift; sourceTree = ""; }; - 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoading.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift; sourceTree = ""; }; - 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkImageReloader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift; sourceTree = ""; }; - 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInjector.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkFontInjector.swift; sourceTree = ""; }; - 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackingService.swift; path = REES46/Classes/ServiceProtocols/TrackingService.swift; sourceTree = ""; }; + 458AB880D7CDA00C9A2FCC03D52654BB /* StoriesCollectionViewPreviewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesCollectionViewPreviewCell.swift; path = REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift; sourceTree = ""; }; + 46078399770FC3AB917F74E7FCB7E23C /* Operative.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operative.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift; sourceTree = ""; }; + 4693CC234E1865FEDCCE54DE6432B3F8 /* PushTokenNotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationService.swift; path = REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift; sourceTree = ""; }; + 46EE3A771CC6DB61EB094762BCFDBFC5 /* CGSize+Min.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGSize+Min.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift"; sourceTree = ""; }; + 481A23D002D1C55D2014685BDDC523F8 /* CAPropertyAnimation+Key.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CAPropertyAnimation+Key.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift"; sourceTree = ""; }; + 48A76277ECC8E3229ABE54F2446F79FA /* ManagedViewConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ManagedViewConfig.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift; sourceTree = ""; }; + 4A6979C1E9729725E9B9CA859DAA6793 /* ViewConfigService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigService.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigService.swift; sourceTree = ""; }; + 4BBA380EE62922598664672D457EBC26 /* SearchWidgetModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetModel.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetModel.swift; sourceTree = ""; }; + 4F722C35D2174564A6608F9868B70352 /* SearchWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift; sourceTree = ""; }; + 5032FA3898BA2ED9EA1B442884E3B2B9 /* Coverable+UIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Coverable+UIKit.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift"; sourceTree = ""; }; + 5085525DE8A8C69991BFD428853AE9B4 /* NetworkConnectionStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift; sourceTree = ""; }; 51BADA0045FDF9D08F587320E702DD5D /* Pods-demo-store-ios-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-demo-store-ios-frameworks.sh"; sourceTree = ""; }; - 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIFontDescriptorUsage.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/UIFontDescriptorUsage.swift; sourceTree = ""; }; - 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetViewController.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift; sourceTree = ""; }; - 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TexBlockConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift; sourceTree = ""; }; - 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Coverable+UIKit.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable+UIKit.swift"; sourceTree = ""; }; - 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift; sourceTree = ""; }; - 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBAppearanceConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift; sourceTree = ""; }; - 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationService.swift; path = REES46/Classes/ServiceProtocols/PushTokenNotificationService.swift; sourceTree = ""; }; - 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegisterNotification.swift; path = REES46/Classes/services/notification/events/RegisterNotification.swift; sourceTree = ""; }; - 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetModel.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetModel.swift; sourceTree = ""; }; - 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitService.swift; path = REES46/Classes/Extensions/InitService.swift; sourceTree = ""; }; - 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserDefaultsExtension.swift; path = REES46/Classes/Extensions/UserDefaultsExtension.swift; sourceTree = ""; }; - 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoryCollectionViewCell.xib; path = REES46/Classes/Resources/StoryCollectionViewCell.xib; sourceTree = ""; }; - 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationServiceImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift; sourceTree = ""; }; - 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionOperation.swift; path = REES46/Classes/Extensions/SessionQueue/SessionOperation.swift; sourceTree = ""; }; - 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListView.swift; sourceTree = ""; }; - 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetViewCell.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift; sourceTree = ""; }; - 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+Circle.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift"; sourceTree = ""; }; - 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListViewCell.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift; sourceTree = ""; }; - 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkApperanceViewScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift; sourceTree = ""; }; - 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TrackServiceImpl.swift; path = REES46/Classes/ServicesImplementation/TrackServiceImpl.swift; sourceTree = ""; }; + 5265E0ED6D5761A5F5B4280E5DC9699B /* InitService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitService.swift; path = REES46/Classes/Extensions/InitService.swift; sourceTree = ""; }; + 52C6ABC60834B40A0B382527159B8D6F /* ProductsResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsResponse.swift; path = REES46/Classes/Model/ProductsResponse.swift; sourceTree = ""; }; + 54D5A038202ECEB63A8F10CD95FFB6CF /* Resolver-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Resolver-umbrella.h"; sourceTree = ""; }; + 55AABAF07513678958C82D21574EE6AD /* URLSessionQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLSessionQueue.swift; path = REES46/Classes/Extensions/SessionQueue/URLSessionQueue.swift; sourceTree = ""; }; + 55C639AE46E1BC87F79DD6293883B14C /* REES46-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-umbrella.h"; sourceTree = ""; }; + 585EE06F85888A8317F9D59985AF7E2F /* SearchWidgetCategoriesButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetCategoriesButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift; sourceTree = ""; }; + 58D9FD5722E2959987EDFA03D7C2168C /* Data+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift"; sourceTree = ""; }; + 5932B7FDF86C8603E0905796916151B5 /* SdkStyleColorSchemeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareViewController.swift; sourceTree = ""; }; + 5B584A1A3FF2C836FDBD2BD8608EDFBB /* UIColor+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Extension.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIColor+Extension.swift"; sourceTree = ""; }; + 5E9E0A950C86ED416AD34D690C324EDF /* Resolver-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Resolver-Info.plist"; sourceTree = ""; }; + 5EB28A541896C734C8E7BCF5E533C9E5 /* GenericDataTask.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GenericDataTask.swift; path = REES46/Classes/Extensions/SessionQueue/GenericDataTask.swift; sourceTree = ""; }; + 610813B0C4C62F01CBB9C8480F4CF5EB /* UISdkWrapLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UISdkWrapLabel.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift; sourceTree = ""; }; + 65B47826D26A6C0943D0924CE38F02D5 /* UIFont+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIFont+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UIFont+FontInjector.swift"; sourceTree = ""; }; + 65EE316BAA24A8C3B9088F4FD92ACA81 /* StoriesSlideReloadIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesSlideReloadIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/StoriesSlideReloadIndicator.swift; sourceTree = ""; }; + 666329C5E849E30DC1538CD2F4C4AEA6 /* SearchWidgetObjectification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetObjectification.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetObjectification.swift; sourceTree = ""; }; + 6ACE401F6461E22F93B8228E0DA53C49 /* Coverable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Coverable.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift; sourceTree = ""; }; + 6C4CF9A9F6C229713C39AB29E51469FD /* Assets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = REES46/Classes/Resources/Assets.xcassets; sourceTree = ""; }; + 6CFCB47107356A4063304CE05D2268D4 /* RegisterNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RegisterNotification.swift; path = REES46/Classes/services/notification/events/RegisterNotification.swift; sourceTree = ""; }; + 6E88F2967F4B278025EAE135642570B2 /* SdkStyleCustomFonts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFonts.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFonts.swift; sourceTree = ""; }; 7116768E9395945F655A57DAECC1A933 /* Pods-demo-store-ios-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-demo-store-ios-umbrella.h"; sourceTree = ""; }; 711CCF8AFA98AC5676B42688D664CA30 /* Pods-demo-store-ios-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-demo-store-ios-acknowledgements.markdown"; sourceTree = ""; }; - 73010CC983E3809BECEE5348DA1BB8C6 /* 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; }; - 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorScheme.swift; sourceTree = ""; }; - 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingServiceImpl.swift; path = REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift; sourceTree = ""; }; - 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/Data+ImageLoader.swift"; sourceTree = ""; }; - 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryViewController.swift; path = REES46/Classes/Stories/StoryViewController/StoryViewController.swift; sourceTree = ""; }; - 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkGlobalHelper.swift; path = REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift; sourceTree = ""; }; - 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionType.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionType.swift; sourceTree = ""; }; - 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockConstants.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift; sourceTree = ""; }; - 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselConstants.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift; sourceTree = ""; }; - 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController.swift; path = REES46/Classes/Stories/WebKit/RWebViewController.swift; sourceTree = ""; }; - 7EED3A4B574EFEBB9FC4A320FC64352D /* REES46.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = REES46.modulemap; sourceTree = ""; }; - 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigPlain.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift; sourceTree = ""; }; - 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operative.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Operative.swift; sourceTree = ""; }; - 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Navigation.swift; path = REES46/Classes/Extensions/NetworkStatus/Navigation.swift; sourceTree = ""; }; - 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SettingsManageable.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/SettingsManageable.swift; sourceTree = ""; }; - 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchResponse.swift; path = REES46/Classes/Model/SearchResponse.swift; sourceTree = ""; }; - 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift; sourceTree = ""; }; - 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-umbrella.h"; sourceTree = ""; }; - 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoaderError.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/ErrorHandler/ImageLoaderError.swift; sourceTree = ""; }; - 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryButton.swift; path = REES46/Classes/Button/StoryButton.swift; sourceTree = ""; }; - 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserSettings.swift; path = REES46/Classes/Model/UserSettings.swift; sourceTree = ""; }; + 71B1F390E7E63CA54A496BE30C7B6CA8 /* ViewConfigPlain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewConfigPlain.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ViewConfigPlain.swift; sourceTree = ""; }; + 7284C1E32418C7CEE227F581217DE057 /* RawRepresentable+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RawRepresentable+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift"; sourceTree = ""; }; + 729005440B6F90C18F2BC4B11DD14101 /* ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoader.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift; sourceTree = ""; }; + 741DF3B01243992B457F398A443CB65F /* REES46.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = REES46.modulemap; sourceTree = ""; }; + 750C69D3CD3838F61CDE14D97051E8B6 /* SdkConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkConfiguration.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkConfiguration.swift; sourceTree = ""; }; + 75818132ED88314125153A5590C1C638 /* SearchWidgetMainView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetMainView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetMainView.swift; sourceTree = ""; }; + 7626FE59EA0083471ED7BFB8A0503CF4 /* ProductsButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsButton.swift; path = REES46/Classes/Button/ProductsButton.swift; sourceTree = ""; }; + 7632B3306B5915098424C9B8633E6409 /* SearchWidgetViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetViewController.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetViewController.swift; sourceTree = ""; }; + 779EAF20FB715103542C4F0A5127A673 /* SearchWidget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidget.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidget.swift; sourceTree = ""; }; + 784696C6E9D46787527E68C77D0CF74F /* REES46-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "REES46-prefix.pch"; sourceTree = ""; }; + 788E8B696A5D042855C2F1BD95FE3D88 /* Assets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Assets.swift; path = REES46/Classes/Resources/Assets.swift; sourceTree = ""; }; + 78ABF3748640C16CEB3504FA2B351429 /* VideoDownloadObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadObject.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift; sourceTree = ""; }; + 7A8C039EBEB866D5730C34738B14B811 /* Resolver.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Resolver.modulemap; sourceTree = ""; }; + 7B4343F4078E421795EF8A8E289D6E20 /* StoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryButton.swift; path = REES46/Classes/Button/StoryButton.swift; sourceTree = ""; }; + 7F18713C7B90D58145E7FFA613B147D3 /* SdkDynamicFont.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkDynamicFont.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/SdkDynamicFont.swift; sourceTree = ""; }; + 824FAD4991B5DFA639F7D00E9EFD9268 /* PersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PersonalizationSDK.swift; path = REES46/Classes/PersonalizationSDK.swift; sourceTree = ""; }; + 840E523C4B2C0ABD030537548D229D18 /* PushTokenNotificationServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenNotificationServiceImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenNotificationServiceImpl.swift; sourceTree = ""; }; + 8477201876AE4346F4EDA080A8DC1D3A /* SdkGlobalHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkGlobalHelper.swift; path = REES46/Classes/Extensions/NetworkStatus/SdkGlobalHelper.swift; sourceTree = ""; }; + 848F6F5834CC4EB7D287A93F2075CA21 /* Navigation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Navigation.swift; path = REES46/Classes/Extensions/NetworkStatus/Navigation.swift; sourceTree = ""; }; + 865C853D75F1A51216F70B876C0470D1 /* SearchWidgetExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetExtension.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift; sourceTree = ""; }; + 880874F7A9A6F10E605C0BAF6C79CFFE /* UIBezierPath+Circle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+Circle.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/UIBezierPath+Circle.swift"; sourceTree = ""; }; + 8991FCA1A1E59768D8582E07C984323C /* NotificationService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationService.swift; path = REES46/Classes/NotificationService.swift; sourceTree = ""; }; + 89D4E1D8FBF0797712533614C8F902DA /* Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Loader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift; sourceTree = ""; }; + 89E68D512B837CC27D1E1500044C943B /* CGRect+Center.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Center.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift"; sourceTree = ""; }; + 8ACEF2B1DC223BE38F9E7277335D705A /* REES46.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.debug.xcconfig; sourceTree = ""; }; + 8CCFDA412E7BB6719DDA050BB5C81B5F /* SdkStyleCustomColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift; sourceTree = ""; }; + 8D2FC20A497D2FCAF4A23E06B31D5835 /* VideoFileUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoFileUtils.swift; path = REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift; sourceTree = ""; }; + 8FD8AB80480E2F8896B1C91034AF5DCA /* URLLiteralConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLLiteralConvertible.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift; sourceTree = ""; }; + 92B341830C9437DEEE37BE76520D6B60 /* SubscriptionServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionServiceImpl.swift; path = REES46/Classes/ServicesImplementation/SubscriptionServiceImpl.swift; sourceTree = ""; }; + 95D224BC8ADE78CF3A02C45A0B5A2734 /* SlideViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideViewController.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift; sourceTree = ""; }; + 9684A1A62561C84568992C79EAAF2B97 /* NotificationHandlingServiceImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingServiceImpl.swift; path = REES46/Classes/ServicesImplementation/NotificationHandlingServiceImpl.swift; sourceTree = ""; }; + 9692A7772995ACB6EB1DF6916C8D138B /* SearchWidgetHistoryButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetHistoryButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetHistoryButton.swift; sourceTree = ""; }; + 96A616905A289463D65645208FF80D52 /* SessionOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionOperation.swift; path = REES46/Classes/Extensions/SessionQueue/SessionOperation.swift; sourceTree = ""; }; + 98CFAA09A4D847B30FFD98C847B0D344 /* PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PromocodeBanner.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/PromocodeBanner.swift; sourceTree = ""; }; + 98E893B8E2FBCE442EEE0B88DF2E3DCE /* Option.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Option.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Option.swift; sourceTree = ""; }; + 98EAB524494C408BA9511B525A89DBD4 /* VideoDownloadManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadManager.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadManager.swift; sourceTree = ""; }; + 9ACA082EA9115579E4B9D6D2C1640C19 /* UIBezierPath+ImagePlaceholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+ImagePlaceholder.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift"; 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; }; - 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBTextConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBTextConfiguration.swift; sourceTree = ""; }; - 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ProductsResponse.swift; path = REES46/Classes/Model/ProductsResponse.swift; sourceTree = ""; }; A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-demo-store-ios"; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideViewController.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideViewController.swift; sourceTree = ""; }; - A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareViewController.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareViewController.swift; sourceTree = ""; }; - A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoFileUtils.swift; path = REES46/Classes/Extensions/DownloadManager/VideoFileUtils.swift; sourceTree = ""; }; + A223CBDBC801475ED6E139948FC6B7A3 /* RWebViewController_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController_Extensions.swift; path = REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift; sourceTree = ""; }; + A22870D437334BC692BDBC57357A7F1B /* RecommendResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendResponse.swift; path = REES46/Classes/Model/RecommendResponse.swift; sourceTree = ""; }; A3BC4DCD1D930788E65681442B043C28 /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; - A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.release.xcconfig; sourceTree = ""; }; - A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGImageSource+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/CGImageSource+ImageLoader.swift"; sourceTree = ""; }; - A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CAPropertyAnimation+Key.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CAPropertyAnimation+Key.swift"; sourceTree = ""; }; - A791B748A86BE064FA80C12134F8E728 /* Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Loader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Loader.swift; sourceTree = ""; }; - A9C82152B76290FC32122F96E2333F17 /* Assets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Assets.swift; path = REES46/Classes/Resources/Assets.swift; sourceTree = ""; }; - AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendResponse.swift; path = REES46/Classes/Model/RecommendResponse.swift; sourceTree = ""; }; - ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyle.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyle.swift; sourceTree = ""; }; - B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBezierPath+ImagePlaceholder.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/UIBezierPath+ImagePlaceholder.swift"; sourceTree = ""; }; - B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetExtension.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetExtension.swift; sourceTree = ""; }; - B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+PromocodeBanner.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift"; sourceTree = ""; }; - BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PushTokenHandlerImpl.swift; path = REES46/Classes/ServicesImplementation/PushTokenHandlerImpl.swift; sourceTree = ""; }; + A8647FBFD38262B812B6185CF909E309 /* ImageData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageData.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Entities/ImageData.swift; sourceTree = ""; }; + A9584CF1FF6858C640CEFC52E1C9A1E1 /* SdkApperanceViewScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkApperanceViewScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkApperanceViewScheme.swift; sourceTree = ""; }; + A969F7AFAFBA00C79A3E2EB73AA50818 /* Resolver-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Resolver-prefix.pch"; sourceTree = ""; }; + AA72AB305058A22216BCD20A7AD492E9 /* RequestOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestOperation.swift; path = REES46/Classes/Extensions/SessionQueue/RequestOperation.swift; sourceTree = ""; }; + AAAC26210F1BA43CE46EF96714104515 /* ReloadButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReloadButton.swift; path = REES46/Classes/Button/ReloadButton.swift; sourceTree = ""; }; + B0B3D3E653D2A72D701E49996EEA999F /* StoriesView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoriesView.xib; path = REES46/Classes/Resources/StoriesView.xib; sourceTree = ""; }; + B148A2F3434DE09C6CD1C048DF5AD76D /* StoryViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryViewController.swift; path = REES46/Classes/Stories/StoryViewController/StoryViewController.swift; sourceTree = ""; }; + B24DF76F79FD76D5D61A7A80DB32A8AE /* RecommendationsWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetView.swift; sourceTree = ""; }; + B456C7FD17C572F1FC7AAD91D989AB93 /* TextBlockView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockView.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockView.swift; sourceTree = ""; }; + B682BBBFC00215B0C80DE423C57F5D4C /* SearchWidgetDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetDelegate.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift; sourceTree = ""; }; + B812D966FF5B03C7DCA2C719BACD59C2 /* RecommendationsStarsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsStarsView.swift; path = REES46/Classes/Extensions/SdkConfiguration/RecommendationsStars/RecommendationsStarsView.swift; sourceTree = ""; }; + BA81663108B5583310BD404FF2068A13 /* Resolver.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Resolver.release.xcconfig; sourceTree = ""; }; + BC2A107C1BE421B18F06D150867D8A8C /* SdkStyleUIApplication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleUIApplication.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkStyleUIApplication.swift; sourceTree = ""; }; + BCFDEBEA464E5DCC274F85FFB32E784F /* TexBlockConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TexBlockConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TexBlockConfiguration.swift; sourceTree = ""; }; + C09A82C94094F8681AFB97A5A0C2A90A /* CarouselConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselConstants.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselConstants.swift; sourceTree = ""; }; + C22CFCA4407D228B3178E238BCF78AEA /* SubscriptionService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionService.swift; path = REES46/Classes/ServiceProtocols/SubscriptionService.swift; sourceTree = ""; }; C2CFBF87EB78E30CC4A10E9641F99C7E /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; - C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionService.swift; path = REES46/Classes/ServiceProtocols/SubscriptionService.swift; sourceTree = ""; }; - C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.debug.xcconfig; sourceTree = ""; }; - CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorSchemeAwareView.swift; sourceTree = ""; }; - CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserverUI.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserverUI.swift; sourceTree = ""; }; - CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideView.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift; sourceTree = ""; }; - CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController_Extensions.swift; path = REES46/Classes/Stories/WebKit/RWebViewController_Extensions.swift; sourceTree = ""; }; - D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetCategoriesButton.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetCategoriesButton.swift; sourceTree = ""; }; - D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsStarsView.swift; path = REES46/Classes/Extensions/SdkConfiguration/RecommendationsStars/RecommendationsStarsView.swift; sourceTree = ""; }; - D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HashStorage.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/HashStorage.swift; sourceTree = ""; }; - D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTaskProtocol.swift; path = REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift; sourceTree = ""; }; + C57EF1C44205594F6B4D9A055E7F2297 /* InitResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InitResponse.swift; path = REES46/Classes/Model/InitResponse.swift; sourceTree = ""; }; + C8153C3C08485CF12D98C18A9D83052E /* CarouselCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionViewCell.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionViewCell.swift; sourceTree = ""; }; + C88EC488C3002448B39D74FA63F181B1 /* UIImageView+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift"; sourceTree = ""; }; + C8BDE782C1EEB93A01F6C9CC377A66E7 /* UIViewController+PromocodeBanner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+PromocodeBanner.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/UIViewController+PromocodeBanner.swift"; sourceTree = ""; }; + C91138E3AA2D7155B7A83868FEA30C59 /* Disk.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disk.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/Disk.swift; sourceTree = ""; }; + CE9112ABE7E60C0ECAF394EFBE817AA8 /* RecommendationsWidgetConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetConstants.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetConstants.swift; sourceTree = ""; }; + D245E0514AAC1A2B9A6D5EA2F383E90F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + D39FC3F00BA45A55026CA72872B3A16C /* NetworkStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/NetworkStatus.swift; sourceTree = ""; }; + D4DF9B812473B1B6CC3FE24667CF2C1B /* NotificationHandlingService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotificationHandlingService.swift; path = REES46/Classes/ServiceProtocols/NotificationHandlingService.swift; sourceTree = ""; }; + D4EA0E3F27697657A9D80F2AC00109BE /* ImageLoading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoading.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/UseCases/ImageLoading.swift; sourceTree = ""; }; + D597A807E445BAE72152BCE34621BBA9 /* REES46-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "REES46-dummy.m"; sourceTree = ""; }; + D6A62E0EE0F2BE6B027E958A2E513212 /* SearchWidgetTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetTextField.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift; sourceTree = ""; }; + D74BD63FE889F2093A5AD763144E9BB1 /* StoryCollectionViewCell.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = StoryCollectionViewCell.xib; path = REES46/Classes/Resources/StoryCollectionViewCell.xib; sourceTree = ""; }; + D754AE66A3217DCE8F7AF28EDAABC5E3 /* RWebViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RWebViewController.swift; path = REES46/Classes/Stories/WebKit/RWebViewController.swift; sourceTree = ""; }; D7C080260E1CE9F3014EAC5192925E48 /* Pods-demo-store-ios-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-demo-store-ios-acknowledgements.plist"; sourceTree = ""; }; - D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetObjectification.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetObjectification.swift; sourceTree = ""; }; - DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoader.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Data/ImageLoader.swift; sourceTree = ""; }; - DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = REES46/Classes/Resources/Assets.xcassets; sourceTree = ""; }; - DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkActivityIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift; sourceTree = ""; }; - DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetDelegate.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetDelegate.swift; sourceTree = ""; }; - DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift; sourceTree = ""; }; - DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "REES46-dummy.m"; sourceTree = ""; }; - E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+ImageLoader.swift"; path = "REES46/Classes/Extensions/StoriesImageLoader/Extension/UIImageView+ImageLoader.swift"; sourceTree = ""; }; - E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CarouselCollectionView.swift; path = REES46/Classes/Stories/StoryViewController/ProductsCarousel/CarouselCollectionView.swift; sourceTree = ""; }; - E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkQueryBuilder.swift; path = REES46/Classes/Extensions/SessionQueue/SdkQueryBuilder.swift; sourceTree = ""; }; - E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ColorExtensions.swift; path = REES46/Classes/Shared/ColorExtensions.swift; sourceTree = ""; }; - EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Center.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGRect+Center.swift"; sourceTree = ""; }; - EFE1038B30DAB86B0B88A1A3AAC6E034 /* REES46-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "REES46-Info.plist"; sourceTree = ""; }; - F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkPopupAlertView.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeBanner/SdkPopupAlertView.swift; sourceTree = ""; }; + DC7EE8FFAF1DDB6B8FFA9F48F1460182 /* TBAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBAppearanceConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBAppearanceConfiguration.swift; sourceTree = ""; }; + DD0D81D0C7B3972631F6CBE375955939 /* NetworkStatusObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkStatusObserver.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionObservers/NetworkStatusObserver.swift; sourceTree = ""; }; + DDD2EC39AD926EB8646A3ECEFAD8E840 /* TextBlockConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextBlockConstants.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConstants.swift; sourceTree = ""; }; + DDFD6E1EE7FB75CC6E6CEB7213F706BD /* Resolver */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Resolver; path = Resolver.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E23541FDD4FB76F8FB6280CE37DF1568 /* SdkImageReloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkImageReloader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/SdkImageReloader.swift; sourceTree = ""; }; + E295F756F15A55CD0A91E066EA45839E /* Resolver.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Resolver.debug.xcconfig; sourceTree = ""; }; + E3E6EBEB144300AFD9EEAFF9DC8F21FB /* SlideView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SlideView.swift; path = REES46/Classes/Stories/ConnectionAwareLoader/Views/SlideView.swift; sourceTree = ""; }; + E44AA690C57E372E9DDD34A99BAC5094 /* StoriesImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesImageLoader.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/StoriesImageLoader.swift; sourceTree = ""; }; + E4E8346FCEDF183F25A4AF1D2230C94C /* SearchWidgetListViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetListViewCell.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetListViewCell.swift; sourceTree = ""; }; + E6C84529591749DD80921D933282C8C4 /* RecommendationsWidgetViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecommendationsWidgetViewCell.swift; path = REES46/Classes/Stories/StoryViewController/RecommendationsWidget/RecommendationsWidgetViewCell.swift; sourceTree = ""; }; + E8F5186C4000554C5C2D93E9E9359B2A /* SdkStyleCustomColorScheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomColorScheme.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleCustomColorScheme.swift; sourceTree = ""; }; + E9E5FC66C1AA0C0EA7D4ADAE5A86695B /* StoryBlockImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryBlockImageCache.swift; path = REES46/Classes/Extensions/StoriesImageLoader/StoryBlockImageCache.swift; sourceTree = ""; }; + EA9154452194A6C2DE91102D74AB5658 /* Resolver-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Resolver-dummy.m"; sourceTree = ""; }; + EAB6F611E86A4758835A715E4B4184F6 /* 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; }; + EC94FDD099EC6DF033BE719FCA851769 /* SessionDataTaskProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDataTaskProtocol.swift; path = REES46/Classes/Extensions/SessionQueue/SessionDataTaskProtocol.swift; sourceTree = ""; }; + ED36F152560F5D592DB5CA8EB35FC8FB /* UserSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UserSettings.swift; path = REES46/Classes/Model/UserSettings.swift; sourceTree = ""; }; + EE6CC60601982077C5DFD420CF21FF26 /* SdkStyleCustomFontSizeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleCustomFontSizeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleFonts/SdkStyleCustomFontSizeAwareView.swift; sourceTree = ""; }; F0D4FB2CBD68E89DAE39DADAE996D715 /* Pods-demo-store-ios-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-demo-store-ios-dummy.m"; sourceTree = ""; }; - F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UISdkWrapLabel.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/UISdkWrapLabel.swift; sourceTree = ""; }; - F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetTextField.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetTextField.swift; sourceTree = ""; }; - F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VideoDownloadObject.swift; path = REES46/Classes/Extensions/DownloadManager/VideoDownloadObject.swift; sourceTree = ""; }; - F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PersonalizationSDK.swift; path = REES46/Classes/PersonalizationSDK.swift; sourceTree = ""; }; - F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLLiteralConvertible.swift; path = REES46/Classes/Extensions/StoriesImageLoader/Core/URLLiteralConvertible.swift; sourceTree = ""; }; - F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestOperation.swift; path = REES46/Classes/Extensions/SessionQueue/RequestOperation.swift; sourceTree = ""; }; - F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoriesCollectionViewPreviewCell.swift; path = REES46/Classes/Stories/CollectionCell/StoriesCollectionViewPreviewCell.swift; sourceTree = ""; }; - F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGSize+Min.swift"; path = "REES46/Classes/Extensions/StoriesPreload/PreloadIndicatorProperties/CGSize+Min.swift"; sourceTree = ""; }; - F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RawRepresentable+FontInjector.swift"; path = "REES46/Classes/Extensions/SdkConfiguration/SdkFontInjector/RawRepresentable+FontInjector.swift"; sourceTree = ""; }; - FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SearchWidgetView.swift; path = REES46/Classes/Stories/StoryViewController/SearchWidget/SearchWidgetView.swift; sourceTree = ""; }; - FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FontFamily.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/FontFamily.swift; sourceTree = ""; }; - FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Coverable.swift; path = REES46/Classes/Extensions/SdkConfiguration/PromocodeImagePlaceholder/Coverable.swift; sourceTree = ""; }; - FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkConnectionStatus.swift; path = REES46/Classes/Extensions/NetworkStatus/ConnectionProperties/NetworkConnectionStatus.swift; sourceTree = ""; }; - FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ManagedViewConfig.swift; path = REES46/Classes/Extensions/SdkConfiguration/ManagedViewConfig/ManagedViewConfig.swift; sourceTree = ""; }; + F24C8CFEBEB1CA4BF17447369C29408C /* RView_Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RView_Extensions.swift; path = REES46/Classes/Stories/WebKit/RView_Extensions.swift; sourceTree = ""; }; + F2E66DE87E112723CBB3BCB2AA8D35C5 /* REES46.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = REES46.release.xcconfig; sourceTree = ""; }; + F70619829B9D3A4C395F8ED2FE43DD88 /* Resolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Resolver.swift; path = Sources/Resolver/Resolver.swift; sourceTree = ""; }; + FB3CC78EC1E059D7BFBF1797D4796EF8 /* SdkFontInstaller.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkFontInstaller.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleAdditional/SdkFontInstaller.swift; sourceTree = ""; }; + FDD1814B0CEA7FABAE5AABBEB187D022 /* SdkStyleColorSchemeAwareView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkStyleColorSchemeAwareView.swift; path = REES46/Classes/Extensions/SdkConfiguration/SdkStyle/SdkStyleColorScheme/SdkStyleColorSchemeAwareView.swift; sourceTree = ""; }; + FF7553DBDD8E9FD91ADA9D50BFA07B0C /* TBFontConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TBFontConfiguration.swift; path = REES46/Classes/Stories/TextBlockView/TextBlockConfiguration/TBSubConfigurations/TBFontConfiguration.swift; sourceTree = ""; }; + FFACCDCF6BC71A771C72075C5050C68F /* SdkActivityIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SdkActivityIndicator.swift; path = REES46/Classes/Extensions/StoriesPreload/SdkActivityIndicator.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 0F5AD16E4861F5A40FD3476C13069579 /* Frameworks */ = { + 36A9DB085C67755D2E9AA97FC45927BA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3726922467DD0501527002C0C31278E4 /* Foundation.framework in Frameworks */, + 4F8482D5E03619D0BF470585CC65A21E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -347,182 +371,57 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9BC2B94B990845DD960C90D01A71D386 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3961DF7C4269161ED6BD0023F76BCA4F /* Foundation.framework in Frameworks */, + EA14653F4A93DDC4CBAE110557C64BD8 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 05C54A4D55BA128EDFC7C91451A8BB11 /* Pods */ = { + 11D79D0B6479B814E8F67AEF8AAC27B9 /* Support Files */ = { isa = PBXGroup; children = ( - 2C90CD89B61815D5FE9D0AE6A9D21A2F /* REES46 */, + 741DF3B01243992B457F398A443CB65F /* REES46.modulemap */, + D597A807E445BAE72152BCE34621BBA9 /* REES46-dummy.m */, + 2383236E062C95D57BCB28C578350F39 /* REES46-Info.plist */, + 784696C6E9D46787527E68C77D0CF74F /* REES46-prefix.pch */, + 55C639AE46E1BC87F79DD6293883B14C /* REES46-umbrella.h */, + 8ACEF2B1DC223BE38F9E7277335D705A /* REES46.debug.xcconfig */, + F2E66DE87E112723CBB3BCB2AA8D35C5 /* REES46.release.xcconfig */, ); - name = Pods; + name = "Support Files"; + path = "../Target Support Files/REES46"; sourceTree = ""; }; - 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */ = { + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { isa = PBXGroup; children = ( - DB7DEFAE20464DA840E45872F676E308 /* Assets.xcassets */, - 35609A8FA7E964A5D23682D440C82090 /* StoriesCollectionViewPreviewCell.xib */, - 2F849A64B40D4C29E98160AB504614F5 /* StoriesView.xib */, - 5F2F897983ED21241C7AE2AE2D2C9CE6 /* StoryCollectionViewCell.xib */, + 59DA5C1F72E1D5BABC43EACBA672C3BA /* iOS */, ); - name = Resources; + name = Frameworks; sourceTree = ""; }; - 2C90CD89B61815D5FE9D0AE6A9D21A2F /* REES46 */ = { + 1EDB74872C951A47836419A3A8CF1CF3 /* Products */ = { isa = PBXGroup; children = ( - A9C82152B76290FC32122F96E2333F17 /* Assets.swift */, - A650E056861D012BE0204EF65E60D9A6 /* CAPropertyAnimation+Key.swift */, - E6BF90B0EB3E7460C782E22D345FDCA4 /* CarouselCollectionView.swift */, - 3DAEC0D553BF85D5D1BC2E59D323074E /* CarouselCollectionViewCell.swift */, - 7DC68154C6924066EC0B01DCC7604640 /* CarouselConstants.swift */, - 12FD82770DF6E9B2F35028E6DF34F82D /* CartItem.swift */, - A64604DF52FA6D3CF9691FEFEA02B68B /* CGImageSource+ImageLoader.swift */, - EA46D4C88FD8E926720B41C3E5C213D9 /* CGRect+Center.swift */, - F805CF59318C36F19C735ED9D528908E /* CGSize+Min.swift */, - E8F2816A518714E2DA381C79575FE6CF /* ColorExtensions.swift */, - FE1ADD48D6D155127002F0CC1DB25DAF /* Coverable.swift */, - 593EEE6516B3CE9BA0DA268F8B545F54 /* Coverable+UIKit.swift */, - 7A700B66B9559B5D6C21844D6C29C10A /* Data+ImageLoader.swift */, - 4B7BB29B6B5D386637DB22D8CEBDC4C5 /* Disk.swift */, - FD663461BBD74C194AA1DB7FA355848A /* FontFamily.swift */, - 1453A1AF681A98C019BEA5FCDFAD225F /* GenericDataTask.swift */, - D34C31FD3B5A078F4696688EBB08772E /* HashStorage.swift */, - 10038B6C8E86E49311AC126210363D8E /* ImageData.swift */, - DA69C5CF85605C647B847521F816E492 /* ImageLoader.swift */, - 929592F4E0DD8EDFF56FD4F4A323F1AD /* ImageLoaderError.swift */, - 4ECFC0E45F7DC18B0B06DFF29D0B07F5 /* ImageLoading.swift */, - 232AE8F184E138881B9478365CE63AF0 /* InitResponse.swift */, - 5E49405ACB6C0D911FD9BB23FAD8217D /* InitService.swift */, - A791B748A86BE064FA80C12134F8E728 /* Loader.swift */, - 132B109D53E4CA2E783E64F577A61C52 /* LoadingPlaceholderView.swift */, - FF8A5199E6095616D1BA749D76F3D712 /* ManagedViewConfig.swift */, - 85CAF61BFE1312A019215E0C04CCA4B1 /* Navigation.swift */, - FF5BDC585AA564C8A5F344B22E0D4109 /* NetworkConnectionStatus.swift */, - 7B943277C37DFFB26F13C4A36BCF9F45 /* NetworkConnectionType.swift */, - 0AAC7DB756BF98A43BEEFB3F4B4AE68B /* NetworkRadioType.swift */, - 2EB8AF5EDD8EFCF0731F9978ACCD43C2 /* NetworkStatus.swift */, - 39910DCCDF2C3E2C95E2B200AD84C1B7 /* NetworkStatusObserver.swift */, - CD6D0C3FDEB0CE8C5EEBE9757C3D57CA /* NetworkStatusObserverUI.swift */, - 4AC71F3A8B10AEBB856264192F8FFF91 /* NotificationHandlingService.swift */, - 78CA576F18F8E797C174049A22F97873 /* NotificationHandlingServiceImpl.swift */, - 39782EC9FA117518E3163AF60F3979DF /* NotificationService.swift */, - 81B27940B558B9A5C5B9A26D8F5D71C7 /* Operative.swift */, - 0E4EF25EE8E0F70FCC378F2F82C245CB /* Option.swift */, - F481D8BC3CB92F13E60B5C188DAC74DB /* PersonalizationSDK.swift */, - 32D75B1884A9DF2243EBA259E9EF0D7B /* ProductsButton.swift */, - 9F50E1B9C0A9D57F179E837662BBED9B /* ProductsResponse.swift */, - 1641456DE1EDCA71EF5685914BECD4EB /* PromocodeBanner.swift */, - 008AF6D8858428F144849C8F3F55E10B /* PromoCodeView.swift */, - BA2CB78E522A7E5E2AAD295CA5E2D7A6 /* PushTokenHandlerImpl.swift */, - 5AD95384B756E52A9531C08E45239CF5 /* PushTokenNotificationService.swift */, - 5F89092B5C987A7DBE80912AFDC1E9D7 /* PushTokenNotificationServiceImpl.swift */, - F91A01CEDB58ACAAED84CBEFBF7AC029 /* RawRepresentable+FontInjector.swift */, - D056D2F9CFC67AC01740CFDD5FAB5D70 /* RecommendationsStarsView.swift */, - 2F622F32F33BCEDD61FEF33FD17E9F8C /* RecommendationsWidgetConstants.swift */, - 227F241F6C20A8C39D164D9258837FDB /* RecommendationsWidgetView.swift */, - 6DC8ACC24FD32630394577ED4CE582B9 /* RecommendationsWidgetViewCell.swift */, - AA58879F4BD8F0CCB0F84C72AEC8EF27 /* RecommendResponse.swift */, - 5B17F107DE663C1B5A866B9889AC7231 /* RegisterNotification.swift */, - 3AC21646BEFC70E6CC5F794CC63DE2F8 /* ReloadButton.swift */, - F60CCFA65540D5D1D1C23CC2CCC9A165 /* RequestOperation.swift */, - 4BE9DD354FA99A49B31157A5E1C29DD1 /* RView_Extensions.swift */, - 7E17CF08463E9C17451E8562608E2975 /* RWebViewController.swift */, - CF774B98D83667B77C56654047E9E1CA /* RWebViewController_Extensions.swift */, - DE8424145098403FFBDF9BAE9C1A509B /* SdkActivityIndicator.swift */, - 70B397725B61C01B3D47F2CAEBB77844 /* SdkApperanceViewScheme.swift */, - 42F66A210E5FAEAEE5054C121DA8ADDD /* SdkConfiguration.swift */, - 1B362683E21B73C2C1DC04F2424497E3 /* SdkDynamicFont.swift */, - 4FED5FC8DC217E20CBE71402025B71CD /* SdkFontInjector.swift */, - 02FA9868377FFE8DE66BF7E4B0D0A46E /* SdkFontInstaller.swift */, - 7B922F2FA17DDC3438CB1E9CD1ED3A7F /* SdkGlobalHelper.swift */, - 4FAC92C4FBA201650881A659D7E3D2B6 /* SdkImageReloader.swift */, - F01F4D28D743A94383DF8E29301CA71F /* SdkPopupAlertView.swift */, - E87392696B73A29B90B6343AD56A1588 /* SdkQueryBuilder.swift */, - ABD8CFE8E0D3AC04B0A54BE54BA78765 /* SdkStyle.swift */, - 7373C5B9DD8DB6AA596037F22930F092 /* SdkStyleColorScheme.swift */, - 91334276FD9FC14F48FB436E3B815774 /* SdkStyleColorSchemeAwareView.swift */, - 2F3EEC422B929CB986C526B538CB4DC6 /* SdkStyleColorSchemeAwareViewController.swift */, - DF121C41AFCE19B3B86CD8E00C931371 /* SdkStyleCustomColorScheme.swift */, - CA9398ACE480ED67409937328F94C3CC /* SdkStyleCustomColorSchemeAwareView.swift */, - 32A4FF4C8B21F477EE8A6F619879C5F5 /* SdkStyleCustomColorSchemeAwareViewController.swift */, - 20D2C4CE8ACE68B8D380BD958D3B3F49 /* SdkStyleCustomFonts.swift */, - 59C5616551DD6F790401D767BB096CE2 /* SdkStyleCustomFontSizeAwareView.swift */, - A1BFAEB3FCB6D5EDD1E6D063A5DC4E1B /* SdkStyleCustomFontSizeAwareViewController.swift */, - 2706CEE8F34998F7A34A286D2B6A4072 /* SdkStyleUIApplication.swift */, - 8F7D6472295E9153801482E89B403E7D /* SearchResponse.swift */, - 49E43AA0BA84AC54E8E42E8C97D8D917 /* SearchWidget.swift */, - D00D84A75E35A5B0B79C28F9B5A48E60 /* SearchWidgetCategoriesButton.swift */, - DEF75FF16AE65E5C372D8CA0EED3605F /* SearchWidgetDelegate.swift */, - B508FB1831FC9A8E54C7F3B665F4D8E3 /* SearchWidgetExtension.swift */, - 2C942C336898F66A958E7E2C1F181FF1 /* SearchWidgetHistoryButton.swift */, - 65D29B93A0C4BA1C6542E4710BF77A11 /* SearchWidgetListView.swift */, - 703D0AC8ECA92CD8CF0775A8D4601C5B /* SearchWidgetListViewCell.swift */, - 1D52280EC4B3AC2CDA86CF1FB642B770 /* SearchWidgetMainView.swift */, - 5C18B54812F026856EFC48DDCFB759F2 /* SearchWidgetModel.swift */, - D9C33AE69CB4C19558AF27D38DB8B8E6 /* SearchWidgetObjectification.swift */, - F16E68430FA4CEAFAC4080B55DA6DF46 /* SearchWidgetTextField.swift */, - FB3D1F8F008190C6E3955BA330C058C7 /* SearchWidgetView.swift */, - 569B627A2782B90CA5D5853B3C959B76 /* SearchWidgetViewController.swift */, - D6F01C0168EBE8B18EE3446077B208BD /* SessionDataTaskProtocol.swift */, - 632E6FC22B9AFA0B2DFD47A36D020A51 /* SessionOperation.swift */, - 30A88154C15EC92C056E82BA38525354 /* SessionQueue.swift */, - 8A09664300AD47D7EBDBF1FB5BDC39ED /* SettingsManageable.swift */, - 29F7EA496423328803FD453316A54B65 /* SimplePersonalizationSDK.swift */, - CEBC47F23D50F572F592E8EFCE8E0CC7 /* SlideView.swift */, - A0E9B289963817FA78A8583561ED350D /* SlideViewController.swift */, - 2DDBEF0F4DDA36B36B6A28BCFF006576 /* Stories.swift */, - F732457649293BC8B74F3E038FC7211F /* StoriesCollectionViewPreviewCell.swift */, - 0F4EB700314CBDAF9D3BB0F8E4B8E31C /* StoriesImageLoader.swift */, - 22862096C8C4534D4B02D40A61A734C1 /* StoriesSlideReloadIndicator.swift */, - 11777F247DC149F2E0E2806B90035277 /* StoriesView.swift */, - 17257CACBCCEBF1C2DD76664FDFEF3AC /* StoryBlockImageCache.swift */, - 99F9C0A8AA814389AAE55FF89F73EE36 /* StoryButton.swift */, - 2CAB7D300DB9B1E07DC73AEA2C8435AC /* StoryCollectionViewCell.swift */, - 7AC2467D5479C404FD4968DC7EC708EE /* StoryViewController.swift */, - C3735C840CA6B88AE08524D21EA8964D /* SubscriptionService.swift */, - 00D224F6A32519DBCAA8EB01E6BA2162 /* SubscriptionServiceImpl.swift */, - 5A3978A93ABFC6B7C7CBC15D9F9F638C /* TBAppearanceConfiguration.swift */, - 48FF9F95BA64D49C08CF656D21C3440E /* TBFontConfiguration.swift */, - 9F003C3DB1DEE8A11EC3298400F7A1B3 /* TBTextConfiguration.swift */, - 57A5B5D265AC1234063113418BD3E1CB /* TexBlockConfiguration.swift */, - 7BD36489511AE5FB35BA90436C499B0D /* TextBlockConstants.swift */, - 1F255503103B380CB3EA23F2E7996F08 /* TextBlockView.swift */, - 505248D6C60CC4F6A55342B30E361711 /* TrackingService.swift */, - 70FDFDC9DAEFE9679E1612F7BE45B090 /* TrackServiceImpl.swift */, - 6FF5116DB2D8530BB8ECF9D4E7936E4C /* UIBezierPath+Circle.swift */, - B4E8BB6400FDB9077215FBEAE159BC74 /* UIBezierPath+ImagePlaceholder.swift */, - 2B89AF34249DB864CD7B43C5890E4F68 /* UIColor+Extension.swift */, - 368C740791623E4AE11F074044BF4137 /* UIFont+FontInjector.swift */, - 53FE3C9C656AE81BB445C59CAFBE6AAC /* UIFontDescriptorUsage.swift */, - 307F2FD3ABDDBE63187F9C59A64B67D5 /* UIImage+ImageLoader.swift */, - E5D53FF3AD59115B9E8C10C60BE6D089 /* UIImageView+ImageLoader.swift */, - F12560A4027E4D576731F67C2198BD9B /* UISdkWrapLabel.swift */, - B74295EFAFFA38177C7FF2EC4320A5D6 /* UIViewController+PromocodeBanner.swift */, - F4F501A540D39A4860A8A7BB3263065F /* URLLiteralConvertible.swift */, - 06DDBE28B7433B10BE0392AB0E3C064B /* URLSessionQueue.swift */, - 5F09B7E179278A66F4F97E044009E7A1 /* UserDefaultsExtension.swift */, - 9ACFD36360239004C74296177CC06B81 /* UserSettings.swift */, - 0C2AE0C77EDDD0515B5E3D088D520FA3 /* VideoDownloadManager.swift */, - F3818059782C7B1659E851A2F9BC5BC6 /* VideoDownloadObject.swift */, - A29203D7043AD29587BAF76E23E053E8 /* VideoFileUtils.swift */, - 7FF070DC855241EA4C868AE40AB5CB5C /* ViewConfigPlain.swift */, - 0A2AE4C316F0E56E8C5B4033D59C9B35 /* ViewConfigService.swift */, - 12CEFACCFD41C692AF42055B2947B7C1 /* Resources */, - A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */, + A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */, + 3671B3C220D01E22000CF41146C2B4AB /* REES46 */, + DDFD6E1EE7FB75CC6E6CEB7213F706BD /* Resolver */, ); - name = REES46; - path = REES46; + name = Products; sourceTree = ""; }; - 45F05160E1AA18223A137E9876780947 /* Products */ = { + 3DBB4017F3DA8154E0A374FD4344792D /* Resources */ = { isa = PBXGroup; children = ( - A05E795ECA6FF0F5767E433F8FE8625C /* Pods-demo-store-ios */, - 3671B3C220D01E22000CF41146C2B4AB /* REES46 */, + 18EDD70FAE76ABF902F4CC3C555D727B /* PrivacyInfo.xcprivacy */, ); - name = Products; + name = Resources; sourceTree = ""; }; 54B44E4960940F6283E5BE08B84C2EC2 /* Targets Support Files */ = { @@ -533,14 +432,199 @@ name = "Targets Support Files"; sourceTree = ""; }; - 578452D2E740E91742655AC8F1636D1F /* iOS */ = { + 59DA5C1F72E1D5BABC43EACBA672C3BA /* iOS */ = { isa = PBXGroup; children = ( - 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, + EAB6F611E86A4758835A715E4B4184F6 /* Foundation.framework */, + D245E0514AAC1A2B9A6D5EA2F383E90F /* UIKit.framework */, ); name = iOS; sourceTree = ""; }; + 64FD3CDE6C3F2BF8E81E1C45AB86D6CD /* REES46 */ = { + isa = PBXGroup; + children = ( + 788E8B696A5D042855C2F1BD95FE3D88 /* Assets.swift */, + 481A23D002D1C55D2014685BDDC523F8 /* CAPropertyAnimation+Key.swift */, + 3A0A74A60559E37121785A69A5E4FD11 /* CarouselCollectionView.swift */, + C8153C3C08485CF12D98C18A9D83052E /* CarouselCollectionViewCell.swift */, + C09A82C94094F8681AFB97A5A0C2A90A /* CarouselConstants.swift */, + 13310336C32A8CB04EA4C1A04715D7CD /* CartItem.swift */, + 235E7EFDE8A999C308AD6CBB82688526 /* CGImageSource+ImageLoader.swift */, + 89E68D512B837CC27D1E1500044C943B /* CGRect+Center.swift */, + 46EE3A771CC6DB61EB094762BCFDBFC5 /* CGSize+Min.swift */, + 054B17CB40AC8BCD412F6153E91F70A3 /* ColorExtensions.swift */, + 6ACE401F6461E22F93B8228E0DA53C49 /* Coverable.swift */, + 5032FA3898BA2ED9EA1B442884E3B2B9 /* Coverable+UIKit.swift */, + 58D9FD5722E2959987EDFA03D7C2168C /* Data+ImageLoader.swift */, + C91138E3AA2D7155B7A83868FEA30C59 /* Disk.swift */, + 1D95132DF76F9268898A274E66982D7A /* FontFamily.swift */, + 5EB28A541896C734C8E7BCF5E533C9E5 /* GenericDataTask.swift */, + 203D9E554B6AD0CA2DBCFB6004F80052 /* HashStorage.swift */, + A8647FBFD38262B812B6185CF909E309 /* ImageData.swift */, + 729005440B6F90C18F2BC4B11DD14101 /* ImageLoader.swift */, + 0E391F42EF4ED1F7DEB808697763EF58 /* ImageLoaderError.swift */, + D4EA0E3F27697657A9D80F2AC00109BE /* ImageLoading.swift */, + C57EF1C44205594F6B4D9A055E7F2297 /* InitResponse.swift */, + 5265E0ED6D5761A5F5B4280E5DC9699B /* InitService.swift */, + 89D4E1D8FBF0797712533614C8F902DA /* Loader.swift */, + 006D7B411807B85526039B562CE8E0CB /* LoadingPlaceholderView.swift */, + 48A76277ECC8E3229ABE54F2446F79FA /* ManagedViewConfig.swift */, + 848F6F5834CC4EB7D287A93F2075CA21 /* Navigation.swift */, + 5085525DE8A8C69991BFD428853AE9B4 /* NetworkConnectionStatus.swift */, + 40C6A5099A6262B396E779D46EA418A2 /* NetworkConnectionType.swift */, + 423D8F634C8260F7062A982EF97D0116 /* NetworkRadioType.swift */, + D39FC3F00BA45A55026CA72872B3A16C /* NetworkStatus.swift */, + DD0D81D0C7B3972631F6CBE375955939 /* NetworkStatusObserver.swift */, + 3C7F01562FA95F0BA9BC1085172DA4A4 /* NetworkStatusObserverUI.swift */, + D4DF9B812473B1B6CC3FE24667CF2C1B /* NotificationHandlingService.swift */, + 9684A1A62561C84568992C79EAAF2B97 /* NotificationHandlingServiceImpl.swift */, + 8991FCA1A1E59768D8582E07C984323C /* NotificationService.swift */, + 46078399770FC3AB917F74E7FCB7E23C /* Operative.swift */, + 98E893B8E2FBCE442EEE0B88DF2E3DCE /* Option.swift */, + 824FAD4991B5DFA639F7D00E9EFD9268 /* PersonalizationSDK.swift */, + 7626FE59EA0083471ED7BFB8A0503CF4 /* ProductsButton.swift */, + 52C6ABC60834B40A0B382527159B8D6F /* ProductsResponse.swift */, + 98CFAA09A4D847B30FFD98C847B0D344 /* PromocodeBanner.swift */, + 33B5658B1B66558E6E37DEB2A9BE9B82 /* PromoCodeView.swift */, + 34D9CCEC64C2C07530AF89DEDE667B72 /* PushTokenHandlerImpl.swift */, + 4693CC234E1865FEDCCE54DE6432B3F8 /* PushTokenNotificationService.swift */, + 840E523C4B2C0ABD030537548D229D18 /* PushTokenNotificationServiceImpl.swift */, + 7284C1E32418C7CEE227F581217DE057 /* RawRepresentable+FontInjector.swift */, + B812D966FF5B03C7DCA2C719BACD59C2 /* RecommendationsStarsView.swift */, + CE9112ABE7E60C0ECAF394EFBE817AA8 /* RecommendationsWidgetConstants.swift */, + B24DF76F79FD76D5D61A7A80DB32A8AE /* RecommendationsWidgetView.swift */, + E6C84529591749DD80921D933282C8C4 /* RecommendationsWidgetViewCell.swift */, + A22870D437334BC692BDBC57357A7F1B /* RecommendResponse.swift */, + 6CFCB47107356A4063304CE05D2268D4 /* RegisterNotification.swift */, + AAAC26210F1BA43CE46EF96714104515 /* ReloadButton.swift */, + AA72AB305058A22216BCD20A7AD492E9 /* RequestOperation.swift */, + F24C8CFEBEB1CA4BF17447369C29408C /* RView_Extensions.swift */, + D754AE66A3217DCE8F7AF28EDAABC5E3 /* RWebViewController.swift */, + A223CBDBC801475ED6E139948FC6B7A3 /* RWebViewController_Extensions.swift */, + FFACCDCF6BC71A771C72075C5050C68F /* SdkActivityIndicator.swift */, + A9584CF1FF6858C640CEFC52E1C9A1E1 /* SdkApperanceViewScheme.swift */, + 750C69D3CD3838F61CDE14D97051E8B6 /* SdkConfiguration.swift */, + 7F18713C7B90D58145E7FFA613B147D3 /* SdkDynamicFont.swift */, + 297C3C9558F82D7DB9D196365AB6F11D /* SdkFontInjector.swift */, + FB3CC78EC1E059D7BFBF1797D4796EF8 /* SdkFontInstaller.swift */, + 8477201876AE4346F4EDA080A8DC1D3A /* SdkGlobalHelper.swift */, + E23541FDD4FB76F8FB6280CE37DF1568 /* SdkImageReloader.swift */, + 44B9BB904CF6B5BBB78ADF0327076D60 /* SdkPopupAlertView.swift */, + 3C23B42A733F6F6BB4866A4241F038BA /* SdkQueryBuilder.swift */, + 1B20CA568E97CD47D30833E8BBA03609 /* SdkStyle.swift */, + 2C0C4C0E5B71319B016EB862BD53C7AE /* SdkStyleColorScheme.swift */, + FDD1814B0CEA7FABAE5AABBEB187D022 /* SdkStyleColorSchemeAwareView.swift */, + 5932B7FDF86C8603E0905796916151B5 /* SdkStyleColorSchemeAwareViewController.swift */, + E8F5186C4000554C5C2D93E9E9359B2A /* SdkStyleCustomColorScheme.swift */, + 8CCFDA412E7BB6719DDA050BB5C81B5F /* SdkStyleCustomColorSchemeAwareView.swift */, + 24F1F2AC006EAEF9AE5F8795547E5E5F /* SdkStyleCustomColorSchemeAwareViewController.swift */, + 6E88F2967F4B278025EAE135642570B2 /* SdkStyleCustomFonts.swift */, + EE6CC60601982077C5DFD420CF21FF26 /* SdkStyleCustomFontSizeAwareView.swift */, + 1E9078AD1415FA4F07660A3D7A1B3EDC /* SdkStyleCustomFontSizeAwareViewController.swift */, + BC2A107C1BE421B18F06D150867D8A8C /* SdkStyleUIApplication.swift */, + 2B22455637D3BEC9BA719B5A2D2D413C /* SearchResponse.swift */, + 779EAF20FB715103542C4F0A5127A673 /* SearchWidget.swift */, + 585EE06F85888A8317F9D59985AF7E2F /* SearchWidgetCategoriesButton.swift */, + B682BBBFC00215B0C80DE423C57F5D4C /* SearchWidgetDelegate.swift */, + 865C853D75F1A51216F70B876C0470D1 /* SearchWidgetExtension.swift */, + 9692A7772995ACB6EB1DF6916C8D138B /* SearchWidgetHistoryButton.swift */, + 09D3C44076AC345FCC99586417DE8DC7 /* SearchWidgetListView.swift */, + E4E8346FCEDF183F25A4AF1D2230C94C /* SearchWidgetListViewCell.swift */, + 75818132ED88314125153A5590C1C638 /* SearchWidgetMainView.swift */, + 4BBA380EE62922598664672D457EBC26 /* SearchWidgetModel.swift */, + 666329C5E849E30DC1538CD2F4C4AEA6 /* SearchWidgetObjectification.swift */, + D6A62E0EE0F2BE6B027E958A2E513212 /* SearchWidgetTextField.swift */, + 4F722C35D2174564A6608F9868B70352 /* SearchWidgetView.swift */, + 7632B3306B5915098424C9B8633E6409 /* SearchWidgetViewController.swift */, + EC94FDD099EC6DF033BE719FCA851769 /* SessionDataTaskProtocol.swift */, + 96A616905A289463D65645208FF80D52 /* SessionOperation.swift */, + 3D6E9C937ECED5AE5B1C384A64A611BD /* SessionQueue.swift */, + 077CBE5668F43E8F4C4798EDE6267D31 /* SettingsManageable.swift */, + 1AA521024584A7CC9019483C5442322B /* SimplePersonalizationSDK.swift */, + E3E6EBEB144300AFD9EEAFF9DC8F21FB /* SlideView.swift */, + 95D224BC8ADE78CF3A02C45A0B5A2734 /* SlideViewController.swift */, + 2F8E48A3354A21139597AD432F4931D7 /* Stories.swift */, + 458AB880D7CDA00C9A2FCC03D52654BB /* StoriesCollectionViewPreviewCell.swift */, + E44AA690C57E372E9DDD34A99BAC5094 /* StoriesImageLoader.swift */, + 65EE316BAA24A8C3B9088F4FD92ACA81 /* StoriesSlideReloadIndicator.swift */, + 13A82CEE6333CA39359FD8E3755DABDE /* StoriesView.swift */, + E9E5FC66C1AA0C0EA7D4ADAE5A86695B /* StoryBlockImageCache.swift */, + 7B4343F4078E421795EF8A8E289D6E20 /* StoryButton.swift */, + 3C47CA0088C5709393ED4F4B16086926 /* StoryCollectionViewCell.swift */, + B148A2F3434DE09C6CD1C048DF5AD76D /* StoryViewController.swift */, + C22CFCA4407D228B3178E238BCF78AEA /* SubscriptionService.swift */, + 92B341830C9437DEEE37BE76520D6B60 /* SubscriptionServiceImpl.swift */, + DC7EE8FFAF1DDB6B8FFA9F48F1460182 /* TBAppearanceConfiguration.swift */, + FF7553DBDD8E9FD91ADA9D50BFA07B0C /* TBFontConfiguration.swift */, + 4095DAB455ABA0730ED73CAD71DCE206 /* TBTextConfiguration.swift */, + BCFDEBEA464E5DCC274F85FFB32E784F /* TexBlockConfiguration.swift */, + DDD2EC39AD926EB8646A3ECEFAD8E840 /* TextBlockConstants.swift */, + B456C7FD17C572F1FC7AAD91D989AB93 /* TextBlockView.swift */, + 10D10E02E6B97F97915448E7635D731E /* TrackingService.swift */, + 3F424910F7AC5B74E5E21193BDF86748 /* TrackServiceImpl.swift */, + 880874F7A9A6F10E605C0BAF6C79CFFE /* UIBezierPath+Circle.swift */, + 9ACA082EA9115579E4B9D6D2C1640C19 /* UIBezierPath+ImagePlaceholder.swift */, + 5B584A1A3FF2C836FDBD2BD8608EDFBB /* UIColor+Extension.swift */, + 65B47826D26A6C0943D0924CE38F02D5 /* UIFont+FontInjector.swift */, + 1C24E81606B1463DA08F8DC6443B8F20 /* UIFontDescriptorUsage.swift */, + 00F1318A37D33355F02E93D4E1B8CB40 /* UIImage+ImageLoader.swift */, + C88EC488C3002448B39D74FA63F181B1 /* UIImageView+ImageLoader.swift */, + 610813B0C4C62F01CBB9C8480F4CF5EB /* UISdkWrapLabel.swift */, + C8BDE782C1EEB93A01F6C9CC377A66E7 /* UIViewController+PromocodeBanner.swift */, + 8FD8AB80480E2F8896B1C91034AF5DCA /* URLLiteralConvertible.swift */, + 55AABAF07513678958C82D21574EE6AD /* URLSessionQueue.swift */, + 01C0641FF52A756754B9AA4EE4F92211 /* UserDefaultsExtension.swift */, + ED36F152560F5D592DB5CA8EB35FC8FB /* UserSettings.swift */, + 98EAB524494C408BA9511B525A89DBD4 /* VideoDownloadManager.swift */, + 78ABF3748640C16CEB3504FA2B351429 /* VideoDownloadObject.swift */, + 8D2FC20A497D2FCAF4A23E06B31D5835 /* VideoFileUtils.swift */, + 71B1F390E7E63CA54A496BE30C7B6CA8 /* ViewConfigPlain.swift */, + 4A6979C1E9729725E9B9CA859DAA6793 /* ViewConfigService.swift */, + 93195557F2EC490A2B694C3AC5725CBB /* Resources */, + 11D79D0B6479B814E8F67AEF8AAC27B9 /* Support Files */, + ); + name = REES46; + path = REES46; + sourceTree = ""; + }; + 6C5AE7F6BC486283222B3E0A08C9D433 /* Resolver */ = { + isa = PBXGroup; + children = ( + F70619829B9D3A4C395F8ED2FE43DD88 /* Resolver.swift */, + 3DBB4017F3DA8154E0A374FD4344792D /* Resources */, + 7A95F3C1E7980C045D4E36722099AB27 /* Support Files */, + ); + name = Resolver; + path = Resolver; + sourceTree = ""; + }; + 7A95F3C1E7980C045D4E36722099AB27 /* Support Files */ = { + isa = PBXGroup; + children = ( + 7A8C039EBEB866D5730C34738B14B811 /* Resolver.modulemap */, + EA9154452194A6C2DE91102D74AB5658 /* Resolver-dummy.m */, + 5E9E0A950C86ED416AD34D690C324EDF /* Resolver-Info.plist */, + A969F7AFAFBA00C79A3E2EB73AA50818 /* Resolver-prefix.pch */, + 54D5A038202ECEB63A8F10CD95FFB6CF /* Resolver-umbrella.h */, + E295F756F15A55CD0A91E066EA45839E /* Resolver.debug.xcconfig */, + BA81663108B5583310BD404FF2068A13 /* Resolver.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/Resolver"; + sourceTree = ""; + }; + 93195557F2EC490A2B694C3AC5725CBB /* Resources */ = { + isa = PBXGroup; + children = ( + 6C4CF9A9F6C229713C39AB29E51469FD /* Assets.xcassets */, + 361D023E01B21B759CEDD96425B4EB08 /* StoriesCollectionViewPreviewCell.xib */, + B0B3D3E653D2A72D701E49996EEA999F /* StoriesView.xib */, + D74BD63FE889F2093A5AD763144E9BB1 /* StoryCollectionViewCell.xib */, + ); + name = Resources; + sourceTree = ""; + }; 954B01C74F670F14C780EC5EE723E738 /* Pods-demo-store-ios */ = { isa = PBXGroup; children = ( @@ -558,56 +642,50 @@ path = "Target Support Files/Pods-demo-store-ios"; sourceTree = ""; }; - A91D5D38DBDD4CC4142AFB17582E6F8A /* Support Files */ = { - isa = PBXGroup; - children = ( - 7EED3A4B574EFEBB9FC4A320FC64352D /* REES46.modulemap */, - DF586FFE9D7892E7EE7B7EFB1AD5CF3B /* REES46-dummy.m */, - EFE1038B30DAB86B0B88A1A3AAC6E034 /* REES46-Info.plist */, - 240A79C469C0F6595705D16927F498E9 /* REES46-prefix.pch */, - 922D434EE639D3C3B9DB4A082DA7FEB7 /* REES46-umbrella.h */, - C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */, - A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/REES46"; - sourceTree = ""; - }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, - 05C54A4D55BA128EDFC7C91451A8BB11 /* Pods */, - 45F05160E1AA18223A137E9876780947 /* Products */, + 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, + FBB39E35F6529AF5F7CAAC45D2A67B30 /* Pods */, + 1EDB74872C951A47836419A3A8CF1CF3 /* Products */, 54B44E4960940F6283E5BE08B84C2EC2 /* Targets Support Files */, ); sourceTree = ""; }; - D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { + FBB39E35F6529AF5F7CAAC45D2A67B30 /* Pods */ = { isa = PBXGroup; children = ( - 578452D2E740E91742655AC8F1636D1F /* iOS */, + 64FD3CDE6C3F2BF8E81E1C45AB86D6CD /* REES46 */, + 6C5AE7F6BC486283222B3E0A08C9D433 /* Resolver */, ); - name = Frameworks; + name = Pods; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 5D67C5954DA4997D536C56BA4873F67C /* Headers */ = { + 4F781D09EF6CEEA323B2D4153E43B10A /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */, + FA0353B57B9E752F966A16FD57B8A8BD /* Resolver-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A4F049A598956AF94033ADA695606EB1 /* Headers */ = { + 57157C5440687E95F38BA34598934166 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 469C92E04B9D2D4F8392EE02C7A39C69 /* Pods-demo-store-ios-umbrella.h in Headers */, + 21C5236B0A2082EEC1DA024B194EDAF0 /* Pods-demo-store-ios-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5D67C5954DA4997D536C56BA4873F67C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A94F489440B4F22582A708D04503EEE0 /* REES46-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -632,19 +710,38 @@ productReference = 3671B3C220D01E22000CF41146C2B4AB /* REES46 */; productType = "com.apple.product-type.framework"; }; + 3AF1A4FE1808CDAE51281F7A31DB2A13 /* Resolver */ = { + isa = PBXNativeTarget; + buildConfigurationList = EB24502C2CCD4701AD9767427762F135 /* Build configuration list for PBXNativeTarget "Resolver" */; + buildPhases = ( + 4F781D09EF6CEEA323B2D4153E43B10A /* Headers */, + E4CAC94D0DDD20CFD1040A69ED8B3AF0 /* Sources */, + 9BC2B94B990845DD960C90D01A71D386 /* Frameworks */, + 651078E390375771091C686D67F4FB71 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Resolver; + productName = Resolver; + productReference = DDFD6E1EE7FB75CC6E6CEB7213F706BD /* Resolver */; + productType = "com.apple.product-type.framework"; + }; 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */ = { isa = PBXNativeTarget; - buildConfigurationList = 055840A6FA6AAA9EF10FDACFBB00DB5C /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */; + buildConfigurationList = CC567D09592DD472849065F3CE1979C1 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */; buildPhases = ( - A4F049A598956AF94033ADA695606EB1 /* Headers */, - EB0148397D0D3BE3BDDD286B33CDA7DE /* Sources */, - 0F5AD16E4861F5A40FD3476C13069579 /* Frameworks */, - 6ED9D74DEB6F3EDA8219CEA42CF2E560 /* Resources */, + 57157C5440687E95F38BA34598934166 /* Headers */, + 24C3D6D8789B553C261691AAD58740BF /* Sources */, + 36A9DB085C67755D2E9AA97FC45927BA /* Frameworks */, + 2A9CA42EDD264B9B78762D324BC73055 /* Resources */, ); buildRules = ( ); dependencies = ( - 504A7F75DEBB11C4718A9166A011498E /* PBXTargetDependency */, + B9D7C6978F45B0BA8FAA86E85CA87C4B /* PBXTargetDependency */, + 65AD24A78F6AB09060A494A35D0BFA8C /* PBXTargetDependency */, ); name = "Pods-demo-store-ios"; productName = Pods_demo_store_ios; @@ -669,21 +766,30 @@ en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 45F05160E1AA18223A137E9876780947 /* Products */; + productRefGroup = 1EDB74872C951A47836419A3A8CF1CF3 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 80CA65F514DD5B1DC5829F29295F6292 /* Pods-demo-store-ios */, 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */, + 3AF1A4FE1808CDAE51281F7A31DB2A13 /* Resolver */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 6ED9D74DEB6F3EDA8219CEA42CF2E560 /* Resources */ = { + 2A9CA42EDD264B9B78762D324BC73055 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 651078E390375771091C686D67F4FB71 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 87AF8F757C19F3FA49377F8C3CD4486D /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -701,11 +807,20 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - EB0148397D0D3BE3BDDD286B33CDA7DE /* Sources */ = { + 24C3D6D8789B553C261691AAD58740BF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B1FF3AA160C3354557A6B38A48756E98 /* Pods-demo-store-ios-dummy.m in Sources */, + 2B8F5E4C61F8449068912DC64D160E64 /* Pods-demo-store-ios-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E4CAC94D0DDD20CFD1040A69ED8B3AF0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8EC13D530673067992EFE5C59BA07CF7 /* Resolver.swift in Sources */, + 5352192BB2E12C809436BAB92A33B08C /* Resolver-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -857,18 +972,24 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 504A7F75DEBB11C4718A9166A011498E /* PBXTargetDependency */ = { + 65AD24A78F6AB09060A494A35D0BFA8C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Resolver; + target = 3AF1A4FE1808CDAE51281F7A31DB2A13 /* Resolver */; + targetProxy = D018467322F8729B4606B26B83D40982 /* PBXContainerItemProxy */; + }; + B9D7C6978F45B0BA8FAA86E85CA87C4B /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = REES46; target = 0C03A6912D025B497528F2C7FFE2F1D5 /* REES46 */; - targetProxy = 97FD9F25B8F6CE6ACEDF790C858E79E0 /* PBXContainerItemProxy */; + targetProxy = C10FBDC4EB0AA27DE6A01E2E13362ED9 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 0543067DFA4157D877ECC1E37BB23EB4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A53A3D33789877E27FFE2436B6128C9F /* REES46.release.xcconfig */; + baseConfigurationReference = F2E66DE87E112723CBB3BCB2AA8D35C5 /* REES46.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -904,7 +1025,7 @@ }; 06C2BC5254088328504EE61E0205587A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C39B3BA12DD2CDD453E2E491D0547171 /* REES46.debug.xcconfig */; + baseConfigurationReference = 8ACEF2B1DC223BE38F9E7277335D705A /* REES46.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -937,7 +1058,42 @@ }; name = Debug; }; - 18080EF7FE2A9058EAF45222686F9653 /* Release */ = { + 0B05D091C8FC7C75AE3F4967A3BE132B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E295F756F15A55CD0A91E066EA45839E /* Resolver.debug.xcconfig */; + buildSettings = { + 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"; + GCC_PREFIX_HEADER = "Target Support Files/Resolver/Resolver-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Resolver/Resolver-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Resolver/Resolver.modulemap"; + PRODUCT_MODULE_NAME = Resolver; + PRODUCT_NAME = Resolver; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.9; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 11B06545CB653DCFC210A1E195834062 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = C2CFBF87EB78E30CC4A10E9641F99C7E /* Pods-demo-store-ios.release.xcconfig */; buildSettings = { @@ -975,6 +1131,43 @@ }; name = Release; }; + 48D8EED7A5518A6464CE28A9C2A18C15 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A3BC4DCD1D930788E65681442B043C28 /* Pods-demo-store-ios.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-demo-store-ios/Pods-demo-store-ios-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.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; + }; 8DE5143C03248BB6CD542DE3963D6F3A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1103,11 +1296,10 @@ }; name = Release; }; - C2109C2FBBF7CBF8410B857E16C2529D /* Debug */ = { + AA08EF2E173E7AB435E3FB7B23769743 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A3BC4DCD1D930788E65681442B043C28 /* Pods-demo-store-ios.debug.xcconfig */; + baseConfigurationReference = BA81663108B5583310BD404FF2068A13 /* Resolver.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1117,7 +1309,8 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Resolver/Resolver-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Resolver/Resolver-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -1125,33 +1318,23 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + MODULEMAP_FILE = "Target Support Files/Resolver/Resolver.modulemap"; + PRODUCT_MODULE_NAME = Resolver; + PRODUCT_NAME = Resolver; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.9; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 055840A6FA6AAA9EF10FDACFBB00DB5C /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C2109C2FBBF7CBF8410B857E16C2529D /* Debug */, - 18080EF7FE2A9058EAF45222686F9653 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 22B59BFD5B487006E1351D4A0360ED8C /* Build configuration list for PBXNativeTarget "REES46" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1170,6 +1353,24 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + CC567D09592DD472849065F3CE1979C1 /* Build configuration list for PBXNativeTarget "Pods-demo-store-ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 48D8EED7A5518A6464CE28A9C2A18C15 /* Debug */, + 11B06545CB653DCFC210A1E195834062 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EB24502C2CCD4701AD9767427762F135 /* Build configuration list for PBXNativeTarget "Resolver" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0B05D091C8FC7C75AE3F4967A3BE132B /* Debug */, + AA08EF2E173E7AB435E3FB7B23769743 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; diff --git a/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift b/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift index 0969e3c..4a21585 100644 --- a/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift +++ b/Pods/REES46/REES46/Classes/SimplePersonalizationSDK.swift @@ -18,6 +18,8 @@ class SimplePersonalizationSDK: PersonalizationSDK { static let segment: String = "segment" static let limit: String = "limit" static let offset: String = "offset" + static let searchPath: String = "search" + static let fullSearch: String = "full_search" static let categoryLimit: String = "category_limit" static let categories: String = "categories" static let extended: String = "extended" @@ -98,12 +100,7 @@ class SimplePersonalizationSDK: PersonalizationSDK { global_EL = enableLogs -#if DEBUG - let basePath = ProcessInfo.processInfo.environment["BASE_PATH"] ?? "" -#else - let basePath = apiDomain -#endif - self.baseURL = "https://" + basePath + "/" + self.baseURL = "https://" + apiDomain + "/" self.userEmail = userEmail self.userPhone = userPhone @@ -267,126 +264,124 @@ class SimplePersonalizationSDK: PersonalizationSDK { } } - func searchBlank(completion: @escaping (Result) -> Void) { - sessionQueue.addOperation { - let path = "search/blank" - let params: [String : String] = [ - "did": self.deviceId, - "shop_id": self.shopId - ] - - let sessionConfig = URLSessionConfiguration.default - sessionConfig.timeoutIntervalForRequest = 1 - sessionConfig.waitsForConnectivity = true - sessionConfig.shouldUseExtendedBackgroundIdleMode = true - self.urlSession = URLSession(configuration: sessionConfig) - self.getRequest(path: path, params: params) { (result) in - switch result { - case let .success(successResult): - let resJSON = successResult - let resultResponse = SearchBlankResponse(json: resJSON) - completion(.success(resultResponse)) - case let .failure(error): - completion(.failure(error)) - } - } - } - } - - func search(query: String, limit: Int?, offset: Int?, categoryLimit: Int?, categories: String?, extended: String?, sortBy: String?, sortDir: String?, locations: String?, brands: String?, filters: [String: Any]?, priceMin: Double?, priceMax: Double?, colors: [String]?, fashionSizes: [String]?, exclude: String?, email: String?, timeOut: Double?, disableClarification: Bool?, completion: @escaping (Result) -> Void) { - - sessionQueue.addOperation { - let path = "search" - var params: [String: String] = [ - Constants.shopId: self.shopId, - Constants.deviceId: self.deviceId, - Constants.userSeance: self.userSeance, - Constants.segment: Constants.type, - Constants.segment: self.segment, - Constants.type: "full_search", - Constants.searchQuery: query, - ] - - if let limit = limit { - params[Constants.limit] = String(limit) - } - if let offset = offset { - params[Constants.offset] = String(offset) - } - if let categoryLimit = categoryLimit { - params[Constants.categoryLimit] = String(categoryLimit) - } - if let categories = categories { - params[Constants.categories] = categories - } - if let extended = extended { - params[Constants.extended] = extended - } - if let sortBy = sortBy { - params[Constants.sortBy] = String(sortBy) - } - if let sortDir = sortDir { - params[Constants.sortDir] = String(sortDir) - } - if let locations = locations { - params[Constants.locations] = locations - } - if let brands = brands { - params[Constants.brands] = brands - } - if let filters = filters { - if let theJSONData = try? JSONSerialization.data( - withJSONObject: filters, - options: []) { - let theJSONText = String(data: theJSONData, - encoding: .utf8) - params[Constants.filters] = theJSONText - } - } - if let priceMin = priceMin { - params[Constants.priceMin] = String(priceMin) - } - if let priceMax = priceMax { - params[Constants.priceMax] = String(priceMax) - } - if let colors = colors { - let colorsArray = self.generateString(array: colors) - params[Constants.colors] = colorsArray - } - if let fashionSizes = fashionSizes { - let fashionSizesArray = self.generateString(array: fashionSizes) - params[Constants.fashionSizes] = fashionSizesArray - } - if let exclude = exclude { - params[Constants.exclude] = exclude - } - if let email = email { - params[Constants.email] = email - } - if let disableClarification = disableClarification { - if disableClarification == true { - params[Constants.disableClarification] = Constants.noClarificationValue - } - } - - let sessionConfig = URLSessionConfiguration.default - sessionConfig.timeoutIntervalForRequest = timeOut ?? Constants.defaultTimeout - sessionConfig.waitsForConnectivity = true - sessionConfig.shouldUseExtendedBackgroundIdleMode = true - self.urlSession = URLSession(configuration: sessionConfig) - - self.getRequest(path: path, params: params) { result in - switch result { - case let .success(successResult): - let resJSON = successResult - let resultResponse = SearchResponse(json: resJSON) - completion(.success(resultResponse)) - case let .failure(error): - completion(.failure(error)) - } - } - } - } + func searchBlank(completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "search/blank" + let params: [String : String] = [ + "did": self.deviceId, + "shop_id": self.shopId + ] + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + self.getRequest(path: path, params: params) { (result) in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = SearchBlankResponse(json: resJSON) + completion(.success(resultResponse)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } + + func search(query: String, limit: Int?, offset: Int?, categoryLimit: Int?, categories: String?, extended: String?, sortBy: String?, sortDir: String?, locations: String?, brands: String?, filters: [String: Any]?, priceMin: Double?, priceMax: Double?, colors: [String]?, fashionSizes: [String]?, exclude: String?, email: String?, timeOut: Double?, disableClarification: Bool?, completion: @escaping (Result) -> Void) { + sessionQueue.addOperation { + let path = "search" + var params: [String: String] = [ + "shop_id": self.shopId, + "did": self.deviceId, + "seance": self.userSeance, + "sid": self.userSeance, + "type": "full_search", + "search_query": query, + "segment": self.segment + ] + if let limit = limit { + params["limit"] = String(limit) + } + if let offset = offset { + params["offset"] = String(offset) + } + if let categoryLimit = categoryLimit{ + params["category_limit"] = String(categoryLimit) + } + if let categories = categories { + params["categories"] = categories + } + if let extended = extended { + params["extended"] = extended + } + if let sortBy = sortBy { + params["sort_by"] = String(sortBy) + } + if let sortDir = sortDir { + params["sort_dir"] = String(sortDir) + } + if let locations = locations { + params["locations"] = locations + } + if let brands = brands { + params["brands"] = brands + } + if let filters = filters { + if let theJSONData = try? JSONSerialization.data( + withJSONObject: filters, + options: []) { + let theJSONText = String(data: theJSONData, + encoding: .utf8) + params["filters"] = theJSONText + } + } + if let priceMin = priceMin { + params["price_min"] = String(priceMin) + } + if let priceMax = priceMax { + params["price_max"] = String(priceMax) + } + if let colors = colors { + let colorsArray = self.generateString(array: colors) + params["colors"] = colorsArray + } + if let fashionSizes = fashionSizes { + let fashionSizesArray = self.generateString(array: fashionSizes) + params["fashion_sizes"] = fashionSizesArray + } + if let exclude = exclude { + params["exclude"] = exclude + } + if let email = email { + params["email"] = email + } + if let disableClarification = disableClarification { + if disableClarification == true { + params["no_clarification"] = "1" + } + } + + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = timeOut ?? 1 + sessionConfig.waitsForConnectivity = true + sessionConfig.shouldUseExtendedBackgroundIdleMode = true + self.urlSession = URLSession(configuration: sessionConfig) + + self.getRequest(path: path, params: params) { result in + switch result { + case let .success(successResult): + let resJSON = successResult + let resultResponse = SearchResponse(json: resJSON) + completion(.success(resultResponse)) + case let .failure(error): + completion(.failure(error)) + } + } + } + } func setProfileData(userEmail: String?, userPhone: String?, userLoyaltyId: String?, birthday: Date?, age: Int?, firstName: String?, lastName: String?, location: String?, gender: Gender?, fbID: String?, vkID: String?, telegramId: String?, loyaltyCardLocation: String?, loyaltyStatus: String?, loyaltyBonuses: Int?, loyaltyBonusesToNextLevel: Int?, boughtSomething: Bool?, userId: String?, customProperties: [String: Any?]?, completion: @escaping (Result) -> Void) { sessionQueue.addOperation { diff --git a/Pods/Target Support Files/REES46/REES46-Info.plist b/Pods/Target Support Files/REES46/REES46-Info.plist index cbd119e..f5a9270 100644 --- a/Pods/Target Support Files/REES46/REES46-Info.plist +++ b/Pods/Target Support Files/REES46/REES46-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.6.23 + 3.6.27 CFBundleSignature ???? CFBundleVersion diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 1ce5142..80809f5 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -99,7 +99,6 @@ 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A912C5143630081B069 /* ProductsResolver.swift */; }; 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA12C5147A20081B069 /* SdkResolver.swift */; }; 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA42C5147F30081B069 /* HomeViewModel.swift */; }; - 75E97AA82C5148420081B069 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA72C5148420081B069 /* SdkManager.swift */; }; 75E97AA92C5148860081B069 /* SDKManagerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A9F2C51478D0081B069 /* SDKManagerProtocol.swift */; }; 75E97AAC2C514B4D0081B069 /* SearchResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAB2C514B4D0081B069 /* SearchResolver.swift */; }; 75E97AB02C514D2D0081B069 /* AppConvigVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */; }; @@ -171,6 +170,7 @@ 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrroScreenView.swift; sourceTree = ""; }; 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationManager.swift; sourceTree = ""; }; 75A3F4282C38593800AAC175 /* ToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarView.swift; sourceTree = ""; }; + 75A4D5AB2C57966A00929368 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SdkManager.swift; path = ../../../../../Desktop/Protocols/SdkManager.swift; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935562C3564360063E814 /* DemoStoreApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.swift; sourceTree = ""; }; 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -214,10 +214,8 @@ 75E97A912C5143630081B069 /* ProductsResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsResolver.swift; sourceTree = ""; }; 75E97A9F2C51478D0081B069 /* SDKManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKManagerProtocol.swift; sourceTree = ""; }; 75E97AA12C5147A20081B069 /* SdkResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkResolver.swift; sourceTree = ""; }; - 75E97AA32C5147EF0081B069 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; 75E97AA42C5147F30081B069 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; 75E97AA62C51482F0081B069 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; - 75E97AA72C5148420081B069 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SdkManager.swift; path = ../../../../../Desktop/Protocols/SdkManager.swift; sourceTree = ""; }; 75E97AAB2C514B4D0081B069 /* SearchResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResolver.swift; sourceTree = ""; }; 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppConvigVariables.swift; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; @@ -745,7 +743,7 @@ 75E97A802C51322F0081B069 /* ViewModel */ = { isa = PBXGroup; children = ( - 75E97AA72C5148420081B069 /* SdkManager.swift */, + 75A4D5AB2C57966A00929368 /* SdkManager.swift */, ); path = ViewModel; sourceTree = ""; @@ -785,7 +783,6 @@ 75E97A952C5146EB0081B069 /* Protocols */ = { isa = PBXGroup; children = ( - 75E97AA32C5147EF0081B069 /* HomeViewModel.swift */, 75E97A9F2C51478D0081B069 /* SDKManagerProtocol.swift */, 75E97AA62C51482F0081B069 /* SdkManager.swift */, ); @@ -1089,7 +1086,6 @@ 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */, - 75E97AA82C5148420081B069 /* SdkManager.swift in Sources */, 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */, 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */, From e9bf81d32f23d7017ad4bd71c9502f601b67f340 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 29 Jul 2024 11:53:37 +0200 Subject: [PATCH 73/85] feat(core): Revert sdk initialization classes and update sdk version --- Core/DI/Protocols/SDKManagingProtocol.swift | 6 ++++ Core/DI/SdkResolver.swift | 2 +- Core/Presentation/ViewModel/SdkManager.swift | 30 ++++++++++++++++++ demo-store-ios.xcodeproj/project.pbxproj | 33 ++++++++++---------- 4 files changed, 53 insertions(+), 18 deletions(-) create mode 100644 Core/DI/Protocols/SDKManagingProtocol.swift create mode 100644 Core/Presentation/ViewModel/SdkManager.swift diff --git a/Core/DI/Protocols/SDKManagingProtocol.swift b/Core/DI/Protocols/SDKManagingProtocol.swift new file mode 100644 index 0000000..b71f87a --- /dev/null +++ b/Core/DI/Protocols/SDKManagingProtocol.swift @@ -0,0 +1,6 @@ +import Foundation +import REES46 + +protocol SDKManagingProtocol { + var sdk: PersonalizationSDK? { get } +} diff --git a/Core/DI/SdkResolver.swift b/Core/DI/SdkResolver.swift index b06fc8d..c5ebd04 100644 --- a/Core/DI/SdkResolver.swift +++ b/Core/DI/SdkResolver.swift @@ -2,6 +2,6 @@ import Resolver extension Resolver { static func registerSdk() { - register { SDKManager() as SDKManagingProtocol }.scope(.shared) + register { SDKManager() as SDKManagingProtocol }.scope(.application) } } diff --git a/Core/Presentation/ViewModel/SdkManager.swift b/Core/Presentation/ViewModel/SdkManager.swift new file mode 100644 index 0000000..79258b8 --- /dev/null +++ b/Core/Presentation/ViewModel/SdkManager.swift @@ -0,0 +1,30 @@ +import REES46 + +class SDKManager: SDKManagingProtocol { + var sdk: PersonalizationSDK? + + init() { + initializeSDK() + } + + private func initializeSDK() { + sdk = createPersonalizationSDK( + shopId: AppConfigVariables.shopId, + apiDomain: AppConfigVariables.apiDomain, + stream: AppConfigVariables.sdkStream, + enableLogs: true, + autoSendPushToken: true + ) { error in + if let error = error { + print("SDK Initialization failed: \(error.localizedDescription)") + } else { + print("SDK Initialization succeeded") + if let sessionId = self.sdk?.getSession() { + print("SDK Session ID: \(sessionId)") + } else { + print("Failed to retrieve SDK session ID") + } + } + } + } +} diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 80809f5..36cc3bc 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -28,6 +28,8 @@ 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */; }; 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4282C38593800AAC175 /* ToolbarView.swift */; }; + 75A4D5AE2C579A3F00929368 /* SDKManagingProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */; }; + 75A4D5B22C579A4900929368 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D5B12C579A4900929368 /* SdkManager.swift */; }; 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* DemoStoreApp.swift */; }; 75B935592C3564360063E814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; @@ -99,7 +101,6 @@ 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A912C5143630081B069 /* ProductsResolver.swift */; }; 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA12C5147A20081B069 /* SdkResolver.swift */; }; 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA42C5147F30081B069 /* HomeViewModel.swift */; }; - 75E97AA92C5148860081B069 /* SDKManagerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A9F2C51478D0081B069 /* SDKManagerProtocol.swift */; }; 75E97AAC2C514B4D0081B069 /* SearchResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAB2C514B4D0081B069 /* SearchResolver.swift */; }; 75E97AB02C514D2D0081B069 /* AppConvigVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */; }; 75E97AB12C514D2D0081B069 /* AppConvigVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */; }; @@ -170,7 +171,8 @@ 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrroScreenView.swift; sourceTree = ""; }; 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationManager.swift; sourceTree = ""; }; 75A3F4282C38593800AAC175 /* ToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarView.swift; sourceTree = ""; }; - 75A4D5AB2C57966A00929368 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SdkManager.swift; path = ../../../../../Desktop/Protocols/SdkManager.swift; sourceTree = ""; }; + 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKManagingProtocol.swift; sourceTree = ""; }; + 75A4D5B12C579A4900929368 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935562C3564360063E814 /* DemoStoreApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.swift; sourceTree = ""; }; 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; @@ -212,10 +214,8 @@ 75E97A872C51414D0081B069 /* CartRepositoryProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepositoryProtocol.swift; sourceTree = ""; }; 75E97A8C2C5142F10081B069 /* ProductsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsViewModel.swift; sourceTree = ""; }; 75E97A912C5143630081B069 /* ProductsResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsResolver.swift; sourceTree = ""; }; - 75E97A9F2C51478D0081B069 /* SDKManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKManagerProtocol.swift; sourceTree = ""; }; 75E97AA12C5147A20081B069 /* SdkResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkResolver.swift; sourceTree = ""; }; 75E97AA42C5147F30081B069 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; - 75E97AA62C51482F0081B069 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; 75E97AAB2C514B4D0081B069 /* SearchResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResolver.swift; sourceTree = ""; }; 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppConvigVariables.swift; sourceTree = ""; }; 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; @@ -293,6 +293,14 @@ path = Utils; sourceTree = ""; }; + 75A4D5AC2C579A2100929368 /* Protocols */ = { + isa = PBXGroup; + children = ( + 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */, + ); + path = Protocols; + sourceTree = ""; + }; 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( @@ -743,7 +751,7 @@ 75E97A802C51322F0081B069 /* ViewModel */ = { isa = PBXGroup; children = ( - 75A4D5AB2C57966A00929368 /* SdkManager.swift */, + 75A4D5B12C579A4900929368 /* SdkManager.swift */, ); path = ViewModel; sourceTree = ""; @@ -780,16 +788,6 @@ path = DI; sourceTree = ""; }; - 75E97A952C5146EB0081B069 /* Protocols */ = { - isa = PBXGroup; - children = ( - 75E97A9F2C51478D0081B069 /* SDKManagerProtocol.swift */, - 75E97AA62C51482F0081B069 /* SdkManager.swift */, - ); - name = Protocols; - path = ../../../../Desktop/Protocols; - sourceTree = ""; - }; 75E97AAA2C514B3D0081B069 /* DI */ = { isa = PBXGroup; children = ( @@ -821,7 +819,7 @@ children = ( 75E97A772C512F8C0081B069 /* DependenciesInitialization.swift */, 75E97AA12C5147A20081B069 /* SdkResolver.swift */, - 75E97A952C5146EB0081B069 /* Protocols */, + 75A4D5AC2C579A2100929368 /* Protocols */, ); path = DI; sourceTree = ""; @@ -1042,7 +1040,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75E97AA92C5148860081B069 /* SDKManagerProtocol.swift in Sources */, 75E97AAC2C514B4D0081B069 /* SearchResolver.swift in Sources */, 75E97A642C50320F0081B069 /* RecommendedProductMapper.swift in Sources */, 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */, @@ -1087,6 +1084,7 @@ 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */, 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */, + 75A4D5B22C579A4900929368 /* SdkManager.swift in Sources */, 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */, 75E97A232C5023600081B069 /* SearchFilter.swift in Sources */, @@ -1100,6 +1098,7 @@ 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, 75E97A272C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, 75E979D02C4974440081B069 /* CartListView.swift in Sources */, + 75A4D5AE2C579A3F00929368 /* SDKManagingProtocol.swift in Sources */, 75E97A712C5041920081B069 /* ImageItem.swift in Sources */, 75E979D42C4974660081B069 /* CartListItemView.swift in Sources */, 75E97A392C5024CD0081B069 /* SearchProduct.swift in Sources */, From d112b9fa40cadfa57b1ac61b86431833ad7f7f13 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 2 Aug 2024 11:16:21 +0200 Subject: [PATCH 74/85] refactor(app): Add suffix for structs and protocols --- ...oreApp.swift => DemoStoreApp.struct.swift} | 0 .../{TabItem.swift => TabItem.struct.swift} | 0 ...swift => ScreenTypeProviderProtocol.swift} | 0 ...rView.swift => BottomBarView.struct.swift} | 0 ...entView.swift => ContentView.struct.swift} | 0 ...MainViews.swift => MainViews.struct.swift} | 0 ...View.swift => CartScreenView.struct.swift} | 0 ...View.swift => HomeScreenView.struct.swift} | 0 ....swift => ProductsScreenView.struct.swift} | 0 ...apper.swift => ScreenWrapper.struct.swift} | 0 ....swift => SettingsScreenView.struct.swift} | 0 ...ew.swift => SplashScreenView.struct.swift} | 0 ....swift => DetailsToolbarView.struct.swift} | 0 ...barView.swift => ToolbarView.struct.swift} | 0 ...> DependenciesInitialization.struct.swift} | 0 ...ingView.swift => LoadingView.struct.swift} | 0 ...ter.swift => RatingConverter.struct.swift} | 0 .../Views/RemoteImageLoader.swift | 57 --- .../Views/RemoteImageView.struct.swift | 59 +++ ....swift => AppConvigVariables.struct.swift} | 0 ...Dto.swift => ProductCartItem.struct.swift} | 0 ...ew.swift => CartListItemView.struct.swift} | 0 ...stView.swift => CartListView.struct.swift} | 0 ...ImageItem.swift => ImageItem.struct.swift} | 0 ... => ListDiscoverProductsView.struct.swift} | 0 ...> FullRecommendationListView.struct.swift} | 0 ... ShortRecommendationListView.struct.swift} | 0 ...w.swift => SectionHeaderView.struct.swift} | 0 ... => HomeStoriesContainerView.struct.swift} | 0 .../{Product.swift => Product.struct.swift} | 0 ....swift => RecommendedProduct.struct.swift} | 0 ...swift => ProductListItemView.struct.swift} | 0 ...gory.swift => SearchCategory.struct.swift} | 0 ....swift => SearchFashionColor.struct.swift} | 0 ...e.swift => SearchFashionSize.struct.swift} | 0 ...Filter.swift => SearchFilter.struct.swift} | 0 ...t => SearchIndustrialFilters.struct.swift} | 0 ...ge.swift => SearchPriceRange.struct.swift} | 0 ...oduct.swift => SearchProduct.struct.swift} | 0 ...ift => SearchProductResponse.struct.swift} | 0 ...chQuery.swift => SearchQuery.struct.swift} | 0 ...rect.swift => SearchRedirect.struct.swift} | 0 ...ggest.swift => SearchSuggest.struct.swift} | 0 ...ew.swift => SearchResultView.struct.swift} | 0 ...ew.swift => SearchScreenView.struct.swift} | 0 ...t => SettingsErrroScreenView.struct.swift} | 0 ...ift => SettingsInputCodeView.struct.swift} | 0 demo-store-ios.xcodeproj/project.pbxproj | 460 +++++++++--------- .../xcschemes/xcschememanagement.plist | 4 +- 49 files changed, 293 insertions(+), 287 deletions(-) rename App/{DemoStoreApp.swift => DemoStoreApp.struct.swift} (100%) rename App/Models/{TabItem.swift => TabItem.struct.swift} (100%) rename App/Navigation/Protocols/{ScreenTypeProvider.swift => ScreenTypeProviderProtocol.swift} (100%) rename App/Views/BottomBar/{BottomBarView.swift => BottomBarView.struct.swift} (100%) rename App/Views/{ContentView.swift => ContentView.struct.swift} (100%) rename App/Views/{MainViews.swift => MainViews.struct.swift} (100%) rename App/Views/Screens/{CartScreenView.swift => CartScreenView.struct.swift} (100%) rename App/Views/Screens/{HomeScreenView.swift => HomeScreenView.struct.swift} (100%) rename App/Views/Screens/{ProductsScreenView.swift => ProductsScreenView.struct.swift} (100%) rename App/Views/Screens/{ScreenWrapper.swift => ScreenWrapper.struct.swift} (100%) rename App/Views/Screens/{SettingsScreenView.swift => SettingsScreenView.struct.swift} (100%) rename App/Views/Screens/{SplashScreenView.swift => SplashScreenView.struct.swift} (100%) rename App/Views/ToolBar/{DetailsToolbarView.swift => DetailsToolbarView.struct.swift} (100%) rename App/Views/ToolBar/{ToolbarView.swift => ToolbarView.struct.swift} (100%) rename Core/DI/{DependenciesInitialization.swift => DependenciesInitialization.struct.swift} (100%) rename Core/Presentation/Views/{LoadingView.swift => LoadingView.struct.swift} (100%) rename Core/Presentation/Views/{RatingConverter.swift => RatingConverter.struct.swift} (100%) create mode 100644 Core/Presentation/Views/RemoteImageView.struct.swift rename Core/Utils/{AppConvigVariables.swift => AppConvigVariables.struct.swift} (100%) rename Feature/Cart/Data/Model/{ProductCartItemDto.swift => ProductCartItem.struct.swift} (100%) rename Feature/Cart/Presentation/View/{CartListItemView.swift => CartListItemView.struct.swift} (100%) rename Feature/Cart/Presentation/View/{CartListView.swift => CartListView.struct.swift} (100%) rename Feature/Home/Model/{ImageItem.swift => ImageItem.struct.swift} (100%) rename Feature/Home/Presentation/View/ListDiscoverProducts/{ListDiscoverProductsView.swift => ListDiscoverProductsView.struct.swift} (100%) rename Feature/Home/Presentation/View/ListRecommendation/{FullRecommendationListView.swift => FullRecommendationListView.struct.swift} (100%) rename Feature/Home/Presentation/View/ListRecommendation/{ShortRecommendationListView.swift => ShortRecommendationListView.struct.swift} (100%) rename Feature/Home/Presentation/View/{SectionHeaderView.swift => SectionHeaderView.struct.swift} (100%) rename Feature/Home/Presentation/View/Stories/{HomeStoriesContainerView.swift => HomeStoriesContainerView.struct.swift} (100%) rename Feature/Product/Data/Model/{Product.swift => Product.struct.swift} (100%) rename Feature/Product/Data/Model/{RecommendedProduct.swift => RecommendedProduct.struct.swift} (100%) rename Feature/Product/Presentation/View/{ProductListItemView.swift => ProductListItemView.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchCategory.swift => SearchCategory.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchFashionColor.swift => SearchFashionColor.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchFashionSize.swift => SearchFashionSize.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchFilter.swift => SearchFilter.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchIndustrialFilters.swift => SearchIndustrialFilters.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchPriceRange.swift => SearchPriceRange.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchProduct.swift => SearchProduct.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchProductResponse.swift => SearchProductResponse.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchQuery.swift => SearchQuery.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchRedirect.swift => SearchRedirect.struct.swift} (100%) rename Feature/Search/Data/Model/{SearchSuggest.swift => SearchSuggest.struct.swift} (100%) rename Feature/Search/Presentation/View/{SearchResultView.swift => SearchResultView.struct.swift} (100%) rename Feature/Search/Presentation/View/{SearchScreenView.swift => SearchScreenView.struct.swift} (100%) rename Feature/Settings/Presentation/View/{SettingsErrroScreenView.swift => SettingsErrroScreenView.struct.swift} (100%) rename Feature/Settings/Presentation/View/{SettingsInputCodeView.swift => SettingsInputCodeView.struct.swift} (100%) diff --git a/App/DemoStoreApp.swift b/App/DemoStoreApp.struct.swift similarity index 100% rename from App/DemoStoreApp.swift rename to App/DemoStoreApp.struct.swift diff --git a/App/Models/TabItem.swift b/App/Models/TabItem.struct.swift similarity index 100% rename from App/Models/TabItem.swift rename to App/Models/TabItem.struct.swift diff --git a/App/Navigation/Protocols/ScreenTypeProvider.swift b/App/Navigation/Protocols/ScreenTypeProviderProtocol.swift similarity index 100% rename from App/Navigation/Protocols/ScreenTypeProvider.swift rename to App/Navigation/Protocols/ScreenTypeProviderProtocol.swift diff --git a/App/Views/BottomBar/BottomBarView.swift b/App/Views/BottomBar/BottomBarView.struct.swift similarity index 100% rename from App/Views/BottomBar/BottomBarView.swift rename to App/Views/BottomBar/BottomBarView.struct.swift diff --git a/App/Views/ContentView.swift b/App/Views/ContentView.struct.swift similarity index 100% rename from App/Views/ContentView.swift rename to App/Views/ContentView.struct.swift diff --git a/App/Views/MainViews.swift b/App/Views/MainViews.struct.swift similarity index 100% rename from App/Views/MainViews.swift rename to App/Views/MainViews.struct.swift diff --git a/App/Views/Screens/CartScreenView.swift b/App/Views/Screens/CartScreenView.struct.swift similarity index 100% rename from App/Views/Screens/CartScreenView.swift rename to App/Views/Screens/CartScreenView.struct.swift diff --git a/App/Views/Screens/HomeScreenView.swift b/App/Views/Screens/HomeScreenView.struct.swift similarity index 100% rename from App/Views/Screens/HomeScreenView.swift rename to App/Views/Screens/HomeScreenView.struct.swift diff --git a/App/Views/Screens/ProductsScreenView.swift b/App/Views/Screens/ProductsScreenView.struct.swift similarity index 100% rename from App/Views/Screens/ProductsScreenView.swift rename to App/Views/Screens/ProductsScreenView.struct.swift diff --git a/App/Views/Screens/ScreenWrapper.swift b/App/Views/Screens/ScreenWrapper.struct.swift similarity index 100% rename from App/Views/Screens/ScreenWrapper.swift rename to App/Views/Screens/ScreenWrapper.struct.swift diff --git a/App/Views/Screens/SettingsScreenView.swift b/App/Views/Screens/SettingsScreenView.struct.swift similarity index 100% rename from App/Views/Screens/SettingsScreenView.swift rename to App/Views/Screens/SettingsScreenView.struct.swift diff --git a/App/Views/Screens/SplashScreenView.swift b/App/Views/Screens/SplashScreenView.struct.swift similarity index 100% rename from App/Views/Screens/SplashScreenView.swift rename to App/Views/Screens/SplashScreenView.struct.swift diff --git a/App/Views/ToolBar/DetailsToolbarView.swift b/App/Views/ToolBar/DetailsToolbarView.struct.swift similarity index 100% rename from App/Views/ToolBar/DetailsToolbarView.swift rename to App/Views/ToolBar/DetailsToolbarView.struct.swift diff --git a/App/Views/ToolBar/ToolbarView.swift b/App/Views/ToolBar/ToolbarView.struct.swift similarity index 100% rename from App/Views/ToolBar/ToolbarView.swift rename to App/Views/ToolBar/ToolbarView.struct.swift diff --git a/Core/DI/DependenciesInitialization.swift b/Core/DI/DependenciesInitialization.struct.swift similarity index 100% rename from Core/DI/DependenciesInitialization.swift rename to Core/DI/DependenciesInitialization.struct.swift diff --git a/Core/Presentation/Views/LoadingView.swift b/Core/Presentation/Views/LoadingView.struct.swift similarity index 100% rename from Core/Presentation/Views/LoadingView.swift rename to Core/Presentation/Views/LoadingView.struct.swift diff --git a/Core/Presentation/Views/RatingConverter.swift b/Core/Presentation/Views/RatingConverter.struct.swift similarity index 100% rename from Core/Presentation/Views/RatingConverter.swift rename to Core/Presentation/Views/RatingConverter.struct.swift diff --git a/Core/Presentation/Views/RemoteImageLoader.swift b/Core/Presentation/Views/RemoteImageLoader.swift index 049bcf7..c26f088 100644 --- a/Core/Presentation/Views/RemoteImageLoader.swift +++ b/Core/Presentation/Views/RemoteImageLoader.swift @@ -21,60 +21,3 @@ class RemoteImageLoader: ObservableObject { cancellable?.cancel() } } - -struct RemoteImageView: View { - @StateObject var imageLoader = RemoteImageLoader() - let urlString: String - let width: CGFloat? - let height: CGFloat? - let contentMode: ContentMode - let showBorder: Bool - - init( - urlString: String, - width: CGFloat? = nil, - height: CGFloat? = nil, - contentMode: ContentMode = .fit, - showBorder: Bool = true - ) { - self.urlString = urlString - self.width = width - self.height = height - self.contentMode = contentMode - self.showBorder = showBorder - } - - var body: some View { - ZStack { - if let uiImage = UIImage(data: imageLoader.imageData) { - Image(uiImage: uiImage) - .resizable() - .aspectRatio(contentMode: contentMode) - .frame(width: width, height: height) - .cornerRadius(5) - .overlay( - showBorder ? - RoundedRectangle(cornerRadius: 10) - .stroke(Color.gray.opacity(0.5), lineWidth: 1) : nil - ) - } else { - Rectangle() - .fill(Color.gray.opacity(0.3)) - .frame(width: width, height: height) - .cornerRadius(5) - - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .scaleEffect(1.5, anchor: .center) - .padding() - } - } - .onAppear { - imageLoader.loadImage(from: urlString) - } - .onDisappear { - imageLoader.cancel() - } - .clipped() - } -} diff --git a/Core/Presentation/Views/RemoteImageView.struct.swift b/Core/Presentation/Views/RemoteImageView.struct.swift new file mode 100644 index 0000000..e045a02 --- /dev/null +++ b/Core/Presentation/Views/RemoteImageView.struct.swift @@ -0,0 +1,59 @@ +import Foundation +import SwiftUI + +struct RemoteImageView: View { + @StateObject var imageLoader = RemoteImageLoader() + let urlString: String + let width: CGFloat? + let height: CGFloat? + let contentMode: ContentMode + let showBorder: Bool + + init( + urlString: String, + width: CGFloat? = nil, + height: CGFloat? = nil, + contentMode: ContentMode = .fit, + showBorder: Bool = true + ) { + self.urlString = urlString + self.width = width + self.height = height + self.contentMode = contentMode + self.showBorder = showBorder + } + + var body: some View { + ZStack { + if let uiImage = UIImage(data: imageLoader.imageData) { + Image(uiImage: uiImage) + .resizable() + .aspectRatio(contentMode: contentMode) + .frame(width: width, height: height) + .cornerRadius(5) + .overlay( + showBorder ? + RoundedRectangle(cornerRadius: 10) + .stroke(Color.gray.opacity(0.5), lineWidth: 1) : nil + ) + } else { + Rectangle() + .fill(Color.gray.opacity(0.3)) + .frame(width: width, height: height) + .cornerRadius(5) + + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .scaleEffect(1.5, anchor: .center) + .padding() + } + } + .onAppear { + imageLoader.loadImage(from: urlString) + } + .onDisappear { + imageLoader.cancel() + } + .clipped() + } +} diff --git a/Core/Utils/AppConvigVariables.swift b/Core/Utils/AppConvigVariables.struct.swift similarity index 100% rename from Core/Utils/AppConvigVariables.swift rename to Core/Utils/AppConvigVariables.struct.swift diff --git a/Feature/Cart/Data/Model/ProductCartItemDto.swift b/Feature/Cart/Data/Model/ProductCartItem.struct.swift similarity index 100% rename from Feature/Cart/Data/Model/ProductCartItemDto.swift rename to Feature/Cart/Data/Model/ProductCartItem.struct.swift diff --git a/Feature/Cart/Presentation/View/CartListItemView.swift b/Feature/Cart/Presentation/View/CartListItemView.struct.swift similarity index 100% rename from Feature/Cart/Presentation/View/CartListItemView.swift rename to Feature/Cart/Presentation/View/CartListItemView.struct.swift diff --git a/Feature/Cart/Presentation/View/CartListView.swift b/Feature/Cart/Presentation/View/CartListView.struct.swift similarity index 100% rename from Feature/Cart/Presentation/View/CartListView.swift rename to Feature/Cart/Presentation/View/CartListView.struct.swift diff --git a/Feature/Home/Model/ImageItem.swift b/Feature/Home/Model/ImageItem.struct.swift similarity index 100% rename from Feature/Home/Model/ImageItem.swift rename to Feature/Home/Model/ImageItem.struct.swift diff --git a/Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.swift b/Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.struct.swift similarity index 100% rename from Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.swift rename to Feature/Home/Presentation/View/ListDiscoverProducts/ListDiscoverProductsView.struct.swift diff --git a/Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.swift b/Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.struct.swift similarity index 100% rename from Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.swift rename to Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.struct.swift diff --git a/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.swift b/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift similarity index 100% rename from Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.swift rename to Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift diff --git a/Feature/Home/Presentation/View/SectionHeaderView.swift b/Feature/Home/Presentation/View/SectionHeaderView.struct.swift similarity index 100% rename from Feature/Home/Presentation/View/SectionHeaderView.swift rename to Feature/Home/Presentation/View/SectionHeaderView.struct.swift diff --git a/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift b/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.struct.swift similarity index 100% rename from Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.swift rename to Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.struct.swift diff --git a/Feature/Product/Data/Model/Product.swift b/Feature/Product/Data/Model/Product.struct.swift similarity index 100% rename from Feature/Product/Data/Model/Product.swift rename to Feature/Product/Data/Model/Product.struct.swift diff --git a/Feature/Product/Data/Model/RecommendedProduct.swift b/Feature/Product/Data/Model/RecommendedProduct.struct.swift similarity index 100% rename from Feature/Product/Data/Model/RecommendedProduct.swift rename to Feature/Product/Data/Model/RecommendedProduct.struct.swift diff --git a/Feature/Product/Presentation/View/ProductListItemView.swift b/Feature/Product/Presentation/View/ProductListItemView.struct.swift similarity index 100% rename from Feature/Product/Presentation/View/ProductListItemView.swift rename to Feature/Product/Presentation/View/ProductListItemView.struct.swift diff --git a/Feature/Search/Data/Model/SearchCategory.swift b/Feature/Search/Data/Model/SearchCategory.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchCategory.swift rename to Feature/Search/Data/Model/SearchCategory.struct.swift diff --git a/Feature/Search/Data/Model/SearchFashionColor.swift b/Feature/Search/Data/Model/SearchFashionColor.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchFashionColor.swift rename to Feature/Search/Data/Model/SearchFashionColor.struct.swift diff --git a/Feature/Search/Data/Model/SearchFashionSize.swift b/Feature/Search/Data/Model/SearchFashionSize.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchFashionSize.swift rename to Feature/Search/Data/Model/SearchFashionSize.struct.swift diff --git a/Feature/Search/Data/Model/SearchFilter.swift b/Feature/Search/Data/Model/SearchFilter.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchFilter.swift rename to Feature/Search/Data/Model/SearchFilter.struct.swift diff --git a/Feature/Search/Data/Model/SearchIndustrialFilters.swift b/Feature/Search/Data/Model/SearchIndustrialFilters.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchIndustrialFilters.swift rename to Feature/Search/Data/Model/SearchIndustrialFilters.struct.swift diff --git a/Feature/Search/Data/Model/SearchPriceRange.swift b/Feature/Search/Data/Model/SearchPriceRange.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchPriceRange.swift rename to Feature/Search/Data/Model/SearchPriceRange.struct.swift diff --git a/Feature/Search/Data/Model/SearchProduct.swift b/Feature/Search/Data/Model/SearchProduct.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchProduct.swift rename to Feature/Search/Data/Model/SearchProduct.struct.swift diff --git a/Feature/Search/Data/Model/SearchProductResponse.swift b/Feature/Search/Data/Model/SearchProductResponse.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchProductResponse.swift rename to Feature/Search/Data/Model/SearchProductResponse.struct.swift diff --git a/Feature/Search/Data/Model/SearchQuery.swift b/Feature/Search/Data/Model/SearchQuery.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchQuery.swift rename to Feature/Search/Data/Model/SearchQuery.struct.swift diff --git a/Feature/Search/Data/Model/SearchRedirect.swift b/Feature/Search/Data/Model/SearchRedirect.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchRedirect.swift rename to Feature/Search/Data/Model/SearchRedirect.struct.swift diff --git a/Feature/Search/Data/Model/SearchSuggest.swift b/Feature/Search/Data/Model/SearchSuggest.struct.swift similarity index 100% rename from Feature/Search/Data/Model/SearchSuggest.swift rename to Feature/Search/Data/Model/SearchSuggest.struct.swift diff --git a/Feature/Search/Presentation/View/SearchResultView.swift b/Feature/Search/Presentation/View/SearchResultView.struct.swift similarity index 100% rename from Feature/Search/Presentation/View/SearchResultView.swift rename to Feature/Search/Presentation/View/SearchResultView.struct.swift diff --git a/Feature/Search/Presentation/View/SearchScreenView.swift b/Feature/Search/Presentation/View/SearchScreenView.struct.swift similarity index 100% rename from Feature/Search/Presentation/View/SearchScreenView.swift rename to Feature/Search/Presentation/View/SearchScreenView.struct.swift diff --git a/Feature/Settings/Presentation/View/SettingsErrroScreenView.swift b/Feature/Settings/Presentation/View/SettingsErrroScreenView.struct.swift similarity index 100% rename from Feature/Settings/Presentation/View/SettingsErrroScreenView.swift rename to Feature/Settings/Presentation/View/SettingsErrroScreenView.struct.swift diff --git a/Feature/Settings/Presentation/View/SettingsInputCodeView.swift b/Feature/Settings/Presentation/View/SettingsInputCodeView.struct.swift similarity index 100% rename from Feature/Settings/Presentation/View/SettingsInputCodeView.swift rename to Feature/Settings/Presentation/View/SettingsInputCodeView.struct.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 36cc3bc..d030f7f 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -8,35 +8,36 @@ /* Begin PBXBuildFile section */ 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */; }; - 752F1D3A2C41E01D002D4AC3 /* ProductCartItemDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */; }; + 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D392C41E01D002D4AC3 /* ProductCartItem.struct.swift */; }; 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */; }; 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */; }; 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */; }; 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */; }; - 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.swift */; }; - 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchProductResponse.swift */; }; - 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */; }; - 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */; }; - 75674CDC2C3C1A67007FAB88 /* ListDiscoverProductsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.swift */; }; - 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */; }; + 752F1D492C459680002D4AC3 /* SearchScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.struct.swift */; }; + 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4A2C46A363002D4AC3 /* SearchProductResponse.struct.swift */; }; + 752F1D4D2C46E165002D4AC3 /* SearchResultView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D4C2C46E165002D4AC3 /* SearchResultView.struct.swift */; }; + 7559449F2C357E5C00C274C9 /* SplashScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.struct.swift */; }; + 75674CDC2C3C1A67007FAB88 /* ListDiscoverProductsView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.struct.swift */; }; + 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift */; }; 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; - 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */; }; - 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */; }; + 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.struct.swift */; }; + 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift */; }; 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */; }; - 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D022C3DA14F007FAB88 /* RatingConverter.swift */; }; - 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */; }; - 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */; }; + 75674D032C3DA14F007FAB88 /* RatingConverter.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D022C3DA14F007FAB88 /* RatingConverter.struct.swift */; }; + 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.struct.swift */; }; + 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.struct.swift */; }; 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */; }; - 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4282C38593800AAC175 /* ToolbarView.swift */; }; + 75A3F4292C38593800AAC175 /* ToolbarView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4282C38593800AAC175 /* ToolbarView.struct.swift */; }; 75A4D5AE2C579A3F00929368 /* SDKManagingProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */; }; 75A4D5B22C579A4900929368 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D5B12C579A4900929368 /* SdkManager.swift */; }; - 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* DemoStoreApp.swift */; }; - 75B935592C3564360063E814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.swift */; }; + 75A4D60F2C5CD84800929368 /* RemoteImageView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D60D2C5CD80500929368 /* RemoteImageView.struct.swift */; }; + 75B935572C3564360063E814 /* DemoStoreApp.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* DemoStoreApp.struct.swift */; }; + 75B935592C3564360063E814 /* ContentView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.struct.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355D2C3564370063E814 /* Preview Assets.xcassets */; }; - 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */; }; - 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.swift */; }; - 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */; }; + 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */; }; + 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */; }; + 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */; }; 75E979862C4935170081B069 /* Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 75E979852C4935170081B069 /* Core.h */; settings = {ATTRIBUTES = (Public, ); }; }; 75E979892C4935170081B069 /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979832C4935170081B069 /* Core.framework */; }; 75E9798A2C4935170081B069 /* Core.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979832C4935170081B069 /* Core.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -45,72 +46,72 @@ 75E9799A2C49561B0081B069 /* Feature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 75E979932C49561B0081B069 /* Feature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979C62C496E1C0081B069 /* HomeResolver.swift */; }; 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979CB2C4973DA0081B069 /* CartResolver.swift */; }; - 75E979D02C4974440081B069 /* CartListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979CF2C4974440081B069 /* CartListView.swift */; }; - 75E979D42C4974660081B069 /* CartListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979D32C4974660081B069 /* CartListItemView.swift */; }; + 75E979D02C4974440081B069 /* CartListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979CF2C4974440081B069 /* CartListView.struct.swift */; }; + 75E979D42C4974660081B069 /* CartListItemView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979D32C4974660081B069 /* CartListItemView.struct.swift */; }; 75E979DE2C4ADDD20081B069 /* RootScreenType.enum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979DD2C4ADDD20081B069 /* RootScreenType.enum.swift */; }; - 75E979E72C4AE8870081B069 /* TabItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979E62C4AE8870081B069 /* TabItem.swift */; }; + 75E979E72C4AE8870081B069 /* TabItem.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979E62C4AE8870081B069 /* TabItem.struct.swift */; }; 75E979ED2C4D2BAE0081B069 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979EC2C4D2BAE0081B069 /* AppState.swift */; }; 75E979F12C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; 75E979F72C4D37940081B069 /* ViewState.enum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F62C4D37940081B069 /* ViewState.enum.swift */; }; - 75E97A172C501B120081B069 /* ScreenWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A162C501B120081B069 /* ScreenWrapper.swift */; }; - 75E97A1C2C501D660081B069 /* ScreenTypeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A1A2C501D660081B069 /* ScreenTypeProvider.swift */; }; - 75E97A232C5023600081B069 /* SearchFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.swift */; }; - 75E97A242C5023600081B069 /* SearchFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.swift */; }; - 75E97A252C5023600081B069 /* SearchFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.swift */; }; - 75E97A272C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */; }; - 75E97A282C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */; }; - 75E97A292C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */; }; - 75E97A2B2C5023960081B069 /* SearchFashionSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */; }; - 75E97A2C2C5023960081B069 /* SearchFashionSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */; }; - 75E97A2D2C5023960081B069 /* SearchFashionSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */; }; - 75E97A2F2C5023B10081B069 /* SearchFashionColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */; }; - 75E97A302C5023B10081B069 /* SearchFashionColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */; }; - 75E97A312C5023B10081B069 /* SearchFashionColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */; }; - 75E97A392C5024CD0081B069 /* SearchProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.swift */; }; - 75E97A3A2C5024CD0081B069 /* SearchProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.swift */; }; - 75E97A3B2C5024CD0081B069 /* SearchProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.swift */; }; - 75E97A3D2C5024EF0081B069 /* SearchRedirect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */; }; - 75E97A3E2C5024EF0081B069 /* SearchRedirect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */; }; - 75E97A3F2C5024EF0081B069 /* SearchRedirect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */; }; - 75E97A412C5025080081B069 /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A402C5025080081B069 /* SearchCategory.swift */; }; - 75E97A422C5025080081B069 /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A402C5025080081B069 /* SearchCategory.swift */; }; - 75E97A432C5025080081B069 /* SearchCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A402C5025080081B069 /* SearchCategory.swift */; }; - 75E97A452C5025240081B069 /* SearchQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A442C5025240081B069 /* SearchQuery.swift */; }; - 75E97A462C5025240081B069 /* SearchQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A442C5025240081B069 /* SearchQuery.swift */; }; - 75E97A472C5025240081B069 /* SearchQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A442C5025240081B069 /* SearchQuery.swift */; }; - 75E97A492C50253A0081B069 /* SearchSuggest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A482C50253A0081B069 /* SearchSuggest.swift */; }; - 75E97A4A2C50253A0081B069 /* SearchSuggest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A482C50253A0081B069 /* SearchSuggest.swift */; }; - 75E97A4B2C50253A0081B069 /* SearchSuggest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A482C50253A0081B069 /* SearchSuggest.swift */; }; - 75E97A4D2C50255A0081B069 /* SearchPriceRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */; }; - 75E97A4E2C50255A0081B069 /* SearchPriceRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */; }; - 75E97A4F2C50255A0081B069 /* SearchPriceRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */; }; + 75E97A172C501B120081B069 /* ScreenWrapper.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A162C501B120081B069 /* ScreenWrapper.struct.swift */; }; + 75E97A1C2C501D660081B069 /* ScreenTypeProviderProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A1A2C501D660081B069 /* ScreenTypeProviderProtocol.swift */; }; + 75E97A232C5023600081B069 /* SearchFilter.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.struct.swift */; }; + 75E97A242C5023600081B069 /* SearchFilter.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.struct.swift */; }; + 75E97A252C5023600081B069 /* SearchFilter.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.struct.swift */; }; + 75E97A272C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A262C50237F0081B069 /* SearchIndustrialFilters.struct.swift */; }; + 75E97A282C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A262C50237F0081B069 /* SearchIndustrialFilters.struct.swift */; }; + 75E97A292C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A262C50237F0081B069 /* SearchIndustrialFilters.struct.swift */; }; + 75E97A2B2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2A2C5023960081B069 /* SearchFashionSize.struct.swift */; }; + 75E97A2C2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2A2C5023960081B069 /* SearchFashionSize.struct.swift */; }; + 75E97A2D2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2A2C5023960081B069 /* SearchFashionSize.struct.swift */; }; + 75E97A2F2C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.struct.swift */; }; + 75E97A302C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.struct.swift */; }; + 75E97A312C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A2E2C5023B10081B069 /* SearchFashionColor.struct.swift */; }; + 75E97A392C5024CD0081B069 /* SearchProduct.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.struct.swift */; }; + 75E97A3A2C5024CD0081B069 /* SearchProduct.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.struct.swift */; }; + 75E97A3B2C5024CD0081B069 /* SearchProduct.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A382C5024CD0081B069 /* SearchProduct.struct.swift */; }; + 75E97A3D2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A3C2C5024EF0081B069 /* SearchRedirect.struct.swift */; }; + 75E97A3E2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A3C2C5024EF0081B069 /* SearchRedirect.struct.swift */; }; + 75E97A3F2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A3C2C5024EF0081B069 /* SearchRedirect.struct.swift */; }; + 75E97A412C5025080081B069 /* SearchCategory.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A402C5025080081B069 /* SearchCategory.struct.swift */; }; + 75E97A422C5025080081B069 /* SearchCategory.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A402C5025080081B069 /* SearchCategory.struct.swift */; }; + 75E97A432C5025080081B069 /* SearchCategory.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A402C5025080081B069 /* SearchCategory.struct.swift */; }; + 75E97A452C5025240081B069 /* SearchQuery.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A442C5025240081B069 /* SearchQuery.struct.swift */; }; + 75E97A462C5025240081B069 /* SearchQuery.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A442C5025240081B069 /* SearchQuery.struct.swift */; }; + 75E97A472C5025240081B069 /* SearchQuery.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A442C5025240081B069 /* SearchQuery.struct.swift */; }; + 75E97A492C50253A0081B069 /* SearchSuggest.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A482C50253A0081B069 /* SearchSuggest.struct.swift */; }; + 75E97A4A2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A482C50253A0081B069 /* SearchSuggest.struct.swift */; }; + 75E97A4B2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A482C50253A0081B069 /* SearchSuggest.struct.swift */; }; + 75E97A4D2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.struct.swift */; }; + 75E97A4E2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.struct.swift */; }; + 75E97A4F2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A4C2C50255A0081B069 /* SearchPriceRange.struct.swift */; }; 75E97A5A2C502DBF0081B069 /* SearchProductResponseMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A342C5024280081B069 /* SearchProductResponseMapper.swift */; }; - 75E97A5F2C502F3C0081B069 /* Product.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Product.swift */; }; + 75E97A5F2C502F3C0081B069 /* Product.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF42C3D92CC007FAB88 /* Product.struct.swift */; }; 75E97A642C50320F0081B069 /* RecommendedProductMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */; }; - 75E97A652C50320F0081B069 /* RecommendedProduct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */; }; - 75E97A6B2C5037130081B069 /* MainViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A6A2C5037130081B069 /* MainViews.swift */; }; - 75E97A712C5041920081B069 /* ImageItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A6F2C5041780081B069 /* ImageItem.swift */; }; - 75E97A782C512F8C0081B069 /* DependenciesInitialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A772C512F8C0081B069 /* DependenciesInitialization.swift */; }; - 75E97A822C5133AD0081B069 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.swift */; }; - 75E97A832C5133AD0081B069 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.swift */; }; - 75E97A842C5133AD0081B069 /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.swift */; }; + 75E97A652C50320F0081B069 /* RecommendedProduct.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF62C3D92E0007FAB88 /* RecommendedProduct.struct.swift */; }; + 75E97A6B2C5037130081B069 /* MainViews.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A6A2C5037130081B069 /* MainViews.struct.swift */; }; + 75E97A712C5041920081B069 /* ImageItem.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A6F2C5041780081B069 /* ImageItem.struct.swift */; }; + 75E97A782C512F8C0081B069 /* DependenciesInitialization.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A772C512F8C0081B069 /* DependenciesInitialization.struct.swift */; }; + 75E97A822C5133AD0081B069 /* LoadingView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */; }; + 75E97A832C5133AD0081B069 /* LoadingView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */; }; + 75E97A842C5133AD0081B069 /* LoadingView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */; }; 75E97A882C51414D0081B069 /* CartRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A872C51414D0081B069 /* CartRepositoryProtocol.swift */; }; 75E97A8D2C5142F10081B069 /* ProductsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A8C2C5142F10081B069 /* ProductsViewModel.swift */; }; 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A912C5143630081B069 /* ProductsResolver.swift */; }; 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA12C5147A20081B069 /* SdkResolver.swift */; }; 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA42C5147F30081B069 /* HomeViewModel.swift */; }; 75E97AAC2C514B4D0081B069 /* SearchResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAB2C514B4D0081B069 /* SearchResolver.swift */; }; - 75E97AB02C514D2D0081B069 /* AppConvigVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */; }; - 75E97AB12C514D2D0081B069 /* AppConvigVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */; }; - 75E97AB22C514D2D0081B069 /* AppConvigVariables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */; }; - 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */; }; - 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */; }; - 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */; }; - 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */; }; + 75E97AB02C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.struct.swift */; }; + 75E97AB12C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.struct.swift */; }; + 75E97AB22C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AAF2C514D2D0081B069 /* AppConvigVariables.struct.swift */; }; + 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.struct.swift */; }; + 75ECCD102C36BE2000D6D346 /* ProductsScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.struct.swift */; }; + 75ECCD122C36BE2D00D6D346 /* CartScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD112C36BE2D00D6D346 /* CartScreenView.struct.swift */; }; + 75ECCD142C36BE4300D6D346 /* SettingsScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD132C36BE4300D6D346 /* SettingsScreenView.struct.swift */; }; 75ECCD172C36D6D000D6D346 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */; }; - 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD192C36F94800D6D346 /* BottomBarView.swift */; }; + 75ECCD1A2C36F94800D6D346 /* BottomBarView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ECCD192C36F94800D6D346 /* BottomBarView.struct.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -147,83 +148,84 @@ /* Begin PBXFileReference section */ 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCartItemDto.swift; sourceTree = ""; }; + 752F1D392C41E01D002D4AC3 /* ProductCartItem.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCartItem.struct.swift; sourceTree = ""; }; 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepository.swift; sourceTree = ""; }; 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetRecommendationsUseCase.swift; sourceTree = ""; }; 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; - 752F1D482C459680002D4AC3 /* SearchScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.swift; sourceTree = ""; }; - 752F1D4A2C46A363002D4AC3 /* SearchProductResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchProductResponse.swift; sourceTree = ""; }; - 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; - 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.swift; sourceTree = ""; }; - 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDiscoverProductsView.swift; sourceTree = ""; }; - 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStoriesContainerView.swift; sourceTree = ""; }; + 752F1D482C459680002D4AC3 /* SearchScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.struct.swift; sourceTree = ""; }; + 752F1D4A2C46A363002D4AC3 /* SearchProductResponse.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchProductResponse.struct.swift; sourceTree = ""; }; + 752F1D4C2C46E165002D4AC3 /* SearchResultView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.struct.swift; sourceTree = ""; }; + 7559449E2C357E5C00C274C9 /* SplashScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.struct.swift; sourceTree = ""; }; + 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDiscoverProductsView.struct.swift; sourceTree = ""; }; + 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStoriesContainerView.struct.swift; sourceTree = ""; }; 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; - 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.swift; sourceTree = ""; }; - 75674CF42C3D92CC007FAB88 /* Product.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Product.swift; sourceTree = ""; }; - 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProduct.swift; sourceTree = ""; }; + 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.struct.swift; sourceTree = ""; }; + 75674CF42C3D92CC007FAB88 /* Product.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Product.struct.swift; sourceTree = ""; }; + 75674CF62C3D92E0007FAB88 /* RecommendedProduct.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProduct.struct.swift; sourceTree = ""; }; 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; - 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortRecommendationListView.swift; sourceTree = ""; }; + 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortRecommendationListView.struct.swift; sourceTree = ""; }; 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageLoader.swift; sourceTree = ""; }; - 75674D022C3DA14F007FAB88 /* RatingConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingConverter.swift; sourceTree = ""; }; + 75674D022C3DA14F007FAB88 /* RatingConverter.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingConverter.struct.swift; sourceTree = ""; }; 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.swift; sourceTree = ""; }; - 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrroScreenView.swift; sourceTree = ""; }; + 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.struct.swift; sourceTree = ""; }; + 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrroScreenView.struct.swift; sourceTree = ""; }; 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationManager.swift; sourceTree = ""; }; - 75A3F4282C38593800AAC175 /* ToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarView.swift; sourceTree = ""; }; + 75A3F4282C38593800AAC175 /* ToolbarView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarView.struct.swift; sourceTree = ""; }; 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKManagingProtocol.swift; sourceTree = ""; }; 75A4D5B12C579A4900929368 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; + 75A4D60D2C5CD80500929368 /* RemoteImageView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageView.struct.swift; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 75B935562C3564360063E814 /* DemoStoreApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.swift; sourceTree = ""; }; - 75B935582C3564360063E814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 75B935562C3564360063E814 /* DemoStoreApp.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.struct.swift; sourceTree = ""; }; + 75B935582C3564360063E814 /* ContentView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.struct.swift; sourceTree = ""; }; 75B9355A2C3564370063E814 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 75B9355D2C3564370063E814 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.swift; sourceTree = ""; }; - 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbarView.swift; sourceTree = ""; }; - 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.swift; sourceTree = ""; }; + 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.struct.swift; sourceTree = ""; }; + 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbarView.struct.swift; sourceTree = ""; }; + 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.struct.swift; sourceTree = ""; }; 75E979832C4935170081B069 /* Core.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Core.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 75E979852C4935170081B069 /* Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Core.h; sourceTree = ""; }; 75E979932C49561B0081B069 /* Feature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Feature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 75E979952C49561B0081B069 /* Feature.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Feature.h; sourceTree = ""; }; 75E979C62C496E1C0081B069 /* HomeResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeResolver.swift; sourceTree = ""; }; 75E979CB2C4973DA0081B069 /* CartResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartResolver.swift; sourceTree = ""; }; - 75E979CF2C4974440081B069 /* CartListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartListView.swift; sourceTree = ""; }; - 75E979D32C4974660081B069 /* CartListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartListItemView.swift; sourceTree = ""; }; + 75E979CF2C4974440081B069 /* CartListView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartListView.struct.swift; sourceTree = ""; }; + 75E979D32C4974660081B069 /* CartListItemView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartListItemView.struct.swift; sourceTree = ""; }; 75E979DD2C4ADDD20081B069 /* RootScreenType.enum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootScreenType.enum.swift; sourceTree = ""; }; - 75E979E62C4AE8870081B069 /* TabItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabItem.swift; sourceTree = ""; }; + 75E979E62C4AE8870081B069 /* TabItem.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabItem.struct.swift; sourceTree = ""; }; 75E979EC2C4D2BAE0081B069 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = ""; }; 75E979F02C4D2DBE0081B069 /* Timer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; 75E979F62C4D37940081B069 /* ViewState.enum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewState.enum.swift; sourceTree = ""; }; - 75E97A162C501B120081B069 /* ScreenWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenWrapper.swift; sourceTree = ""; }; - 75E97A1A2C501D660081B069 /* ScreenTypeProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenTypeProvider.swift; sourceTree = ""; }; - 75E97A222C5023600081B069 /* SearchFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFilter.swift; sourceTree = ""; }; - 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchIndustrialFilters.swift; sourceTree = ""; }; - 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFashionSize.swift; sourceTree = ""; }; - 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFashionColor.swift; sourceTree = ""; }; + 75E97A162C501B120081B069 /* ScreenWrapper.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenWrapper.struct.swift; sourceTree = ""; }; + 75E97A1A2C501D660081B069 /* ScreenTypeProviderProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenTypeProviderProtocol.swift; sourceTree = ""; }; + 75E97A222C5023600081B069 /* SearchFilter.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFilter.struct.swift; sourceTree = ""; }; + 75E97A262C50237F0081B069 /* SearchIndustrialFilters.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchIndustrialFilters.struct.swift; sourceTree = ""; }; + 75E97A2A2C5023960081B069 /* SearchFashionSize.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFashionSize.struct.swift; sourceTree = ""; }; + 75E97A2E2C5023B10081B069 /* SearchFashionColor.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFashionColor.struct.swift; sourceTree = ""; }; 75E97A342C5024280081B069 /* SearchProductResponseMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchProductResponseMapper.swift; sourceTree = ""; }; - 75E97A382C5024CD0081B069 /* SearchProduct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchProduct.swift; sourceTree = ""; }; - 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRedirect.swift; sourceTree = ""; }; - 75E97A402C5025080081B069 /* SearchCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCategory.swift; sourceTree = ""; }; - 75E97A442C5025240081B069 /* SearchQuery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchQuery.swift; sourceTree = ""; }; - 75E97A482C50253A0081B069 /* SearchSuggest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSuggest.swift; sourceTree = ""; }; - 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPriceRange.swift; sourceTree = ""; }; - 75E97A6A2C5037130081B069 /* MainViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViews.swift; sourceTree = ""; }; - 75E97A6F2C5041780081B069 /* ImageItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageItem.swift; sourceTree = ""; }; - 75E97A772C512F8C0081B069 /* DependenciesInitialization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DependenciesInitialization.swift; sourceTree = ""; }; - 75E97A812C5133AD0081B069 /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = ""; }; + 75E97A382C5024CD0081B069 /* SearchProduct.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchProduct.struct.swift; sourceTree = ""; }; + 75E97A3C2C5024EF0081B069 /* SearchRedirect.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRedirect.struct.swift; sourceTree = ""; }; + 75E97A402C5025080081B069 /* SearchCategory.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCategory.struct.swift; sourceTree = ""; }; + 75E97A442C5025240081B069 /* SearchQuery.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchQuery.struct.swift; sourceTree = ""; }; + 75E97A482C50253A0081B069 /* SearchSuggest.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSuggest.struct.swift; sourceTree = ""; }; + 75E97A4C2C50255A0081B069 /* SearchPriceRange.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPriceRange.struct.swift; sourceTree = ""; }; + 75E97A6A2C5037130081B069 /* MainViews.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViews.struct.swift; sourceTree = ""; }; + 75E97A6F2C5041780081B069 /* ImageItem.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageItem.struct.swift; sourceTree = ""; }; + 75E97A772C512F8C0081B069 /* DependenciesInitialization.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DependenciesInitialization.struct.swift; sourceTree = ""; }; + 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.struct.swift; sourceTree = ""; }; 75E97A872C51414D0081B069 /* CartRepositoryProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepositoryProtocol.swift; sourceTree = ""; }; 75E97A8C2C5142F10081B069 /* ProductsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsViewModel.swift; sourceTree = ""; }; 75E97A912C5143630081B069 /* ProductsResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsResolver.swift; sourceTree = ""; }; 75E97AA12C5147A20081B069 /* SdkResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkResolver.swift; sourceTree = ""; }; 75E97AA42C5147F30081B069 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; 75E97AAB2C514B4D0081B069 /* SearchResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResolver.swift; sourceTree = ""; }; - 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppConvigVariables.swift; sourceTree = ""; }; - 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.swift; sourceTree = ""; }; - 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsScreenView.swift; sourceTree = ""; }; - 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.swift; sourceTree = ""; }; - 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenView.swift; sourceTree = ""; }; + 75E97AAF2C514D2D0081B069 /* AppConvigVariables.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppConvigVariables.struct.swift; sourceTree = ""; }; + 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenView.struct.swift; sourceTree = ""; }; + 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsScreenView.struct.swift; sourceTree = ""; }; + 75ECCD112C36BE2D00D6D346 /* CartScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartScreenView.struct.swift; sourceTree = ""; }; + 75ECCD132C36BE4300D6D346 /* SettingsScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenView.struct.swift; sourceTree = ""; }; 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; - 75ECCD192C36F94800D6D346 /* BottomBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomBarView.swift; sourceTree = ""; }; + 75ECCD192C36F94800D6D346 /* BottomBarView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomBarView.struct.swift; sourceTree = ""; }; 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_ios.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AC654F53174F1754F6E72BDB /* Pods-demo-store-ios.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.release.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.release.xcconfig"; sourceTree = ""; }; C20BDB80283375AFE665FF96 /* Pods-demo-store-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-demo-store-ios.debug.xcconfig"; path = "Target Support Files/Pods-demo-store-ios/Pods-demo-store-ios.debug.xcconfig"; sourceTree = ""; }; @@ -261,7 +263,7 @@ 75674CEA2C3D2E32007FAB88 /* Stories */ = { isa = PBXGroup; children = ( - 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.swift */, + 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift */, 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */, ); path = Stories; @@ -270,7 +272,7 @@ 75674CEC2C3D2E45007FAB88 /* ListDiscoverProducts */ = { isa = PBXGroup; children = ( - 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.swift */, + 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.struct.swift */, ); path = ListDiscoverProducts; sourceTree = ""; @@ -278,8 +280,8 @@ 75674CF02C3D787A007FAB88 /* ListRecommendation */ = { isa = PBXGroup; children = ( - 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.swift */, - 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.swift */, + 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift */, + 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */, ); path = ListRecommendation; sourceTree = ""; @@ -288,7 +290,7 @@ isa = PBXGroup; children = ( 75E979F02C4D2DBE0081B069 /* Timer.swift */, - 75E97AAF2C514D2D0081B069 /* AppConvigVariables.swift */, + 75E97AAF2C514D2D0081B069 /* AppConvigVariables.struct.swift */, ); path = Utils; sourceTree = ""; @@ -332,7 +334,7 @@ 75ECCD182C36F92A00D6D346 /* Navigation */, 75E97A112C50199F0081B069 /* Models */, 75B9355C2C3564370063E814 /* Preview Content */, - 75B935562C3564360063E814 /* DemoStoreApp.swift */, + 75B935562C3564360063E814 /* DemoStoreApp.struct.swift */, 75A3F4212C3828A400AAC175 /* Info.plist */, ); path = App; @@ -457,8 +459,8 @@ 75E979AF2C49586D0081B069 /* View */ = { isa = PBXGroup; children = ( - 752F1D482C459680002D4AC3 /* SearchScreenView.swift */, - 752F1D4C2C46E165002D4AC3 /* SearchResultView.swift */, + 752F1D482C459680002D4AC3 /* SearchScreenView.struct.swift */, + 752F1D4C2C46E165002D4AC3 /* SearchResultView.struct.swift */, ); path = View; sourceTree = ""; @@ -491,8 +493,8 @@ 75E979B32C4958B20081B069 /* View */ = { isa = PBXGroup; children = ( - 75E979CF2C4974440081B069 /* CartListView.swift */, - 75E979D32C4974660081B069 /* CartListItemView.swift */, + 75E979CF2C4974440081B069 /* CartListView.struct.swift */, + 75E979D32C4974660081B069 /* CartListItemView.struct.swift */, ); path = View; sourceTree = ""; @@ -525,7 +527,7 @@ 75E979B72C4959250081B069 /* View */ = { isa = PBXGroup; children = ( - 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.swift */, + 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.struct.swift */, 75674CEA2C3D2E32007FAB88 /* Stories */, 75674CF02C3D787A007FAB88 /* ListRecommendation */, 75674CEC2C3D2E45007FAB88 /* ListDiscoverProducts */, @@ -552,8 +554,8 @@ 75E979BF2C495A1B0081B069 /* View */ = { isa = PBXGroup; children = ( - 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.swift */, - 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.swift */, + 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.struct.swift */, + 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.struct.swift */, ); path = View; sourceTree = ""; @@ -569,7 +571,7 @@ 75E979C12C495B660081B069 /* Model */ = { isa = PBXGroup; children = ( - 752F1D392C41E01D002D4AC3 /* ProductCartItemDto.swift */, + 752F1D392C41E01D002D4AC3 /* ProductCartItem.struct.swift */, ); path = Model; sourceTree = ""; @@ -585,8 +587,8 @@ 75E979C32C495B7E0081B069 /* Model */ = { isa = PBXGroup; children = ( - 75674CF62C3D92E0007FAB88 /* RecommendedProduct.swift */, - 75674CF42C3D92CC007FAB88 /* Product.swift */, + 75674CF62C3D92E0007FAB88 /* RecommendedProduct.struct.swift */, + 75674CF42C3D92CC007FAB88 /* Product.struct.swift */, ); path = Model; sourceTree = ""; @@ -594,17 +596,17 @@ 75E979C42C495BAA0081B069 /* Model */ = { isa = PBXGroup; children = ( - 752F1D4A2C46A363002D4AC3 /* SearchProductResponse.swift */, - 75E97A222C5023600081B069 /* SearchFilter.swift */, - 75E97A262C50237F0081B069 /* SearchIndustrialFilters.swift */, - 75E97A2A2C5023960081B069 /* SearchFashionSize.swift */, - 75E97A2E2C5023B10081B069 /* SearchFashionColor.swift */, - 75E97A382C5024CD0081B069 /* SearchProduct.swift */, - 75E97A3C2C5024EF0081B069 /* SearchRedirect.swift */, - 75E97A402C5025080081B069 /* SearchCategory.swift */, - 75E97A442C5025240081B069 /* SearchQuery.swift */, - 75E97A482C50253A0081B069 /* SearchSuggest.swift */, - 75E97A4C2C50255A0081B069 /* SearchPriceRange.swift */, + 752F1D4A2C46A363002D4AC3 /* SearchProductResponse.struct.swift */, + 75E97A222C5023600081B069 /* SearchFilter.struct.swift */, + 75E97A262C50237F0081B069 /* SearchIndustrialFilters.struct.swift */, + 75E97A2A2C5023960081B069 /* SearchFashionSize.struct.swift */, + 75E97A2E2C5023B10081B069 /* SearchFashionColor.struct.swift */, + 75E97A382C5024CD0081B069 /* SearchProduct.struct.swift */, + 75E97A3C2C5024EF0081B069 /* SearchRedirect.struct.swift */, + 75E97A402C5025080081B069 /* SearchCategory.struct.swift */, + 75E97A442C5025240081B069 /* SearchQuery.struct.swift */, + 75E97A482C50253A0081B069 /* SearchSuggest.struct.swift */, + 75E97A4C2C50255A0081B069 /* SearchPriceRange.struct.swift */, ); path = Model; sourceTree = ""; @@ -620,8 +622,8 @@ 75E979E12C4AE4630081B069 /* Views */ = { isa = PBXGroup; children = ( - 75B935582C3564360063E814 /* ContentView.swift */, - 75E97A6A2C5037130081B069 /* MainViews.swift */, + 75B935582C3564360063E814 /* ContentView.struct.swift */, + 75E97A6A2C5037130081B069 /* MainViews.struct.swift */, 75E97A142C501A7D0081B069 /* Screens */, 75E97A152C501A930081B069 /* ToolBar */, 75E979E22C4AE4790081B069 /* BottomBar */, @@ -632,7 +634,7 @@ 75E979E22C4AE4790081B069 /* BottomBar */ = { isa = PBXGroup; children = ( - 75ECCD192C36F94800D6D346 /* BottomBarView.swift */, + 75ECCD192C36F94800D6D346 /* BottomBarView.struct.swift */, ); path = BottomBar; sourceTree = ""; @@ -640,7 +642,7 @@ 75E97A112C50199F0081B069 /* Models */ = { isa = PBXGroup; children = ( - 75E979E62C4AE8870081B069 /* TabItem.swift */, + 75E979E62C4AE8870081B069 /* TabItem.struct.swift */, 75E979DD2C4ADDD20081B069 /* RootScreenType.enum.swift */, 75E979F62C4D37940081B069 /* ViewState.enum.swift */, ); @@ -650,12 +652,12 @@ 75E97A142C501A7D0081B069 /* Screens */ = { isa = PBXGroup; children = ( - 7559449E2C357E5C00C274C9 /* SplashScreenView.swift */, - 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.swift */, - 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.swift */, - 75ECCD132C36BE4300D6D346 /* SettingsScreenView.swift */, - 75ECCD112C36BE2D00D6D346 /* CartScreenView.swift */, - 75E97A162C501B120081B069 /* ScreenWrapper.swift */, + 7559449E2C357E5C00C274C9 /* SplashScreenView.struct.swift */, + 75ECCD0A2C36BDF500D6D346 /* HomeScreenView.struct.swift */, + 75ECCD0F2C36BE2000D6D346 /* ProductsScreenView.struct.swift */, + 75ECCD132C36BE4300D6D346 /* SettingsScreenView.struct.swift */, + 75ECCD112C36BE2D00D6D346 /* CartScreenView.struct.swift */, + 75E97A162C501B120081B069 /* ScreenWrapper.struct.swift */, ); path = Screens; sourceTree = ""; @@ -663,8 +665,8 @@ 75E97A152C501A930081B069 /* ToolBar */ = { isa = PBXGroup; children = ( - 75A3F4282C38593800AAC175 /* ToolbarView.swift */, - 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.swift */, + 75A3F4282C38593800AAC175 /* ToolbarView.struct.swift */, + 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */, ); path = ToolBar; sourceTree = ""; @@ -672,7 +674,7 @@ 75E97A1B2C501D660081B069 /* Protocols */ = { isa = PBXGroup; children = ( - 75E97A1A2C501D660081B069 /* ScreenTypeProvider.swift */, + 75E97A1A2C501D660081B069 /* ScreenTypeProviderProtocol.swift */, ); path = Protocols; sourceTree = ""; @@ -698,7 +700,7 @@ 75E97A212C5020860081B069 /* View */ = { isa = PBXGroup; children = ( - 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.swift */, + 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */, ); path = View; sourceTree = ""; @@ -734,8 +736,9 @@ isa = PBXGroup; children = ( 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */, - 75674D022C3DA14F007FAB88 /* RatingConverter.swift */, - 75E97A812C5133AD0081B069 /* LoadingView.swift */, + 75A4D60D2C5CD80500929368 /* RemoteImageView.struct.swift */, + 75674D022C3DA14F007FAB88 /* RatingConverter.struct.swift */, + 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */, ); path = Views; sourceTree = ""; @@ -743,7 +746,7 @@ 75E97A6E2C5041660081B069 /* Model */ = { isa = PBXGroup; children = ( - 75E97A6F2C5041780081B069 /* ImageItem.swift */, + 75E97A6F2C5041780081B069 /* ImageItem.struct.swift */, ); path = Model; sourceTree = ""; @@ -817,7 +820,7 @@ 75ECCD1B2C37F09100D6D346 /* DI */ = { isa = PBXGroup; children = ( - 75E97A772C512F8C0081B069 /* DependenciesInitialization.swift */, + 75E97A772C512F8C0081B069 /* DependenciesInitialization.struct.swift */, 75E97AA12C5147A20081B069 /* SdkResolver.swift */, 75A4D5AC2C579A2100929368 /* Protocols */, ); @@ -1043,71 +1046,72 @@ 75E97AAC2C514B4D0081B069 /* SearchResolver.swift in Sources */, 75E97A642C50320F0081B069 /* RecommendedProductMapper.swift in Sources */, 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */, - 75E97A652C50320F0081B069 /* RecommendedProduct.swift in Sources */, - 752F1D3A2C41E01D002D4AC3 /* ProductCartItemDto.swift in Sources */, + 75A4D60F2C5CD84800929368 /* RemoteImageView.struct.swift in Sources */, + 75E97A652C50320F0081B069 /* RecommendedProduct.struct.swift in Sources */, + 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.struct.swift in Sources */, 75E97A8D2C5142F10081B069 /* ProductsViewModel.swift in Sources */, - 75E97A5F2C502F3C0081B069 /* Product.swift in Sources */, - 75E97A782C512F8C0081B069 /* DependenciesInitialization.swift in Sources */, + 75E97A5F2C502F3C0081B069 /* Product.struct.swift in Sources */, + 75E97A782C512F8C0081B069 /* DependenciesInitialization.struct.swift in Sources */, 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */, - 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.swift in Sources */, - 75674CDC2C3C1A67007FAB88 /* ListDiscoverProductsView.swift in Sources */, - 75ECCD1A2C36F94800D6D346 /* BottomBarView.swift in Sources */, - 752F1D4D2C46E165002D4AC3 /* SearchResultView.swift in Sources */, - 75E97A3D2C5024EF0081B069 /* SearchRedirect.swift in Sources */, - 75E97A452C5025240081B069 /* SearchQuery.swift in Sources */, - 75E97A412C5025080081B069 /* SearchCategory.swift in Sources */, - 75ECCD102C36BE2000D6D346 /* ProductsScreenView.swift in Sources */, - 75E97A492C50253A0081B069 /* SearchSuggest.swift in Sources */, - 75E97AB02C514D2D0081B069 /* AppConvigVariables.swift in Sources */, + 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.struct.swift in Sources */, + 75674CDC2C3C1A67007FAB88 /* ListDiscoverProductsView.struct.swift in Sources */, + 75ECCD1A2C36F94800D6D346 /* BottomBarView.struct.swift in Sources */, + 752F1D4D2C46E165002D4AC3 /* SearchResultView.struct.swift in Sources */, + 75E97A3D2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */, + 75E97A452C5025240081B069 /* SearchQuery.struct.swift in Sources */, + 75E97A412C5025080081B069 /* SearchCategory.struct.swift in Sources */, + 75ECCD102C36BE2000D6D346 /* ProductsScreenView.struct.swift in Sources */, + 75E97A492C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, + 75E97AB02C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, - 75E979E72C4AE8870081B069 /* TabItem.swift in Sources */, - 75E97A6B2C5037130081B069 /* MainViews.swift in Sources */, + 75E979E72C4AE8870081B069 /* TabItem.struct.swift in Sources */, + 75E97A6B2C5037130081B069 /* MainViews.struct.swift in Sources */, 75E97A882C51414D0081B069 /* CartRepositoryProtocol.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */, 75E979DE2C4ADDD20081B069 /* RootScreenType.enum.swift in Sources */, - 75E97A1C2C501D660081B069 /* ScreenTypeProvider.swift in Sources */, - 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.swift in Sources */, - 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.swift in Sources */, - 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.swift in Sources */, - 75E97A822C5133AD0081B069 /* LoadingView.swift in Sources */, + 75E97A1C2C501D660081B069 /* ScreenTypeProviderProtocol.swift in Sources */, + 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.struct.swift in Sources */, + 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift in Sources */, + 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.struct.swift in Sources */, + 75E97A822C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */, 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */, - 75E97A2F2C5023B10081B069 /* SearchFashionColor.swift in Sources */, - 75E97A172C501B120081B069 /* ScreenWrapper.swift in Sources */, - 75ECCD122C36BE2D00D6D346 /* CartScreenView.swift in Sources */, - 75A3F4292C38593800AAC175 /* ToolbarView.swift in Sources */, - 75B935592C3564360063E814 /* ContentView.swift in Sources */, - 752F1D492C459680002D4AC3 /* SearchScreenView.swift in Sources */, - 75B935572C3564360063E814 /* DemoStoreApp.swift in Sources */, - 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.swift in Sources */, - 7559449F2C357E5C00C274C9 /* SplashScreenView.swift in Sources */, - 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.swift in Sources */, + 75E97A2F2C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */, + 75E97A172C501B120081B069 /* ScreenWrapper.struct.swift in Sources */, + 75ECCD122C36BE2D00D6D346 /* CartScreenView.struct.swift in Sources */, + 75A3F4292C38593800AAC175 /* ToolbarView.struct.swift in Sources */, + 75B935592C3564360063E814 /* ContentView.struct.swift in Sources */, + 752F1D492C459680002D4AC3 /* SearchScreenView.struct.swift in Sources */, + 75B935572C3564360063E814 /* DemoStoreApp.struct.swift in Sources */, + 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.struct.swift in Sources */, + 7559449F2C357E5C00C274C9 /* SplashScreenView.struct.swift in Sources */, + 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.struct.swift in Sources */, 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */, 75A4D5B22C579A4900929368 /* SdkManager.swift in Sources */, - 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.swift in Sources */, + 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.struct.swift in Sources */, 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */, - 75E97A232C5023600081B069 /* SearchFilter.swift in Sources */, + 75E97A232C5023600081B069 /* SearchFilter.struct.swift in Sources */, 75E97A5A2C502DBF0081B069 /* SearchProductResponseMapper.swift in Sources */, - 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.swift in Sources */, - 75E97A4D2C50255A0081B069 /* SearchPriceRange.swift in Sources */, + 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.struct.swift in Sources */, + 75E97A4D2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, 75E979F12C4D2DBE0081B069 /* Timer.swift in Sources */, 75E979F72C4D37940081B069 /* ViewState.enum.swift in Sources */, - 75E97A2B2C5023960081B069 /* SearchFashionSize.swift in Sources */, - 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.swift in Sources */, + 75E97A2B2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */, + 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift in Sources */, 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, - 75E97A272C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, - 75E979D02C4974440081B069 /* CartListView.swift in Sources */, + 75E97A272C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */, + 75E979D02C4974440081B069 /* CartListView.struct.swift in Sources */, 75A4D5AE2C579A3F00929368 /* SDKManagingProtocol.swift in Sources */, - 75E97A712C5041920081B069 /* ImageItem.swift in Sources */, - 75E979D42C4974660081B069 /* CartListItemView.swift in Sources */, - 75E97A392C5024CD0081B069 /* SearchProduct.swift in Sources */, - 75674D032C3DA14F007FAB88 /* RatingConverter.swift in Sources */, + 75E97A712C5041920081B069 /* ImageItem.struct.swift in Sources */, + 75E979D42C4974660081B069 /* CartListItemView.struct.swift in Sources */, + 75E97A392C5024CD0081B069 /* SearchProduct.struct.swift in Sources */, + 75674D032C3DA14F007FAB88 /* RatingConverter.struct.swift in Sources */, 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */, 75E979ED2C4D2BAE0081B069 /* AppState.swift in Sources */, - 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.swift in Sources */, + 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.struct.swift in Sources */, 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */, - 75ECCD142C36BE4300D6D346 /* SettingsScreenView.swift in Sources */, + 75ECCD142C36BE4300D6D346 /* SettingsScreenView.struct.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1115,19 +1119,19 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75E97A302C5023B10081B069 /* SearchFashionColor.swift in Sources */, - 75E97A3A2C5024CD0081B069 /* SearchProduct.swift in Sources */, - 75E97A4A2C50253A0081B069 /* SearchSuggest.swift in Sources */, + 75E97A302C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */, + 75E97A3A2C5024CD0081B069 /* SearchProduct.struct.swift in Sources */, + 75E97A4A2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */, - 75E97A422C5025080081B069 /* SearchCategory.swift in Sources */, - 75E97A832C5133AD0081B069 /* LoadingView.swift in Sources */, - 75E97A242C5023600081B069 /* SearchFilter.swift in Sources */, - 75E97A3E2C5024EF0081B069 /* SearchRedirect.swift in Sources */, - 75E97A4E2C50255A0081B069 /* SearchPriceRange.swift in Sources */, - 75E97AB12C514D2D0081B069 /* AppConvigVariables.swift in Sources */, - 75E97A282C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, - 75E97A2C2C5023960081B069 /* SearchFashionSize.swift in Sources */, - 75E97A462C5025240081B069 /* SearchQuery.swift in Sources */, + 75E97A422C5025080081B069 /* SearchCategory.struct.swift in Sources */, + 75E97A832C5133AD0081B069 /* LoadingView.struct.swift in Sources */, + 75E97A242C5023600081B069 /* SearchFilter.struct.swift in Sources */, + 75E97A3E2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */, + 75E97A4E2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, + 75E97AB12C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */, + 75E97A282C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */, + 75E97A2C2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */, + 75E97A462C5025240081B069 /* SearchQuery.struct.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1135,19 +1139,19 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 75E97A312C5023B10081B069 /* SearchFashionColor.swift in Sources */, - 75E97A4B2C50253A0081B069 /* SearchSuggest.swift in Sources */, - 75E97A4F2C50255A0081B069 /* SearchPriceRange.swift in Sources */, - 75E97A472C5025240081B069 /* SearchQuery.swift in Sources */, - 75E97A432C5025080081B069 /* SearchCategory.swift in Sources */, - 75E97A842C5133AD0081B069 /* LoadingView.swift in Sources */, + 75E97A312C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */, + 75E97A4B2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, + 75E97A4F2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, + 75E97A472C5025240081B069 /* SearchQuery.struct.swift in Sources */, + 75E97A432C5025080081B069 /* SearchCategory.struct.swift in Sources */, + 75E97A842C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */, - 75E97A252C5023600081B069 /* SearchFilter.swift in Sources */, - 75E97A292C50237F0081B069 /* SearchIndustrialFilters.swift in Sources */, - 75E97AB22C514D2D0081B069 /* AppConvigVariables.swift in Sources */, - 75E97A3B2C5024CD0081B069 /* SearchProduct.swift in Sources */, - 75E97A2D2C5023960081B069 /* SearchFashionSize.swift in Sources */, - 75E97A3F2C5024EF0081B069 /* SearchRedirect.swift in Sources */, + 75E97A252C5023600081B069 /* SearchFilter.struct.swift in Sources */, + 75E97A292C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */, + 75E97AB22C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */, + 75E97A3B2C5024CD0081B069 /* SearchProduct.struct.swift in Sources */, + 75E97A2D2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */, + 75E97A3F2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist index 3e8dcc6..18b0a6a 100644 --- a/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/demo-store-ios.xcodeproj/xcuserdata/borystrubitsun.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,12 +7,12 @@ Core.xcscheme_^#shared#^_ orderHint - 5 + 4 Feature.xcscheme_^#shared#^_ orderHint - 4 + 5 common.xcscheme_^#shared#^_ From 270b971a287c9d88a8796c6c1744bb93b89f31e9 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 2 Aug 2024 12:09:44 +0200 Subject: [PATCH 75/85] refactor(app): Remove logs and hardcode products id --- App/Views/Screens/CartScreenView.struct.swift | 2 +- App/Views/Screens/ProductsScreenView.struct.swift | 5 ----- Feature/Cart/Presentation/ViewModel/CartViewModel.swift | 4 ++-- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/App/Views/Screens/CartScreenView.struct.swift b/App/Views/Screens/CartScreenView.struct.swift index eb175b7..538ea35 100644 --- a/App/Views/Screens/CartScreenView.struct.swift +++ b/App/Views/Screens/CartScreenView.struct.swift @@ -58,7 +58,7 @@ struct CartScreenView: View { .navigationBarTitle("cart_tab_title") .onAppear { navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) - viewModel.loadRecommenderRecommendations(currentProductId: "665") + viewModel.loadRecommenderRecommendations() } } } diff --git a/App/Views/Screens/ProductsScreenView.struct.swift b/App/Views/Screens/ProductsScreenView.struct.swift index 87e966c..79e0996 100644 --- a/App/Views/Screens/ProductsScreenView.struct.swift +++ b/App/Views/Screens/ProductsScreenView.struct.swift @@ -49,11 +49,6 @@ struct ProductsScreenView: View { .background(Color.white) } .onAppear { - if let product = product { - print("DATA \(product)") - } else { - print("DATA is nil") - } navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) } } diff --git a/Feature/Cart/Presentation/ViewModel/CartViewModel.swift b/Feature/Cart/Presentation/ViewModel/CartViewModel.swift index b656762..f3689dc 100644 --- a/Feature/Cart/Presentation/ViewModel/CartViewModel.swift +++ b/Feature/Cart/Presentation/ViewModel/CartViewModel.swift @@ -34,9 +34,9 @@ class CartViewModel { cartRepository.removeFromCart(productId: productId) } - func loadRecommenderRecommendations(currentProductId: String) { + func loadRecommenderRecommendations() { getRecommendationsUseCase.execute( - currentProductId: currentProductId + currentProductId: AppConfigVariables.recommendationCode ) { products in self.recommenderProducts = products } From f6cf400618ac35837a7a311af9294eead1993d08 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 2 Aug 2024 12:19:42 +0200 Subject: [PATCH 76/85] refactor(navigation): Optimized navigation to screens --- App/ViewModels/NavigationManager.swift | 7 +++++-- App/Views/Screens/HomeScreenView.struct.swift | 2 +- App/Views/ToolBar/DetailsToolbarView.struct.swift | 10 ++-------- App/Views/ToolBar/ToolbarView.struct.swift | 4 ++-- .../Presentation/View/ProductListItemView.struct.swift | 6 +----- 5 files changed, 11 insertions(+), 18 deletions(-) diff --git a/App/ViewModels/NavigationManager.swift b/App/ViewModels/NavigationManager.swift index 2474e1f..cf24467 100644 --- a/App/ViewModels/NavigationManager.swift +++ b/App/ViewModels/NavigationManager.swift @@ -44,8 +44,11 @@ class NavigationManager: ObservableObject { } } - func navigateToScreen(_ view: AnyView) { - let secondaryScreen = ScreenWrapper(screen: view, type: nil) + func navigateToScreen(_ view: any View) { + let secondaryScreen = ScreenWrapper( + screen: AnyView(view), + type: nil + ) self.currentScreen = secondaryScreen self.screenHistory.append(secondaryScreen) } diff --git a/App/Views/Screens/HomeScreenView.struct.swift b/App/Views/Screens/HomeScreenView.struct.swift index ca850e3..28f064b 100644 --- a/App/Views/Screens/HomeScreenView.struct.swift +++ b/App/Views/Screens/HomeScreenView.struct.swift @@ -17,7 +17,7 @@ struct HomeScreenView: View { var body: some View { ScrollView { - VStack(spacing: 16) { + LazyVStack(spacing: 16) { if isLoading { LoadingView(isLoading: $isLoading) } else { diff --git a/App/Views/ToolBar/DetailsToolbarView.struct.swift b/App/Views/ToolBar/DetailsToolbarView.struct.swift index 651c062..583f726 100644 --- a/App/Views/ToolBar/DetailsToolbarView.struct.swift +++ b/App/Views/ToolBar/DetailsToolbarView.struct.swift @@ -35,10 +35,7 @@ struct DetailsToolbarView: View { .frame(width: 30, height: 30) .foregroundColor(.white) .onTapGesture { - navigationManager.navigateToScreen( - AnyView( - SearchScreenView()) - ) + navigationManager.navigateToScreen(SearchScreenView()) } Image("CartIcon") @@ -48,10 +45,7 @@ struct DetailsToolbarView: View { .foregroundColor(.white) .padding(.trailing, 12) .onTapGesture { - navigationManager.navigateToScreen( - AnyView( - CartScreenView()) - ) + navigationManager.navigateToScreen(CartScreenView()) } } } diff --git a/App/Views/ToolBar/ToolbarView.struct.swift b/App/Views/ToolBar/ToolbarView.struct.swift index 75d7406..35a6cfb 100644 --- a/App/Views/ToolBar/ToolbarView.struct.swift +++ b/App/Views/ToolBar/ToolbarView.struct.swift @@ -34,7 +34,7 @@ struct ToolbarView: View { .frame(width: 30, height: 30) .foregroundColor(.black) .onTapGesture { - navigationManager.navigateToScreen(AnyView(SearchScreenView())) + navigationManager.navigateToScreen(SearchScreenView()) } Image("CartIcon") @@ -44,7 +44,7 @@ struct ToolbarView: View { .foregroundColor(.black) .padding(.trailing, 12) .onTapGesture { - navigationManager.navigateToScreen(AnyView(CartScreenView())) + navigationManager.navigateToScreen(CartScreenView()) } } } diff --git a/Feature/Product/Presentation/View/ProductListItemView.struct.swift b/Feature/Product/Presentation/View/ProductListItemView.struct.swift index bc7ef69..151e87c 100644 --- a/Feature/Product/Presentation/View/ProductListItemView.struct.swift +++ b/Feature/Product/Presentation/View/ProductListItemView.struct.swift @@ -72,11 +72,7 @@ struct ProductListItemView: View { .frame(width: containerWidth, height: containerHeight) .onTapGesture { navigationManager.navigateToScreen( - AnyView( - ProductsScreenView( - product: product - ) - ) + ProductsScreenView(product: product) ) } } From b22aa29af6167b9fc96e50bc44cd752aa70cbe2f Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 2 Aug 2024 14:12:39 +0200 Subject: [PATCH 77/85] refactor(home): Optimized loading recommendation products --- App/Views/Screens/HomeScreenView.struct.swift | 13 ++----- Core/Utils/AppConvigVariables.struct.swift | 2 +- .../ViewModel/HomeViewModel.swift | 38 +++++++++++-------- .../xcschemes/demo-store-ios.xcscheme | 8 ++-- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/App/Views/Screens/HomeScreenView.struct.swift b/App/Views/Screens/HomeScreenView.struct.swift index 28f064b..315bc99 100644 --- a/App/Views/Screens/HomeScreenView.struct.swift +++ b/App/Views/Screens/HomeScreenView.struct.swift @@ -29,23 +29,17 @@ struct HomeScreenView: View { ShortRecommendationListView( recommendedProducts: viewModel.arrivalsProducts, title: NSLocalizedString("arrivals_title", comment: "") - ).onAppear { - viewModel.loadArrivalsRecommendations(currentProductId: AppConfigVariables.arrivalsCode) - } + ) ShortRecommendationListView( recommendedProducts: viewModel.topTrendProducts, title: NSLocalizedString("top_trend_title", comment: "") - ).onAppear { - viewModel.loadTopTrendRecommendations(currentProductId: AppConfigVariables.topTrendsCode) - } + ) ShortRecommendationListView( recommendedProducts: viewModel.recommenderProducts, title: NSLocalizedString("reccomender_title", comment: "") - ).onAppear { - viewModel.loadRecommenderRecommendations(currentProductId: AppConfigVariables.recommendationCode) - } + ) } } @@ -54,6 +48,7 @@ struct HomeScreenView: View { } .navigationTitle("main_tab_title") .onAppear { + viewModel.loadAllRecommendations() navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) } } diff --git a/Core/Utils/AppConvigVariables.struct.swift b/Core/Utils/AppConvigVariables.struct.swift index e0d3745..5510c26 100644 --- a/Core/Utils/AppConvigVariables.struct.swift +++ b/Core/Utils/AppConvigVariables.struct.swift @@ -6,6 +6,6 @@ struct AppConfigVariables { static let apiDomain: String = ProcessInfo.processInfo.environment["API_DOMAIN_PATH"] ?? "api.rees46.ru" static let sdkStream: String = ProcessInfo.processInfo.environment["SDK_STREAM"] ?? "ios" static let arrivalsCode: String = ProcessInfo.processInfo.environment["ARRIVALS_CODE"] ?? "" - static let topTrendsCode: String = ProcessInfo.processInfo.environment["TOP_TRENDS"] ?? "" + static let topTrendsCode: String = ProcessInfo.processInfo.environment["TOP_TRENDS_CODE"] ?? "" static let recommendationCode: String = ProcessInfo.processInfo.environment["RECOMMENDATION_CODE"] ?? "" } diff --git a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift index 5c710f3..27357c5 100644 --- a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift +++ b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift @@ -14,33 +14,39 @@ class HomeViewModel { @Published var recommenderProducts: [RecommendedProduct] = [] @Published var isLoading = true - func loadArrivalsRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute( - currentProductId: currentProductId - ) { [weak self] products in + func loadAllRecommendations() { + isLoading = true + + loadArrivalsRecommendations(currentProductId: AppConfigVariables.arrivalsCode) { [weak self] in + self?.loadTopTrendRecommendations(currentProductId: AppConfigVariables.topTrendsCode) { [weak self] in + self?.loadRecommenderRecommendations(currentProductId: AppConfigVariables.recommendationCode) { [weak self] in + self?.isLoading = false + } + } + } + } + + private func loadArrivalsRecommendations(currentProductId: String, completion: @escaping () -> Void) { + getRecommendationsUseCase.execute(currentProductId: currentProductId) { [weak self] products in self?.arrivalsProducts = products - self?.isLoading = false + completion() } } - func loadTopTrendRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute( - currentProductId: currentProductId - ) { [weak self] products in + private func loadTopTrendRecommendations(currentProductId: String, completion: @escaping () -> Void) { + getRecommendationsUseCase.execute(currentProductId: currentProductId) { [weak self] products in self?.topTrendProducts = products - self?.isLoading = false + completion() } } - func loadRecommenderRecommendations(currentProductId: String) { - getRecommendationsUseCase.execute( - currentProductId: currentProductId - ) { [weak self] products in + private func loadRecommenderRecommendations(currentProductId: String, completion: @escaping () -> Void) { + getRecommendationsUseCase.execute(currentProductId: currentProductId) { [weak self] products in self?.recommenderProducts = products - self?.isLoading = false + completion() } } - + func addToCart(product: RecommendedProduct, quantity: Int) { cartRepository.addToCart(product: product, quantity: quantity) } diff --git a/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme index 7d381d6..b9a8925 100644 --- a/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme +++ b/demo-store-ios.xcodeproj/xcshareddata/xcschemes/demo-store-ios.xcscheme @@ -113,17 +113,17 @@ From 71b62e0a3993afd47f0c5f99bb50b0024e04680b Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Fri, 2 Aug 2024 15:50:42 +0200 Subject: [PATCH 78/85] refactor(core): Add colors and sizes structs --- .../BottomBar/BottomBarView.struct.swift | 5 +- App/Views/Screens/HomeScreenView.struct.swift | 2 +- .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/AppIcon.png | Bin .../AppIcon.appiconset/Contents.json | 0 .../Assets.xcassets/Contents.json | 0 .../Icons/CartIcon.imageset/Contents.json | 0 .../Icons/CartIcon.imageset/Frame 26.pdf | Bin .../Icons/CartIcon.imageset/Frame 27.pdf | Bin .../Icons/CartIcon.imageset/Frame 28.pdf | Bin .../Icons/CartTab.imageset/Contents.json | 0 .../Icons/CartTab.imageset/cart 1.pdf | Bin .../Icons/CartTab.imageset/cart 2.pdf | Bin .../Icons/CartTab.imageset/cart.pdf | Bin .../Icons/CatalogTab.imageset/Contents.json | 0 .../Icons/CatalogTab.imageset/folder 1.pdf | Bin .../Icons/CatalogTab.imageset/folder 2.pdf | Bin .../Icons/CatalogTab.imageset/folder.pdf | Bin .../Assets.xcassets/Icons/Contents.json | 0 .../Icons/MainTab.imageset/Contents.json | 0 .../Icons/MainTab.imageset/home 1.pdf | Bin .../Icons/MainTab.imageset/home 2.pdf | Bin .../Icons/MainTab.imageset/home.pdf | Bin .../Icons/MenuIcon.imageset/Contents.json | 0 .../Icons/MenuIcon.imageset/hamburger 1.pdf | Bin .../Icons/MenuIcon.imageset/hamburger 2.pdf | Bin .../Icons/MenuIcon.imageset/hamburger.pdf | Bin .../Icons/SearchIcon.imageset/Contents.json | 0 .../Icons/SearchIcon.imageset/Frame 25.pdf | Bin .../Icons/SearchIcon.imageset/Frame 26.pdf | Bin .../Icons/SearchIcon.imageset/Frame 27.pdf | Bin .../Icons/SettingsTab.imageset/Contents.json | 0 .../Icons/SettingsTab.imageset/cog 1.pdf | Bin .../Icons/SettingsTab.imageset/cog 2.pdf | Bin .../Icons/SettingsTab.imageset/cog.pdf | Bin .../Assets.xcassets/Logo/Contents.json | 0 .../Logo/SplashLogo.imageset/Contents.json | 0 .../Logo/SplashLogo.imageset/Logo 1.pdf | Bin .../Logo/SplashLogo.imageset/Logo 2.pdf | Bin .../Logo/SplashLogo.imageset/Logo.pdf | Bin .../Logo/ToolbarLogo.imageset/Contents.json | 0 .../Logo/ToolbarLogo.imageset/Logo 1.pdf | Bin .../Logo/ToolbarLogo.imageset/Logo 2.pdf | Bin .../Logo/ToolbarLogo.imageset/Logo.pdf | Bin Core/Resources/Colors/Colors.struct.swift | 6 ++ Core/Resources/Sizes/Sizes.struct.swift | 29 ++++++++++ .../{ => Strings}/Localizable.xcstrings | 0 demo-store-ios.xcodeproj/project.pbxproj | 52 +++++++++++++++++- 48 files changed, 88 insertions(+), 6 deletions(-) rename Core/Resources/{ => Assets}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/AppIcon.appiconset/AppIcon.png (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CartIcon.imageset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CartTab.imageset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CartTab.imageset/cart.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/MainTab.imageset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/MainTab.imageset/home.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Logo/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf (100%) rename Core/Resources/{ => Assets}/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf (100%) create mode 100644 Core/Resources/Colors/Colors.struct.swift create mode 100644 Core/Resources/Sizes/Sizes.struct.swift rename Core/Resources/{ => Strings}/Localizable.xcstrings (100%) diff --git a/App/Views/BottomBar/BottomBarView.struct.swift b/App/Views/BottomBar/BottomBarView.struct.swift index e483853..3c54dbb 100644 --- a/App/Views/BottomBar/BottomBarView.struct.swift +++ b/App/Views/BottomBar/BottomBarView.struct.swift @@ -39,9 +39,8 @@ struct TabBarButton: View { Image(image) .resizable() .renderingMode(.template) - .frame(width: 32, height: 32) - .foregroundColor(isSelected ? .white : .gray) + .frame(width: Sizes.defaultSize, height: Sizes.defaultSize) + .foregroundColor(isSelected ? Colors.selectedForeground : Colors.unselectedForeground) } } } - diff --git a/App/Views/Screens/HomeScreenView.struct.swift b/App/Views/Screens/HomeScreenView.struct.swift index 315bc99..c584377 100644 --- a/App/Views/Screens/HomeScreenView.struct.swift +++ b/App/Views/Screens/HomeScreenView.struct.swift @@ -43,7 +43,7 @@ struct HomeScreenView: View { } } - .padding(.vertical, 16) + .padding(.vertical, Sizes.paddingHorizontal) .frame(maxWidth: .infinity, alignment: .top) } .navigationTitle("main_tab_title") diff --git a/Core/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/Core/Resources/Assets/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/AccentColor.colorset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/Core/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/Core/Resources/Assets/Assets.xcassets/AppIcon.appiconset/AppIcon.png similarity index 100% rename from Core/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon.png rename to Core/Resources/Assets/Assets.xcassets/AppIcon.appiconset/AppIcon.png diff --git a/Core/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Core/Resources/Assets/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Contents.json b/Core/Resources/Assets/Assets.xcassets/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Contents.json diff --git a/Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Contents.json b/Core/Resources/Assets/Assets.xcassets/Icons/CartIcon.imageset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Icons/CartIcon.imageset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/CartIcon.imageset/Frame 26.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/CartIcon.imageset/Frame 27.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/CartIcon.imageset/Frame 28.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/CartTab.imageset/Contents.json b/Core/Resources/Assets/Assets.xcassets/Icons/CartTab.imageset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CartTab.imageset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Icons/CartTab.imageset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/CartTab.imageset/cart 1.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/CartTab.imageset/cart 2.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/CartTab.imageset/cart.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CartTab.imageset/cart.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/CartTab.imageset/cart.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json b/Core/Resources/Assets/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Icons/CatalogTab.imageset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/CatalogTab.imageset/folder 1.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/CatalogTab.imageset/folder 2.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/CatalogTab.imageset/folder.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/Contents.json b/Core/Resources/Assets/Assets.xcassets/Icons/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Icons/Contents.json diff --git a/Core/Resources/Assets.xcassets/Icons/MainTab.imageset/Contents.json b/Core/Resources/Assets/Assets.xcassets/Icons/MainTab.imageset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/MainTab.imageset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Icons/MainTab.imageset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/MainTab.imageset/home 1.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/MainTab.imageset/home 2.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/MainTab.imageset/home.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/MainTab.imageset/home.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/MainTab.imageset/home.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json b/Core/Resources/Assets/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Icons/MenuIcon.imageset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 1.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/MenuIcon.imageset/hamburger 2.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/MenuIcon.imageset/hamburger.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json b/Core/Resources/Assets/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Icons/SearchIcon.imageset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/SearchIcon.imageset/Frame 25.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/SearchIcon.imageset/Frame 26.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/SearchIcon.imageset/Frame 27.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json b/Core/Resources/Assets/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Icons/SettingsTab.imageset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/SettingsTab.imageset/cog 1.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/SettingsTab.imageset/cog 2.pdf diff --git a/Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf b/Core/Resources/Assets/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf rename to Core/Resources/Assets/Assets.xcassets/Icons/SettingsTab.imageset/cog.pdf diff --git a/Core/Resources/Assets.xcassets/Logo/Contents.json b/Core/Resources/Assets/Assets.xcassets/Logo/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Logo/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Logo/Contents.json diff --git a/Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json b/Core/Resources/Assets/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Logo/SplashLogo.imageset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf b/Core/Resources/Assets/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf rename to Core/Resources/Assets/Assets.xcassets/Logo/SplashLogo.imageset/Logo 1.pdf diff --git a/Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf b/Core/Resources/Assets/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf rename to Core/Resources/Assets/Assets.xcassets/Logo/SplashLogo.imageset/Logo 2.pdf diff --git a/Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf b/Core/Resources/Assets/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf rename to Core/Resources/Assets/Assets.xcassets/Logo/SplashLogo.imageset/Logo.pdf diff --git a/Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json b/Core/Resources/Assets/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json similarity index 100% rename from Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json rename to Core/Resources/Assets/Assets.xcassets/Logo/ToolbarLogo.imageset/Contents.json diff --git a/Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf b/Core/Resources/Assets/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf rename to Core/Resources/Assets/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 1.pdf diff --git a/Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf b/Core/Resources/Assets/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf rename to Core/Resources/Assets/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo 2.pdf diff --git a/Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf b/Core/Resources/Assets/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf similarity index 100% rename from Core/Resources/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf rename to Core/Resources/Assets/Assets.xcassets/Logo/ToolbarLogo.imageset/Logo.pdf diff --git a/Core/Resources/Colors/Colors.struct.swift b/Core/Resources/Colors/Colors.struct.swift new file mode 100644 index 0000000..2570dfd --- /dev/null +++ b/Core/Resources/Colors/Colors.struct.swift @@ -0,0 +1,6 @@ +import SwiftUI + +struct Colors { + static let selectedForeground = Color.white + static let unselectedForeground = Color.gray +} diff --git a/Core/Resources/Sizes/Sizes.struct.swift b/Core/Resources/Sizes/Sizes.struct.swift new file mode 100644 index 0000000..26e46b8 --- /dev/null +++ b/Core/Resources/Sizes/Sizes.struct.swift @@ -0,0 +1,29 @@ +import SwiftUI + +struct Sizes { + static let padding: CGFloat = 16 + static let topSectionSpacing: CGFloat = 20 + static let productImagesSectionHeight: CGFloat = 300 + static let productImageCircleSize: CGFloat = 10 + static let productDetailsSpacing: CGFloat = 20 + static let productBrandFontSize: CGFloat = 16 + static let productNameFontSize: CGFloat = 24 + static let ratingSpacing: CGFloat = 12 + static let ratingFontSize: CGFloat = 12 + static let descriptionFontSize: CGFloat = 13 + static let priceSectionSpacing: CGFloat = 20 + static let oldPriceFontSize: CGFloat = 18 + static let priceFontSize: CGFloat = 17 + static let discountFontSize: CGFloat = 16 + static let discountBadgeSize: CGFloat = 14 + static let discountPadding: CGFloat = 8 + static let discountCornerRadius: CGFloat = 8 + static let actionSectionHeight: CGFloat = 50 + static let counterButtonSize: CGFloat = 50 + static let counterFontSize: CGFloat = 20 + static let counterBorderWidth: CGFloat = 1 + static let buttonCornerRadius: CGFloat = 8 + static let buttonPaddingHorizontal: CGFloat = 16 + static let buttonFontSize: CGFloat = 17 + static let recommendationSpacing: CGFloat = 36 +} diff --git a/Core/Resources/Localizable.xcstrings b/Core/Resources/Strings/Localizable.xcstrings similarity index 100% rename from Core/Resources/Localizable.xcstrings rename to Core/Resources/Strings/Localizable.xcstrings diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index d030f7f..593320b 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -31,6 +31,12 @@ 75A4D5AE2C579A3F00929368 /* SDKManagingProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */; }; 75A4D5B22C579A4900929368 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D5B12C579A4900929368 /* SdkManager.swift */; }; 75A4D60F2C5CD84800929368 /* RemoteImageView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D60D2C5CD80500929368 /* RemoteImageView.struct.swift */; }; + 75A4D6162C5D0AD400929368 /* Sizes.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */; }; + 75A4D6172C5D0AD400929368 /* Sizes.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */; }; + 75A4D6182C5D0AD400929368 /* Sizes.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */; }; + 75A4D61A2C5D0AE800929368 /* Colors.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6192C5D0AE800929368 /* Colors.struct.swift */; }; + 75A4D61B2C5D0AE800929368 /* Colors.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6192C5D0AE800929368 /* Colors.struct.swift */; }; + 75A4D61C2C5D0AE800929368 /* Colors.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6192C5D0AE800929368 /* Colors.struct.swift */; }; 75B935572C3564360063E814 /* DemoStoreApp.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* DemoStoreApp.struct.swift */; }; 75B935592C3564360063E814 /* ContentView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.struct.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; @@ -175,6 +181,8 @@ 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKManagingProtocol.swift; sourceTree = ""; }; 75A4D5B12C579A4900929368 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; 75A4D60D2C5CD80500929368 /* RemoteImageView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageView.struct.swift; sourceTree = ""; }; + 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sizes.struct.swift; sourceTree = ""; }; + 75A4D6192C5D0AE800929368 /* Colors.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.struct.swift; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935562C3564360063E814 /* DemoStoreApp.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.struct.swift; sourceTree = ""; }; 75B935582C3564360063E814 /* ContentView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.struct.swift; sourceTree = ""; }; @@ -303,6 +311,38 @@ path = Protocols; sourceTree = ""; }; + 75A4D6132C5D09BB00929368 /* Colors */ = { + isa = PBXGroup; + children = ( + 75A4D6192C5D0AE800929368 /* Colors.struct.swift */, + ); + path = Colors; + sourceTree = ""; + }; + 75A4D6142C5D09C400929368 /* Sizes */ = { + isa = PBXGroup; + children = ( + 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */, + ); + path = Sizes; + sourceTree = ""; + }; + 75A4D61D2C5D0C6900929368 /* Strings */ = { + isa = PBXGroup; + children = ( + 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */, + ); + path = Strings; + sourceTree = ""; + }; + 75A4D61E2C5D0C7500929368 /* Assets */ = { + isa = PBXGroup; + children = ( + 75B9355A2C3564370063E814 /* Assets.xcassets */, + ); + path = Assets; + sourceTree = ""; + }; 75B9354A2C3564360063E814 = { isa = PBXGroup; children = ( @@ -802,8 +842,10 @@ 75ECCD152C36D6B400D6D346 /* Resources */ = { isa = PBXGroup; children = ( - 75B9355A2C3564370063E814 /* Assets.xcassets */, - 75ECCD162C36D6D000D6D346 /* Localizable.xcstrings */, + 75A4D61E2C5D0C7500929368 /* Assets */, + 75A4D61D2C5D0C6900929368 /* Strings */, + 75A4D6132C5D09BB00929368 /* Colors */, + 75A4D6142C5D09C400929368 /* Sizes */, ); name = Resources; path = Core/Resources; @@ -1049,6 +1091,7 @@ 75A4D60F2C5CD84800929368 /* RemoteImageView.struct.swift in Sources */, 75E97A652C50320F0081B069 /* RecommendedProduct.struct.swift in Sources */, 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.struct.swift in Sources */, + 75A4D6162C5D0AD400929368 /* Sizes.struct.swift in Sources */, 75E97A8D2C5142F10081B069 /* ProductsViewModel.swift in Sources */, 75E97A5F2C502F3C0081B069 /* Product.struct.swift in Sources */, 75E97A782C512F8C0081B069 /* DependenciesInitialization.struct.swift in Sources */, @@ -1093,6 +1136,7 @@ 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */, 75E97A232C5023600081B069 /* SearchFilter.struct.swift in Sources */, 75E97A5A2C502DBF0081B069 /* SearchProductResponseMapper.swift in Sources */, + 75A4D61A2C5D0AE800929368 /* Colors.struct.swift in Sources */, 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.struct.swift in Sources */, 75E97A4D2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, 75E979F12C4D2DBE0081B069 /* Timer.swift in Sources */, @@ -1124,7 +1168,9 @@ 75E97A4A2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */, 75E97A422C5025080081B069 /* SearchCategory.struct.swift in Sources */, + 75A4D61B2C5D0AE800929368 /* Colors.struct.swift in Sources */, 75E97A832C5133AD0081B069 /* LoadingView.struct.swift in Sources */, + 75A4D6172C5D0AD400929368 /* Sizes.struct.swift in Sources */, 75E97A242C5023600081B069 /* SearchFilter.struct.swift in Sources */, 75E97A3E2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */, 75E97A4E2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, @@ -1144,7 +1190,9 @@ 75E97A4F2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, 75E97A472C5025240081B069 /* SearchQuery.struct.swift in Sources */, 75E97A432C5025080081B069 /* SearchCategory.struct.swift in Sources */, + 75A4D61C2C5D0AE800929368 /* Colors.struct.swift in Sources */, 75E97A842C5133AD0081B069 /* LoadingView.struct.swift in Sources */, + 75A4D6182C5D0AD400929368 /* Sizes.struct.swift in Sources */, 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */, 75E97A252C5023600081B069 /* SearchFilter.struct.swift in Sources */, 75E97A292C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */, From 8519d1b85045824f9496b7a8f5075a20b5909948 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 5 Aug 2024 12:06:41 +0200 Subject: [PATCH 79/85] refactor(feature): Added generalized size values --- .../BottomBar/BottomBarView.struct.swift | 15 ---- App/Views/BottomBar/button/TabBarButton.swift | 16 +++++ App/Views/Screens/HomeScreenView.struct.swift | 2 +- Core/Resources/Sizes/Sizes.struct.swift | 68 ++++++++++++------- Core/Resources/Strings/Localizable.xcstrings | 12 +++- .../ShortRecommendationListView.struct.swift | 8 +-- .../View/Button/PriceAndShopButtonView.swift | 33 +++++++++ .../View/Image/ProductImageView.swift | 15 ++++ .../View/ProductListItemView.struct.swift | 55 ++------------- .../View/Text/ProductInfoView.swift | 29 ++++++++ demo-store-ios.xcodeproj/project.pbxproj | 48 +++++++++++++ 11 files changed, 204 insertions(+), 97 deletions(-) create mode 100644 App/Views/BottomBar/button/TabBarButton.swift create mode 100644 Feature/Product/Presentation/View/Button/PriceAndShopButtonView.swift create mode 100644 Feature/Product/Presentation/View/Image/ProductImageView.swift create mode 100644 Feature/Product/Presentation/View/Text/ProductInfoView.swift diff --git a/App/Views/BottomBar/BottomBarView.struct.swift b/App/Views/BottomBar/BottomBarView.struct.swift index 3c54dbb..2250df9 100644 --- a/App/Views/BottomBar/BottomBarView.struct.swift +++ b/App/Views/BottomBar/BottomBarView.struct.swift @@ -29,18 +29,3 @@ struct BottomBarView: View { } } } - -struct TabBarButton: View { - var image: String - var isSelected: Bool - - var body: some View { - VStack { - Image(image) - .resizable() - .renderingMode(.template) - .frame(width: Sizes.defaultSize, height: Sizes.defaultSize) - .foregroundColor(isSelected ? Colors.selectedForeground : Colors.unselectedForeground) - } - } -} diff --git a/App/Views/BottomBar/button/TabBarButton.swift b/App/Views/BottomBar/button/TabBarButton.swift new file mode 100644 index 0000000..6483024 --- /dev/null +++ b/App/Views/BottomBar/button/TabBarButton.swift @@ -0,0 +1,16 @@ +import SwiftUI + +struct TabBarButton: View { + var image: String + var isSelected: Bool + + var body: some View { + VStack { + Image(image) + .resizable() + .renderingMode(.template) + .frame(width: Sizes.Size.icon, height: Sizes.Size.icon) + .foregroundColor(isSelected ? Colors.selectedForeground : Colors.unselectedForeground) + } + } +} diff --git a/App/Views/Screens/HomeScreenView.struct.swift b/App/Views/Screens/HomeScreenView.struct.swift index c584377..b9b76b0 100644 --- a/App/Views/Screens/HomeScreenView.struct.swift +++ b/App/Views/Screens/HomeScreenView.struct.swift @@ -43,7 +43,7 @@ struct HomeScreenView: View { } } - .padding(.vertical, Sizes.paddingHorizontal) + .padding(.vertical, Sizes.Padding.general) .frame(maxWidth: .infinity, alignment: .top) } .navigationTitle("main_tab_title") diff --git a/Core/Resources/Sizes/Sizes.struct.swift b/Core/Resources/Sizes/Sizes.struct.swift index 26e46b8..5ca9973 100644 --- a/Core/Resources/Sizes/Sizes.struct.swift +++ b/Core/Resources/Sizes/Sizes.struct.swift @@ -1,29 +1,47 @@ import SwiftUI struct Sizes { - static let padding: CGFloat = 16 - static let topSectionSpacing: CGFloat = 20 - static let productImagesSectionHeight: CGFloat = 300 - static let productImageCircleSize: CGFloat = 10 - static let productDetailsSpacing: CGFloat = 20 - static let productBrandFontSize: CGFloat = 16 - static let productNameFontSize: CGFloat = 24 - static let ratingSpacing: CGFloat = 12 - static let ratingFontSize: CGFloat = 12 - static let descriptionFontSize: CGFloat = 13 - static let priceSectionSpacing: CGFloat = 20 - static let oldPriceFontSize: CGFloat = 18 - static let priceFontSize: CGFloat = 17 - static let discountFontSize: CGFloat = 16 - static let discountBadgeSize: CGFloat = 14 - static let discountPadding: CGFloat = 8 - static let discountCornerRadius: CGFloat = 8 - static let actionSectionHeight: CGFloat = 50 - static let counterButtonSize: CGFloat = 50 - static let counterFontSize: CGFloat = 20 - static let counterBorderWidth: CGFloat = 1 - static let buttonCornerRadius: CGFloat = 8 - static let buttonPaddingHorizontal: CGFloat = 16 - static let buttonFontSize: CGFloat = 17 - static let recommendationSpacing: CGFloat = 36 + struct Padding { + static let standard: CGFloat = 16 + static let small: CGFloat = 8 + static let buttonHorizontal: CGFloat = 16 + } + + struct Spacing { + static let small: CGFloat = 5 + static let standard: CGFloat = 16 + static let large: CGFloat = 20 + static let medium: CGFloat = 12 + static let extraLarge: CGFloat = 36 + } + + struct FontSize { + static let small: CGFloat = 12 + static let medium: CGFloat = 13 + static let standard: CGFloat = 16 + static let large: CGFloat = 17 + static let extraLarge: CGFloat = 18 + static let xxLarge: CGFloat = 20 + static let xxxLarge: CGFloat = 24 + } + + struct Size { + static let largeImageHeight: CGFloat = 300 + static let smallCircle: CGFloat = 10 + static let badge: CGFloat = 14 + static let buttonHeight: CGFloat = 50 + static let buttonWidth: CGFloat = 50 + static let icon: CGFloat = 32 + static let mediumImage: CGFloat = 140 + } + + struct BorderWidth { + static let standard: CGFloat = 1 + } + + struct CornerRadius { + static let small: CGFloat = 3 + static let standard: CGFloat = 8 + static let large: CGFloat = 10 + } } diff --git a/Core/Resources/Strings/Localizable.xcstrings b/Core/Resources/Strings/Localizable.xcstrings index f4c3b32..a1f72af 100644 --- a/Core/Resources/Strings/Localizable.xcstrings +++ b/Core/Resources/Strings/Localizable.xcstrings @@ -372,8 +372,16 @@ } } }, - "Shop" : { - + "shop_button_title" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Shop" + } + } + } }, "show_all_button" : { "extractionState" : "manual", diff --git a/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift b/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift index 0114332..3222fdc 100644 --- a/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift +++ b/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift @@ -19,19 +19,19 @@ struct ShortRecommendationListView: View { } ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: 16) { + HStack(spacing: Sizes.Spacing.general) { ForEach(recommendedProducts, id: \.id) { product in ProductListItemView( product: product, containerWidth: 140, containerHeight: 270, - imageWidth: 140, - imageHeight: 140, + imageWidth: Sizes.Size.productImage, + imageHeight: Sizes.Size.productImage, showShopButton: false ) } } - .padding(.horizontal, 16) + .padding(.horizontal, Sizes.Padding.general) } } } diff --git a/Feature/Product/Presentation/View/Button/PriceAndShopButtonView.swift b/Feature/Product/Presentation/View/Button/PriceAndShopButtonView.swift new file mode 100644 index 0000000..214d874 --- /dev/null +++ b/Feature/Product/Presentation/View/Button/PriceAndShopButtonView.swift @@ -0,0 +1,33 @@ +import SwiftUI + +struct PriceAndShopButtonView: View { + + var product: RecommendedProduct + var showShopButton: Bool + var viewModel: ProductsViewModel + + var body: some View { + HStack { + Text(product.priceFormatted ?? "") + .font(.system(size: 17, weight: .bold)) + .foregroundColor(.primary) + + Spacer() + + if showShopButton { + Button( + action: { + viewModel.addToCart(product: product, quantity: 1) + } + ) { + Text("shop_button_title") + .font(.system(size: 12)) + .foregroundColor(.white) + .frame(width: 62, height: 28) + .background(Color.black) + .cornerRadius(3) + } + } + } + } +} diff --git a/Feature/Product/Presentation/View/Image/ProductImageView.swift b/Feature/Product/Presentation/View/Image/ProductImageView.swift new file mode 100644 index 0000000..4dc876c --- /dev/null +++ b/Feature/Product/Presentation/View/Image/ProductImageView.swift @@ -0,0 +1,15 @@ +import SwiftUI + +struct ProductImageView: View { + var urlString: String + var width: CGFloat + var height: CGFloat + + var body: some View { + RemoteImageView( + urlString: urlString, + width: width, + height: height + ) + } +} diff --git a/Feature/Product/Presentation/View/ProductListItemView.struct.swift b/Feature/Product/Presentation/View/ProductListItemView.struct.swift index 151e87c..6cfa85d 100644 --- a/Feature/Product/Presentation/View/ProductListItemView.struct.swift +++ b/Feature/Product/Presentation/View/ProductListItemView.struct.swift @@ -14,61 +14,16 @@ struct ProductListItemView: View { var showShopButton: Bool var body: some View { - VStack(alignment: .leading, spacing: 5) { - RemoteImageView( - urlString: product.resizedImageUrl, - width: imageWidth, - height: imageHeight - ) - - Text(product.brand) - .font(.system(size: 12)) - .padding(.top, 8) - .padding(.bottom, 4) - .foregroundColor(.secondary) - .lineLimit(1) - - Text(product.name) - .font(.system(size: 19)) - .padding(.bottom, 4) - .foregroundColor(.primary) - .lineLimit(1) - - RatingView(rating: Double(product.rating)) + VStack(alignment: .leading, spacing: Sizes.CornerRadius.small) { + ProductImageView(urlString: product.resizedImageUrl, width: imageWidth, height: imageHeight) - if let oldPrice = product.oldPriceFormatted { - Text(oldPrice) - .font(.subheadline) - .foregroundColor(.secondary) - .strikethrough() - } + ProductInfoView(product: product) - HStack { - Text(product.priceFormatted ?? "") - .font(.system(size: 17, weight: .bold)) - .foregroundColor(.primary) - - Spacer() - - if showShopButton { - Button( - action: { - viewModel.addToCart(product: product, quantity: 1) - } - ) { - Text("Shop") - .font(.system(size: 12)) - .foregroundColor(.white) - .frame(width: 62, height: 28) - .background(Color.black) - .cornerRadius(3) - } - } - } + PriceAndShopButtonView(product: product, showShopButton: showShopButton, viewModel: viewModel) Spacer() } - .cornerRadius(10) + .cornerRadius(Sizes.CornerRadius.large) .frame(width: containerWidth, height: containerHeight) .onTapGesture { navigationManager.navigateToScreen( diff --git a/Feature/Product/Presentation/View/Text/ProductInfoView.swift b/Feature/Product/Presentation/View/Text/ProductInfoView.swift new file mode 100644 index 0000000..fa88b7b --- /dev/null +++ b/Feature/Product/Presentation/View/Text/ProductInfoView.swift @@ -0,0 +1,29 @@ +import SwiftUI + +struct ProductInfoView: View { + var product: RecommendedProduct + + var body: some View { + VStack(alignment: .leading, spacing: 4) { + Text(product.brand) + .font(.system(size: 12)) + .padding(.top, 8) + .foregroundColor(.secondary) + .lineLimit(1) + + Text(product.name) + .font(.system(size: 19)) + .foregroundColor(.primary) + .lineLimit(1) + + RatingView(rating: Double(product.rating)) + + if let oldPrice = product.oldPriceFormatted { + Text(oldPrice) + .font(.subheadline) + .foregroundColor(.secondary) + .strikethrough() + } + } + } +} diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 593320b..132f2a9 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -41,6 +41,10 @@ 75B935592C3564360063E814 /* ContentView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.struct.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355D2C3564370063E814 /* Preview Assets.xcassets */; }; + 75BAD4742C60D5ED00DFFF02 /* TabBarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4732C60D5ED00DFFF02 /* TabBarButton.swift */; }; + 75BAD47F2C60D97B00DFFF02 /* ProductInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD47A2C60D91700DFFF02 /* ProductInfoView.swift */; }; + 75BAD4802C60D98700DFFF02 /* PriceAndShopButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4782C60D8EA00DFFF02 /* PriceAndShopButtonView.swift */; }; + 75BAD4832C60DB1C00DFFF02 /* ProductImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD47C2C60D95F00DFFF02 /* ProductImageView.swift */; }; 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */; }; 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */; }; 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */; }; @@ -188,6 +192,10 @@ 75B935582C3564360063E814 /* ContentView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.struct.swift; sourceTree = ""; }; 75B9355A2C3564370063E814 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 75B9355D2C3564370063E814 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 75BAD4732C60D5ED00DFFF02 /* TabBarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarButton.swift; sourceTree = ""; }; + 75BAD4782C60D8EA00DFFF02 /* PriceAndShopButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceAndShopButtonView.swift; sourceTree = ""; }; + 75BAD47A2C60D91700DFFF02 /* ProductInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductInfoView.swift; sourceTree = ""; }; + 75BAD47C2C60D95F00DFFF02 /* ProductImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductImageView.swift; sourceTree = ""; }; 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.struct.swift; sourceTree = ""; }; 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbarView.struct.swift; sourceTree = ""; }; 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.struct.swift; sourceTree = ""; }; @@ -388,6 +396,38 @@ path = "Preview Content"; sourceTree = ""; }; + 75BAD4722C60D5CC00DFFF02 /* button */ = { + isa = PBXGroup; + children = ( + 75BAD4732C60D5ED00DFFF02 /* TabBarButton.swift */, + ); + path = button; + sourceTree = ""; + }; + 75BAD4752C60D8CD00DFFF02 /* Image */ = { + isa = PBXGroup; + children = ( + 75BAD47C2C60D95F00DFFF02 /* ProductImageView.swift */, + ); + path = Image; + sourceTree = ""; + }; + 75BAD4762C60D8D600DFFF02 /* Text */ = { + isa = PBXGroup; + children = ( + 75BAD47A2C60D91700DFFF02 /* ProductInfoView.swift */, + ); + path = Text; + sourceTree = ""; + }; + 75BAD4772C60D8DC00DFFF02 /* Button */ = { + isa = PBXGroup; + children = ( + 75BAD4782C60D8EA00DFFF02 /* PriceAndShopButtonView.swift */, + ); + path = Button; + sourceTree = ""; + }; 75E979842C4935170081B069 /* Core */ = { isa = PBXGroup; children = ( @@ -674,6 +714,7 @@ 75E979E22C4AE4790081B069 /* BottomBar */ = { isa = PBXGroup; children = ( + 75BAD4722C60D5CC00DFFF02 /* button */, 75ECCD192C36F94800D6D346 /* BottomBarView.struct.swift */, ); path = BottomBar; @@ -740,6 +781,9 @@ 75E97A212C5020860081B069 /* View */ = { isa = PBXGroup; children = ( + 75BAD4772C60D8DC00DFFF02 /* Button */, + 75BAD4762C60D8D600DFFF02 /* Text */, + 75BAD4752C60D8CD00DFFF02 /* Image */, 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */, ); path = View; @@ -1090,6 +1134,7 @@ 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */, 75A4D60F2C5CD84800929368 /* RemoteImageView.struct.swift in Sources */, 75E97A652C50320F0081B069 /* RecommendedProduct.struct.swift in Sources */, + 75BAD4742C60D5ED00DFFF02 /* TabBarButton.swift in Sources */, 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.struct.swift in Sources */, 75A4D6162C5D0AD400929368 /* Sizes.struct.swift in Sources */, 75E97A8D2C5142F10081B069 /* ProductsViewModel.swift in Sources */, @@ -1116,11 +1161,13 @@ 75E97A1C2C501D660081B069 /* ScreenTypeProviderProtocol.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.struct.swift in Sources */, 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift in Sources */, + 75BAD4832C60DB1C00DFFF02 /* ProductImageView.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.struct.swift in Sources */, 75E97A822C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */, 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */, 75E97A2F2C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */, + 75BAD4802C60D98700DFFF02 /* PriceAndShopButtonView.swift in Sources */, 75E97A172C501B120081B069 /* ScreenWrapper.struct.swift in Sources */, 75ECCD122C36BE2D00D6D346 /* CartScreenView.struct.swift in Sources */, 75A3F4292C38593800AAC175 /* ToolbarView.struct.swift in Sources */, @@ -1135,6 +1182,7 @@ 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.struct.swift in Sources */, 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */, 75E97A232C5023600081B069 /* SearchFilter.struct.swift in Sources */, + 75BAD47F2C60D97B00DFFF02 /* ProductInfoView.swift in Sources */, 75E97A5A2C502DBF0081B069 /* SearchProductResponseMapper.swift in Sources */, 75A4D61A2C5D0AE800929368 /* Colors.struct.swift in Sources */, 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.struct.swift in Sources */, From cf5844159f762353469a6e95e04a248ceb76eee3 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 5 Aug 2024 13:01:58 +0200 Subject: [PATCH 80/85] refactor(app): Add colors and sizes from constants --- App/Views/BottomBar/button/TabBarButton.swift | 2 +- App/Views/ContentView.struct.swift | 8 ++--- App/Views/Screens/HomeScreenView.struct.swift | 2 +- .../Screens/SplashScreenView.struct.swift | 4 +-- .../Views/LoadingView.struct.swift | 2 +- .../Views/RatingConverter.struct.swift | 6 ++-- .../Views/RemoteImageView.struct.swift | 15 ++++---- Core/Resources/Colors/AppColors.struct.swift | 9 +++++ Core/Resources/Colors/Colors.struct.swift | 6 ---- Core/Resources/Sizes/Sizes.struct.swift | 11 +++++- .../FullRecommendationListView.struct.swift | 20 ++++++----- .../ShortRecommendationListView.struct.swift | 8 ++--- .../StoriesViewController.swift | 18 ---------- ...esViewControllerRepresentable.struct.swift | 22 ++++++++++++ demo-store-ios.xcodeproj/project.pbxproj | 36 ++++++++++++------- 15 files changed, 101 insertions(+), 68 deletions(-) create mode 100644 Core/Resources/Colors/AppColors.struct.swift delete mode 100644 Core/Resources/Colors/Colors.struct.swift rename Feature/Home/Presentation/View/Stories/{ => Controller}/StoriesViewController.swift (64%) create mode 100644 Feature/Home/Presentation/View/Stories/Controller/StoriesViewControllerRepresentable.struct.swift diff --git a/App/Views/BottomBar/button/TabBarButton.swift b/App/Views/BottomBar/button/TabBarButton.swift index 6483024..95b97c0 100644 --- a/App/Views/BottomBar/button/TabBarButton.swift +++ b/App/Views/BottomBar/button/TabBarButton.swift @@ -10,7 +10,7 @@ struct TabBarButton: View { .resizable() .renderingMode(.template) .frame(width: Sizes.Size.icon, height: Sizes.Size.icon) - .foregroundColor(isSelected ? Colors.selectedForeground : Colors.unselectedForeground) + .foregroundColor(isSelected ? AppColors.selectedForeground : AppColors.unselectedForeground) } } } diff --git a/App/Views/ContentView.struct.swift b/App/Views/ContentView.struct.swift index 0ab8711..40080dc 100644 --- a/App/Views/ContentView.struct.swift +++ b/App/Views/ContentView.struct.swift @@ -9,15 +9,15 @@ struct ContentView: View { var body: some View { VStack(spacing: 0) { ToolbarView() - .background(Color.black) + .background(AppColors.colorBlack) MainViews() BottomBarView() - .frame(height: 70) - .background(Color.black) + .frame(height: Sizes.Size.bottomBarHeight) + .background(AppColors.colorBlack) } - .background(Color.black.edgesIgnoringSafeArea(.all)) + .background(AppColors.colorBlack.edgesIgnoringSafeArea(.all)) .environmentObject(navigationManager) } } diff --git a/App/Views/Screens/HomeScreenView.struct.swift b/App/Views/Screens/HomeScreenView.struct.swift index b9b76b0..62e63bd 100644 --- a/App/Views/Screens/HomeScreenView.struct.swift +++ b/App/Views/Screens/HomeScreenView.struct.swift @@ -43,7 +43,7 @@ struct HomeScreenView: View { } } - .padding(.vertical, Sizes.Padding.general) + .padding(.vertical, Sizes.Padding.standard) .frame(maxWidth: .infinity, alignment: .top) } .navigationTitle("main_tab_title") diff --git a/App/Views/Screens/SplashScreenView.struct.swift b/App/Views/Screens/SplashScreenView.struct.swift index d2de2bf..23f0b85 100644 --- a/App/Views/Screens/SplashScreenView.struct.swift +++ b/App/Views/Screens/SplashScreenView.struct.swift @@ -10,8 +10,8 @@ struct SplashScreenView: View { Image("SplashLogo") .resizable() .scaledToFit() - .frame(width: 150, height: 150) - .foregroundColor(.white) + .frame(width: Sizes.Size.mediumImage, height: Sizes.Size.mediumImage) + .foregroundColor(AppColors.foregroundColor) } .onAppear { Timer.after { diff --git a/Core/Presentation/Views/LoadingView.struct.swift b/Core/Presentation/Views/LoadingView.struct.swift index 3756a55..0660494 100644 --- a/Core/Presentation/Views/LoadingView.struct.swift +++ b/Core/Presentation/Views/LoadingView.struct.swift @@ -16,7 +16,7 @@ struct LoadingView: View { isLoading = false } } - .frame(height: 250) + .frame(height: Sizes.Size.largeImageHeight) } } } diff --git a/Core/Presentation/Views/RatingConverter.struct.swift b/Core/Presentation/Views/RatingConverter.struct.swift index 5addcab..3de01e7 100644 --- a/Core/Presentation/Views/RatingConverter.struct.swift +++ b/Core/Presentation/Views/RatingConverter.struct.swift @@ -15,12 +15,12 @@ struct RatingView: View { HStack(spacing: 2) { ForEach(1...5, id: \.self) { index in Image(systemName: self.starType(for: index)) - .foregroundColor(.yellow) + .foregroundColor(AppColors.ratingColor) } } .font(.caption) - .padding(.top, 2) - .padding(.bottom, 5) + .padding(.top, Sizes.Padding.extraSmall) + .padding(.bottom, Sizes.Padding.small) } private func starType(for index: Int) -> String { diff --git a/Core/Presentation/Views/RemoteImageView.struct.swift b/Core/Presentation/Views/RemoteImageView.struct.swift index e045a02..f4e955a 100644 --- a/Core/Presentation/Views/RemoteImageView.struct.swift +++ b/Core/Presentation/Views/RemoteImageView.struct.swift @@ -2,13 +2,14 @@ import Foundation import SwiftUI struct RemoteImageView: View { + @StateObject var imageLoader = RemoteImageLoader() let urlString: String let width: CGFloat? let height: CGFloat? let contentMode: ContentMode let showBorder: Bool - + init( urlString: String, width: CGFloat? = nil, @@ -22,7 +23,7 @@ struct RemoteImageView: View { self.contentMode = contentMode self.showBorder = showBorder } - + var body: some View { ZStack { if let uiImage = UIImage(data: imageLoader.imageData) { @@ -30,17 +31,19 @@ struct RemoteImageView: View { .resizable() .aspectRatio(contentMode: contentMode) .frame(width: width, height: height) - .cornerRadius(5) + .cornerRadius(Sizes.CornerRadius.medium) .overlay( showBorder ? - RoundedRectangle(cornerRadius: 10) - .stroke(Color.gray.opacity(0.5), lineWidth: 1) : nil + RoundedRectangle(cornerRadius: Sizes.CornerRadius.large).stroke( + Color.gray.opacity(0.5), + lineWidth: Sizes.FontSize.lineWidth + ) : nil ) } else { Rectangle() .fill(Color.gray.opacity(0.3)) .frame(width: width, height: height) - .cornerRadius(5) + .cornerRadius(Sizes.CornerRadius.medium) ProgressView() .progressViewStyle(CircularProgressViewStyle()) diff --git a/Core/Resources/Colors/AppColors.struct.swift b/Core/Resources/Colors/AppColors.struct.swift new file mode 100644 index 0000000..99009ec --- /dev/null +++ b/Core/Resources/Colors/AppColors.struct.swift @@ -0,0 +1,9 @@ +import SwiftUI + +struct AppColors { + static let selectedForeground = Color.white + static let unselectedForeground = Color.gray + static let ratingColor = Color.yellow + static let foregroundColor = Color.white + static let colorBlack = Color.black +} diff --git a/Core/Resources/Colors/Colors.struct.swift b/Core/Resources/Colors/Colors.struct.swift deleted file mode 100644 index 2570dfd..0000000 --- a/Core/Resources/Colors/Colors.struct.swift +++ /dev/null @@ -1,6 +0,0 @@ -import SwiftUI - -struct Colors { - static let selectedForeground = Color.white - static let unselectedForeground = Color.gray -} diff --git a/Core/Resources/Sizes/Sizes.struct.swift b/Core/Resources/Sizes/Sizes.struct.swift index 5ca9973..fc14dd3 100644 --- a/Core/Resources/Sizes/Sizes.struct.swift +++ b/Core/Resources/Sizes/Sizes.struct.swift @@ -1,10 +1,14 @@ import SwiftUI struct Sizes { + struct Padding { static let standard: CGFloat = 16 - static let small: CGFloat = 8 + static let medium: CGFloat = 8 + static let small: CGFloat = 5 + static let extraSmall: CGFloat = 2 static let buttonHorizontal: CGFloat = 16 + static let xxLarge: CGFloat = 20 } struct Spacing { @@ -16,6 +20,7 @@ struct Sizes { } struct FontSize { + static let lineWidth: CGFloat = 1 static let small: CGFloat = 12 static let medium: CGFloat = 13 static let standard: CGFloat = 16 @@ -27,12 +32,15 @@ struct Sizes { struct Size { static let largeImageHeight: CGFloat = 300 + static let largeImageWidth: CGFloat = 280 static let smallCircle: CGFloat = 10 static let badge: CGFloat = 14 static let buttonHeight: CGFloat = 50 static let buttonWidth: CGFloat = 50 + static let bottomBarHeight: CGFloat = 50 static let icon: CGFloat = 32 static let mediumImage: CGFloat = 140 + static let largeImage: CGFloat = 170 } struct BorderWidth { @@ -41,6 +49,7 @@ struct Sizes { struct CornerRadius { static let small: CGFloat = 3 + static let medium: CGFloat = 5 static let standard: CGFloat = 8 static let large: CGFloat = 10 } diff --git a/Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.struct.swift b/Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.struct.swift index 144e426..2de7512 100644 --- a/Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.struct.swift +++ b/Feature/Home/Presentation/View/ListRecommendation/FullRecommendationListView.struct.swift @@ -2,11 +2,10 @@ import SwiftUI struct FullRecommendationListView: View{ - @EnvironmentObject var navigationManager: NavigationManager - var recommendedProducts: [RecommendedProduct] var title: String + var body: some View { VStack(alignment: .leading) { @@ -14,23 +13,26 @@ struct FullRecommendationListView: View{ ScrollView { Spacer().frame(height: 20) - LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: 16) { + LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: Sizes.Spacing.standard) { ForEach(recommendedProducts, id: \.id) { product in ProductListItemView( product: product, - containerWidth: 170, - containerHeight: 280, - imageWidth: 170, - imageHeight: 170, + containerWidth: Sizes.Size.largeImage, + containerHeight: Sizes.Size.largeImageWidth, + imageWidth: Sizes.Size.largeImage, + imageHeight: Sizes.Size.largeImage, showShopButton: true - ).padding(.bottom,20) + ).padding(.bottom,Sizes.Padding.xxLarge) } } } } .background(Color.white) .onAppear{ - navigationManager.setVisibility(hideToolbar: true, hideBottomBar: false) + navigationManager.setVisibility( + hideToolbar: true, + hideBottomBar: false + ) } } } diff --git a/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift b/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift index 3222fdc..c366b81 100644 --- a/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift +++ b/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift @@ -19,19 +19,19 @@ struct ShortRecommendationListView: View { } ScrollView(.horizontal, showsIndicators: false) { - HStack(spacing: Sizes.Spacing.general) { + HStack(spacing: Sizes.Spacing.standard) { ForEach(recommendedProducts, id: \.id) { product in ProductListItemView( product: product, containerWidth: 140, containerHeight: 270, - imageWidth: Sizes.Size.productImage, - imageHeight: Sizes.Size.productImage, + imageWidth: Sizes.Size.mediumImage, + imageHeight: Sizes.Size.mediumImage, showShopButton: false ) } } - .padding(.horizontal, Sizes.Padding.general) + .padding(.horizontal, Sizes.Padding.standard) } } } diff --git a/Feature/Home/Presentation/View/Stories/StoriesViewController.swift b/Feature/Home/Presentation/View/Stories/Controller/StoriesViewController.swift similarity index 64% rename from Feature/Home/Presentation/View/Stories/StoriesViewController.swift rename to Feature/Home/Presentation/View/Stories/Controller/StoriesViewController.swift index d0f7b67..b4c6c36 100644 --- a/Feature/Home/Presentation/View/Stories/StoriesViewController.swift +++ b/Feature/Home/Presentation/View/Stories/Controller/StoriesViewController.swift @@ -33,21 +33,3 @@ class StoriesViewController: UIViewController { storiesView.configure(sdk: sdk, mainVC: self, code: storiesCode) } } - -struct StoriesViewControllerRepresentable: UIViewControllerRepresentable { - - @Injected var viewModel: HomeViewModel - - func makeUIViewController(context: Context) -> StoriesViewController { - let viewController = StoriesViewController() - return viewController - } - - func updateUIViewController(_ uiViewController: StoriesViewController, context: Context) { - if let sdk = viewModel.sdkManager.sdk { - uiViewController.configure(with: sdk) - } else { - print("StoriesViewControllerRepresentable: SDK not found") - } - } -} diff --git a/Feature/Home/Presentation/View/Stories/Controller/StoriesViewControllerRepresentable.struct.swift b/Feature/Home/Presentation/View/Stories/Controller/StoriesViewControllerRepresentable.struct.swift new file mode 100644 index 0000000..91f1efd --- /dev/null +++ b/Feature/Home/Presentation/View/Stories/Controller/StoriesViewControllerRepresentable.struct.swift @@ -0,0 +1,22 @@ +import SwiftUI +import UIKit +import REES46 +import Resolver + +struct StoriesViewControllerRepresentable: UIViewControllerRepresentable { + + @Injected var viewModel: HomeViewModel + + func makeUIViewController(context: Context) -> StoriesViewController { + let viewController = StoriesViewController() + return viewController + } + + func updateUIViewController(_ uiViewController: StoriesViewController, context: Context) { + if let sdk = viewModel.sdkManager.sdk { + uiViewController.configure(with: sdk) + } else { + print("StoriesViewControllerRepresentable: SDK not found") + } + } +} diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 132f2a9..9fe9d66 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -19,7 +19,7 @@ 7559449F2C357E5C00C274C9 /* SplashScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7559449E2C357E5C00C274C9 /* SplashScreenView.struct.swift */; }; 75674CDC2C3C1A67007FAB88 /* ListDiscoverProductsView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.struct.swift */; }; 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift */; }; - 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */; }; + 75674CEF2C3D39F9007FAB88 /* StoriesViewControllerRepresentable.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CEE2C3D39F9007FAB88 /* StoriesViewControllerRepresentable.struct.swift */; }; 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.struct.swift */; }; 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift */; }; 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */; }; @@ -34,9 +34,9 @@ 75A4D6162C5D0AD400929368 /* Sizes.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */; }; 75A4D6172C5D0AD400929368 /* Sizes.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */; }; 75A4D6182C5D0AD400929368 /* Sizes.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */; }; - 75A4D61A2C5D0AE800929368 /* Colors.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6192C5D0AE800929368 /* Colors.struct.swift */; }; - 75A4D61B2C5D0AE800929368 /* Colors.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6192C5D0AE800929368 /* Colors.struct.swift */; }; - 75A4D61C2C5D0AE800929368 /* Colors.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6192C5D0AE800929368 /* Colors.struct.swift */; }; + 75A4D61A2C5D0AE800929368 /* AppColors.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6192C5D0AE800929368 /* AppColors.struct.swift */; }; + 75A4D61B2C5D0AE800929368 /* AppColors.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6192C5D0AE800929368 /* AppColors.struct.swift */; }; + 75A4D61C2C5D0AE800929368 /* AppColors.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6192C5D0AE800929368 /* AppColors.struct.swift */; }; 75B935572C3564360063E814 /* DemoStoreApp.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935562C3564360063E814 /* DemoStoreApp.struct.swift */; }; 75B935592C3564360063E814 /* ContentView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.struct.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; @@ -45,6 +45,7 @@ 75BAD47F2C60D97B00DFFF02 /* ProductInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD47A2C60D91700DFFF02 /* ProductInfoView.swift */; }; 75BAD4802C60D98700DFFF02 /* PriceAndShopButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4782C60D8EA00DFFF02 /* PriceAndShopButtonView.swift */; }; 75BAD4832C60DB1C00DFFF02 /* ProductImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD47C2C60D95F00DFFF02 /* ProductImageView.swift */; }; + 75BAD4892C60DC4F00DFFF02 /* StoriesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4852C60DBFE00DFFF02 /* StoriesViewController.swift */; }; 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */; }; 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */; }; 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */; }; @@ -169,7 +170,7 @@ 7559449E2C357E5C00C274C9 /* SplashScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenView.struct.swift; sourceTree = ""; }; 75674CDB2C3C1A67007FAB88 /* ListDiscoverProductsView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListDiscoverProductsView.struct.swift; sourceTree = ""; }; 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeStoriesContainerView.struct.swift; sourceTree = ""; }; - 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; + 75674CEE2C3D39F9007FAB88 /* StoriesViewControllerRepresentable.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewControllerRepresentable.struct.swift; sourceTree = ""; }; 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionHeaderView.struct.swift; sourceTree = ""; }; 75674CF42C3D92CC007FAB88 /* Product.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Product.struct.swift; sourceTree = ""; }; 75674CF62C3D92E0007FAB88 /* RecommendedProduct.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProduct.struct.swift; sourceTree = ""; }; @@ -186,7 +187,7 @@ 75A4D5B12C579A4900929368 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; 75A4D60D2C5CD80500929368 /* RemoteImageView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageView.struct.swift; sourceTree = ""; }; 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sizes.struct.swift; sourceTree = ""; }; - 75A4D6192C5D0AE800929368 /* Colors.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.struct.swift; sourceTree = ""; }; + 75A4D6192C5D0AE800929368 /* AppColors.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppColors.struct.swift; sourceTree = ""; }; 75B935532C3564360063E814 /* demo-store-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "demo-store-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 75B935562C3564360063E814 /* DemoStoreApp.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoStoreApp.struct.swift; sourceTree = ""; }; 75B935582C3564360063E814 /* ContentView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.struct.swift; sourceTree = ""; }; @@ -196,6 +197,7 @@ 75BAD4782C60D8EA00DFFF02 /* PriceAndShopButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceAndShopButtonView.swift; sourceTree = ""; }; 75BAD47A2C60D91700DFFF02 /* ProductInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductInfoView.swift; sourceTree = ""; }; 75BAD47C2C60D95F00DFFF02 /* ProductImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductImageView.swift; sourceTree = ""; }; + 75BAD4852C60DBFE00DFFF02 /* StoriesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoriesViewController.swift; sourceTree = ""; }; 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.struct.swift; sourceTree = ""; }; 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbarView.struct.swift; sourceTree = ""; }; 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.struct.swift; sourceTree = ""; }; @@ -279,8 +281,8 @@ 75674CEA2C3D2E32007FAB88 /* Stories */ = { isa = PBXGroup; children = ( + 75BAD4842C60DBE800DFFF02 /* Controller */, 75674CDD2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift */, - 75674CEE2C3D39F9007FAB88 /* StoriesViewController.swift */, ); path = Stories; sourceTree = ""; @@ -322,7 +324,7 @@ 75A4D6132C5D09BB00929368 /* Colors */ = { isa = PBXGroup; children = ( - 75A4D6192C5D0AE800929368 /* Colors.struct.swift */, + 75A4D6192C5D0AE800929368 /* AppColors.struct.swift */, ); path = Colors; sourceTree = ""; @@ -428,6 +430,15 @@ path = Button; sourceTree = ""; }; + 75BAD4842C60DBE800DFFF02 /* Controller */ = { + isa = PBXGroup; + children = ( + 75674CEE2C3D39F9007FAB88 /* StoriesViewControllerRepresentable.struct.swift */, + 75BAD4852C60DBFE00DFFF02 /* StoriesViewController.swift */, + ); + path = Controller; + sourceTree = ""; + }; 75E979842C4935170081B069 /* Core */ = { isa = PBXGroup; children = ( @@ -1151,7 +1162,7 @@ 75ECCD102C36BE2000D6D346 /* ProductsScreenView.struct.swift in Sources */, 75E97A492C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, 75E97AB02C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */, - 75674CEF2C3D39F9007FAB88 /* StoriesViewController.swift in Sources */, + 75674CEF2C3D39F9007FAB88 /* StoriesViewControllerRepresentable.struct.swift in Sources */, 75E979E72C4AE8870081B069 /* TabItem.struct.swift in Sources */, 75E97A6B2C5037130081B069 /* MainViews.struct.swift in Sources */, 75E97A882C51414D0081B069 /* CartRepositoryProtocol.swift in Sources */, @@ -1184,13 +1195,14 @@ 75E97A232C5023600081B069 /* SearchFilter.struct.swift in Sources */, 75BAD47F2C60D97B00DFFF02 /* ProductInfoView.swift in Sources */, 75E97A5A2C502DBF0081B069 /* SearchProductResponseMapper.swift in Sources */, - 75A4D61A2C5D0AE800929368 /* Colors.struct.swift in Sources */, + 75A4D61A2C5D0AE800929368 /* AppColors.struct.swift in Sources */, 752F1D4B2C46A363002D4AC3 /* SearchProductResponse.struct.swift in Sources */, 75E97A4D2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, 75E979F12C4D2DBE0081B069 /* Timer.swift in Sources */, 75E979F72C4D37940081B069 /* ViewState.enum.swift in Sources */, 75E97A2B2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift in Sources */, + 75BAD4892C60DC4F00DFFF02 /* StoriesViewController.swift in Sources */, 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, 75E97A272C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */, 75E979D02C4974440081B069 /* CartListView.struct.swift in Sources */, @@ -1216,7 +1228,7 @@ 75E97A4A2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */, 75E97A422C5025080081B069 /* SearchCategory.struct.swift in Sources */, - 75A4D61B2C5D0AE800929368 /* Colors.struct.swift in Sources */, + 75A4D61B2C5D0AE800929368 /* AppColors.struct.swift in Sources */, 75E97A832C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 75A4D6172C5D0AD400929368 /* Sizes.struct.swift in Sources */, 75E97A242C5023600081B069 /* SearchFilter.struct.swift in Sources */, @@ -1238,7 +1250,7 @@ 75E97A4F2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, 75E97A472C5025240081B069 /* SearchQuery.struct.swift in Sources */, 75E97A432C5025080081B069 /* SearchCategory.struct.swift in Sources */, - 75A4D61C2C5D0AE800929368 /* Colors.struct.swift in Sources */, + 75A4D61C2C5D0AE800929368 /* AppColors.struct.swift in Sources */, 75E97A842C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 75A4D6182C5D0AD400929368 /* Sizes.struct.swift in Sources */, 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */, From 35291d5a7cfbd4ac14e3ddcd262541251d43b775 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Mon, 5 Aug 2024 14:00:50 +0200 Subject: [PATCH 81/85] refactor(app): Separate product view --- App/Views/BottomBar/button/TabBarButton.swift | 2 +- .../Screens/ProductsScreenView.struct.swift | 230 ++---------------- .../Screens/SplashScreenView.struct.swift | 2 +- .../Views/LoadingView.struct.swift | 2 +- Core/Resources/Colors/AppColors.struct.swift | 5 +- Core/Resources/Sizes/Sizes.struct.swift | 6 +- Core/Resources/Strings/Localizable.xcstrings | 3 - .../Button/ActionSectionView.struct.swift | 35 +++ ...ft => PriceAndShopButtonView.struct.swift} | 0 .../Counter/CounterSectionView.struct.swift | 41 ++++ .../ProductDetailsSectionView.struct.swift | 45 ++++ ...ew.swift => ProductImageView.struct.swift} | 0 .../ProductImagesSectionView.struct.swift | 37 +++ .../View/Price/PriceSectionView.struct.swift | 37 +++ ...iew.swift => ProductInfoView.struct.swift} | 0 .../TopAppBar/TopSectionView.struct.swift | 16 ++ demo-store-ios.xcodeproj/project.pbxproj | 84 ++++++- 17 files changed, 316 insertions(+), 229 deletions(-) create mode 100644 Feature/Product/Presentation/View/Button/ActionSectionView.struct.swift rename Feature/Product/Presentation/View/Button/{PriceAndShopButtonView.swift => PriceAndShopButtonView.struct.swift} (100%) create mode 100644 Feature/Product/Presentation/View/Counter/CounterSectionView.struct.swift create mode 100644 Feature/Product/Presentation/View/Description/ProductDetailsSectionView.struct.swift rename Feature/Product/Presentation/View/Image/{ProductImageView.swift => ProductImageView.struct.swift} (100%) create mode 100644 Feature/Product/Presentation/View/Image/ProductImagesSectionView.struct.swift create mode 100644 Feature/Product/Presentation/View/Price/PriceSectionView.struct.swift rename Feature/Product/Presentation/View/Text/{ProductInfoView.swift => ProductInfoView.struct.swift} (100%) create mode 100644 Feature/Product/Presentation/View/TopAppBar/TopSectionView.struct.swift diff --git a/App/Views/BottomBar/button/TabBarButton.swift b/App/Views/BottomBar/button/TabBarButton.swift index 95b97c0..9014e49 100644 --- a/App/Views/BottomBar/button/TabBarButton.swift +++ b/App/Views/BottomBar/button/TabBarButton.swift @@ -10,7 +10,7 @@ struct TabBarButton: View { .resizable() .renderingMode(.template) .frame(width: Sizes.Size.icon, height: Sizes.Size.icon) - .foregroundColor(isSelected ? AppColors.selectedForeground : AppColors.unselectedForeground) + .foregroundColor(isSelected ? AppColors.selectedForeground : AppColors.colorGray) } } } diff --git a/App/Views/Screens/ProductsScreenView.struct.swift b/App/Views/Screens/ProductsScreenView.struct.swift index 79e0996..16def9c 100644 --- a/App/Views/Screens/ProductsScreenView.struct.swift +++ b/App/Views/Screens/ProductsScreenView.struct.swift @@ -22,227 +22,41 @@ struct ProductsScreenView: View { ScrollView { VStack(alignment: .leading) { if isLoading { + LoadingView(isLoading: $isLoading) } else { - if product != nil { - topSection - - productImagesSection - - productDetailsSection - - priceSection - - actionSection - + if let product = product { + TopSectionView(product: product) + ProductImagesSectionView(product: product, selectedImageIndex: $selectedImageIndex) + ProductDetailsSectionView(product: product) + PriceSectionView(product: product) + ActionSectionView(product: product, counter: $counter, viewModel: viewModel) } else { Text("empty_products_title") .font(.headline) - .foregroundColor(.black) + .foregroundColor(AppColors.colorBlack) .padding() - .frame(height:300) + .frame(height: Sizes.Size.largeImageSize) } - recomendSection - } - } - .background(Color.white) - } - .onAppear { - navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) - } - } - - private var topSection: some View { - VStack(alignment: .leading) { - Spacer().frame(height: 20) - Text("Home / \(product?.name ?? "") / \(product?.brand ?? "")") - .font(.system(size: 14)) - .foregroundColor(.gray) - Spacer().frame(height: 20) - }.padding(.horizontal) - } - - private var productImagesSection: some View { - VStack { - if let product = product { - let imageUrls = Array(product.resizedImages.values.sorted()) - - TabView(selection: $selectedImageIndex) { - ForEach(imageUrls.indices, id: \.self) { index in - RemoteImageView( - urlString: imageUrls[index], - width: 350, - height: 350, - contentMode: .fit, - showBorder: false - ).tag(index) - } - } - .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never)) - .frame(height: 300) - - Spacer().frame(height: 20) - - HStack { - ForEach(0.. 0 { - counter -= 1 - } - } - ) { - Text("-") - .font(.system(size: 20, weight: .bold)) - .foregroundColor(.black) - .frame(width: 50, height: 50) - .background(Color.white) - } - - Text("\(counter)") - .font(.system(size: 20, weight: .bold)) - .foregroundColor(.black) - .frame(width: 50, height: 50) - .background(Color.white) - - Button(action: { - counter += 1 - }) { - Text("+") - .font(.system(size: 20, weight: .bold)) - .foregroundColor(.black) - .frame(width: 50, height: 50) - .background(Color.white) - } } } } diff --git a/App/Views/Screens/SplashScreenView.struct.swift b/App/Views/Screens/SplashScreenView.struct.swift index 23f0b85..aaedc0b 100644 --- a/App/Views/Screens/SplashScreenView.struct.swift +++ b/App/Views/Screens/SplashScreenView.struct.swift @@ -11,7 +11,7 @@ struct SplashScreenView: View { .resizable() .scaledToFit() .frame(width: Sizes.Size.mediumImage, height: Sizes.Size.mediumImage) - .foregroundColor(AppColors.foregroundColor) + .foregroundColor(AppColors.colorWhite) } .onAppear { Timer.after { diff --git a/Core/Presentation/Views/LoadingView.struct.swift b/Core/Presentation/Views/LoadingView.struct.swift index 0660494..d6d327b 100644 --- a/Core/Presentation/Views/LoadingView.struct.swift +++ b/Core/Presentation/Views/LoadingView.struct.swift @@ -16,7 +16,7 @@ struct LoadingView: View { isLoading = false } } - .frame(height: Sizes.Size.largeImageHeight) + .frame(height: Sizes.Size.largeImageSize) } } } diff --git a/Core/Resources/Colors/AppColors.struct.swift b/Core/Resources/Colors/AppColors.struct.swift index 99009ec..139b42d 100644 --- a/Core/Resources/Colors/AppColors.struct.swift +++ b/Core/Resources/Colors/AppColors.struct.swift @@ -2,8 +2,9 @@ import SwiftUI struct AppColors { static let selectedForeground = Color.white - static let unselectedForeground = Color.gray + static let colorGray = Color.gray static let ratingColor = Color.yellow - static let foregroundColor = Color.white + static let colorWhite = Color.white static let colorBlack = Color.black + static let colorRed = Color.red } diff --git a/Core/Resources/Sizes/Sizes.struct.swift b/Core/Resources/Sizes/Sizes.struct.swift index fc14dd3..e79276b 100644 --- a/Core/Resources/Sizes/Sizes.struct.swift +++ b/Core/Resources/Sizes/Sizes.struct.swift @@ -8,6 +8,7 @@ struct Sizes { static let small: CGFloat = 5 static let extraSmall: CGFloat = 2 static let buttonHorizontal: CGFloat = 16 + static let xLarge: CGFloat = 10 static let xxLarge: CGFloat = 20 } @@ -31,7 +32,8 @@ struct Sizes { } struct Size { - static let largeImageHeight: CGFloat = 300 + static let xxLargeImageSize: CGFloat = 350 + static let largeImageSize: CGFloat = 300 static let largeImageWidth: CGFloat = 280 static let smallCircle: CGFloat = 10 static let badge: CGFloat = 14 @@ -41,6 +43,8 @@ struct Sizes { static let icon: CGFloat = 32 static let mediumImage: CGFloat = 140 static let largeImage: CGFloat = 170 + static let textFrameWidth: CGFloat = 46 + static let textFrameHeight: CGFloat = 14 } struct BorderWidth { diff --git a/Core/Resources/Strings/Localizable.xcstrings b/Core/Resources/Strings/Localizable.xcstrings index a1f72af..2e13dd1 100644 --- a/Core/Resources/Strings/Localizable.xcstrings +++ b/Core/Resources/Strings/Localizable.xcstrings @@ -193,9 +193,6 @@ } } } - }, - "No product data available" : { - }, "process_timeout_title" : { "extractionState" : "manual", diff --git a/Feature/Product/Presentation/View/Button/ActionSectionView.struct.swift b/Feature/Product/Presentation/View/Button/ActionSectionView.struct.swift new file mode 100644 index 0000000..b282e70 --- /dev/null +++ b/Feature/Product/Presentation/View/Button/ActionSectionView.struct.swift @@ -0,0 +1,35 @@ +import SwiftUI + +struct ActionSectionView: View { + + var product: RecommendedProduct + @Binding var counter: Int + var viewModel: ProductsViewModel + + var body: some View { + HStack { + CounterSectionView(counter: $counter) + .frame(height: Sizes.Size.buttonHeight) + .background(AppColors.colorWhite) + .border(AppColors.colorGray, width: Sizes.BorderWidth.standard) + .cornerRadius(Sizes.CornerRadius.medium) + + Spacer().frame(width: Sizes.Spacing.standard) + + Button( + action: { + viewModel.addToCart(product: product, quantity: counter) + } + ) { + Text("add_to_cart_button_title") + .font(.system(size: Sizes.FontSize.medium, weight: .bold)) + .foregroundColor(AppColors.colorWhite) + .frame(maxWidth: .infinity, maxHeight: Sizes.Size.buttonHeight) + .background(AppColors.colorBlack) + .cornerRadius(Sizes.CornerRadius.standard) + } + } + .padding(.horizontal) + .frame(height: 50) + } +} diff --git a/Feature/Product/Presentation/View/Button/PriceAndShopButtonView.swift b/Feature/Product/Presentation/View/Button/PriceAndShopButtonView.struct.swift similarity index 100% rename from Feature/Product/Presentation/View/Button/PriceAndShopButtonView.swift rename to Feature/Product/Presentation/View/Button/PriceAndShopButtonView.struct.swift diff --git a/Feature/Product/Presentation/View/Counter/CounterSectionView.struct.swift b/Feature/Product/Presentation/View/Counter/CounterSectionView.struct.swift new file mode 100644 index 0000000..5e9686c --- /dev/null +++ b/Feature/Product/Presentation/View/Counter/CounterSectionView.struct.swift @@ -0,0 +1,41 @@ +import SwiftUI + +struct CounterSectionView: View { + @Binding var counter: Int + + var body: some View { + HStack(spacing: 0) { + Button( + action: { + if counter > 0 { + counter -= 1 + } + } + ) { + Text("-") + .font(.system(size: Sizes.FontSize.xxLarge, weight: .bold)) + .foregroundColor(AppColors.colorBlack) + .background(AppColors.colorWhite) + .frame(width: Sizes.Size.buttonHeight, height: Sizes.Size.buttonHeight) + } + + Text("\(counter)") + .font(.system(size: Sizes.FontSize.xxLarge, weight: .bold)) + .foregroundColor(AppColors.colorBlack) + .background(AppColors.colorWhite) + .frame(width: Sizes.Size.buttonHeight, height: Sizes.Size.buttonHeight) + + Button( + action: { + counter += 1 + } + ) { + Text("+") + .font(.system(size: Sizes.FontSize.xxLarge, weight: .bold)) + .foregroundColor(AppColors.colorBlack) + .background(AppColors.colorWhite) + .frame(width: Sizes.Size.buttonHeight, height: Sizes.Size.buttonHeight) + } + } + } +} diff --git a/Feature/Product/Presentation/View/Description/ProductDetailsSectionView.struct.swift b/Feature/Product/Presentation/View/Description/ProductDetailsSectionView.struct.swift new file mode 100644 index 0000000..409917e --- /dev/null +++ b/Feature/Product/Presentation/View/Description/ProductDetailsSectionView.struct.swift @@ -0,0 +1,45 @@ +import SwiftUI + +struct ProductDetailsSectionView: View { + + var product: RecommendedProduct + + var body: some View { + VStack(alignment: .leading) { + + Spacer().frame(height: Sizes.Spacing.large) + Text(product.brand) + .font(.system(size: Sizes.FontSize.standard)) + .foregroundColor(AppColors.colorBlack) + .lineLimit(1) + Spacer().frame(height: Sizes.Spacing.small) + + Text(product.name) + .font(.system(size: Sizes.FontSize.xxxLarge, weight: .bold)) + .foregroundColor(AppColors.colorBlack) + .lineLimit(1) + Spacer().frame(height: Sizes.Spacing.medium) + + HStack { + RatingView(rating: Double(product.rating)) + + Spacer().frame(width: Sizes.Spacing.medium) + Text("\(Int.random(in: 1...100))") + .font(.system(size: Sizes.FontSize.small)) + .foregroundColor(AppColors.colorBlack) + .lineLimit(1) + Text("rating_reviews") + .font(.system(size: Sizes.FontSize.small)) + .foregroundColor(AppColors.colorBlack) + .lineLimit(1) + } + + Spacer().frame(height: Sizes.Spacing.medium) + Text(product.description) + .font(.system(size: Sizes.FontSize.medium, weight: .regular)) + .foregroundColor(AppColors.colorBlack) + .lineSpacing(Sizes.Padding.medium) + } + .padding(.horizontal) + } +} diff --git a/Feature/Product/Presentation/View/Image/ProductImageView.swift b/Feature/Product/Presentation/View/Image/ProductImageView.struct.swift similarity index 100% rename from Feature/Product/Presentation/View/Image/ProductImageView.swift rename to Feature/Product/Presentation/View/Image/ProductImageView.struct.swift diff --git a/Feature/Product/Presentation/View/Image/ProductImagesSectionView.struct.swift b/Feature/Product/Presentation/View/Image/ProductImagesSectionView.struct.swift new file mode 100644 index 0000000..8056c80 --- /dev/null +++ b/Feature/Product/Presentation/View/Image/ProductImagesSectionView.struct.swift @@ -0,0 +1,37 @@ +import SwiftUI + +struct ProductImagesSectionView: View { + var product: RecommendedProduct + @Binding var selectedImageIndex: Int + + var body: some View { + VStack { + let imageUrls = Array(product.resizedImages.values.sorted()) + TabView(selection: $selectedImageIndex) { + ForEach(imageUrls.indices, id: \.self) { index in + RemoteImageView( + urlString: imageUrls[index], + width: Sizes.Size.xxLargeImageSize, + height: Sizes.Size.xxLargeImageSize, + contentMode: .fit, + showBorder: false + ).tag(index) + } + } + .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never)) + .frame(height: Sizes.Size.largeImage) + + Spacer().frame(height: Sizes.Spacing.large) + + HStack { + ForEach(0.. Date: Mon, 5 Aug 2024 15:02:50 +0200 Subject: [PATCH 82/85] refactor(app): Separate cart view and cart items & add reusable sizes --- App/Views/Screens/CartScreenView.struct.swift | 125 ++---------------- .../Screens/SettingsScreenView.struct.swift | 21 +-- .../Screens/SplashScreenView.struct.swift | 7 +- Core/Resources/Sizes/Sizes.struct.swift | 9 +- .../Button/NavigationButtonsView.struct.swift | 46 +++++++ .../View/Button/RemoveButtonView.struct.swift | 16 +++ .../View/CartListItemView.struct.swift | 63 --------- .../EmptyCartView.struct.swift | 19 +++ .../ListItem/CartListItemView.struct.swift | 51 +++++++ .../View/Price/TotalPriceSection.struct.swift | 36 +++++ .../SettingsErrorScreenView.struct.swift | 19 +++ .../SettingsErrroScreenView.struct.swift | 20 +-- .../SettingsInputCodeView.struct.swift | 0 demo-store-ios.xcodeproj/project.pbxproj | 90 ++++++++++++- 14 files changed, 306 insertions(+), 216 deletions(-) create mode 100644 Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift create mode 100644 Feature/Cart/Presentation/View/Button/RemoveButtonView.struct.swift delete mode 100644 Feature/Cart/Presentation/View/CartListItemView.struct.swift create mode 100644 Feature/Cart/Presentation/View/EmptyScreenState/EmptyCartView.struct.swift create mode 100644 Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift create mode 100644 Feature/Cart/Presentation/View/Price/TotalPriceSection.struct.swift create mode 100644 Feature/Settings/Presentation/View/Errors/SettingsErrorScreenView.struct.swift rename Feature/Settings/Presentation/View/{ => Errors}/SettingsErrroScreenView.struct.swift (56%) rename Feature/Settings/Presentation/View/{ => TextInput}/SettingsInputCodeView.struct.swift (100%) diff --git a/App/Views/Screens/CartScreenView.struct.swift b/App/Views/Screens/CartScreenView.struct.swift index 538ea35..f5ee370 100644 --- a/App/Views/Screens/CartScreenView.struct.swift +++ b/App/Views/Screens/CartScreenView.struct.swift @@ -29,20 +29,20 @@ struct CartScreenView: View { var body: some View { ScrollView { VStack(spacing: 0) { - Spacer().frame(height: 20) + Spacer().frame(height: Sizes.Spacing.large) if isLoading { LoadingView(isLoading: $isLoading) } else if viewModel.cartItems.isEmpty { EmptyCartView() - .frame(height: 250) + .frame(height: Sizes.Size.largeContainerHeight) } else { CartListView( cartItems: viewModel.cartItems, removeFromCart: { productId in viewModel.removeFromCart(productId: productId) } - ).frame(height: 250) + ).frame(height: Sizes.Size.largeContainerHeight) TotalPriceSection(totalPrice: totalPrice) @@ -52,7 +52,12 @@ struct CartScreenView: View { } if !isLoading { - RecommendationSection(recommendedProducts: viewModel.recommenderProducts) + ShortRecommendationListView( + recommendedProducts: viewModel.recommenderProducts, + title: NSLocalizedString("recommend_like_title", comment: "") + ) + .padding(.vertical,Sizes.Spacing.extraLarge) + .background(AppColors.colorWhite) } } .navigationBarTitle("cart_tab_title") @@ -63,115 +68,3 @@ struct CartScreenView: View { } } } - -struct EmptyCartView: View { - var body: some View { - VStack { - Spacer() - Text("empty_cart_title") - .font(.system(size: 18, weight: .bold)) - .foregroundColor(.gray) - Spacer() - } - .frame(maxWidth: .infinity, maxHeight: .infinity) - } -} - -struct RecommendationSection: View { - var recommendedProducts: [RecommendedProduct] - - var body: some View { - VStack { - Spacer().frame(height: 36) - - ShortRecommendationListView( - recommendedProducts: recommendedProducts, - title: NSLocalizedString("recommend_like_title", comment: "") - ) - - Spacer().frame(height: 36) - } - .background(Color.white) - .listRowInsets(EdgeInsets()) - } -} - -struct TotalPriceSection: View { - var totalPrice: Int - - var body: some View { - VStack(alignment: .trailing, spacing: 12) { - Spacer().frame(height: 10) - - HStack { - Spacer() - Text("shipping_title") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding(.trailing, 12) - - Text("Free") - .font(.system(size: 16, weight: .bold)) - .foregroundColor(.black) - } - - HStack { - Spacer() - Text("total_title") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding(.trailing, 12) - - Text("\(totalPrice)") - .font(.system(size: 16, weight: .bold)) - .foregroundColor(.black) - } - } - .padding(.horizontal) - } -} - -struct NavigationButtonsView: View { - - @ObservedObject var navigationManager: NavigationManager - - var body: some View { - VStack{ - HStack(spacing: 16) { - Button( - action: { - navigationManager.navigateBack() - } - ) { - Text("continue_button") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding() - .frame(maxWidth: .infinity) - .background(Color.white) - .cornerRadius(10) - .overlay( - RoundedRectangle(cornerRadius: 10) - .stroke(Color.black, lineWidth: 1) - ) - } - - Button( - action: { - // TODO Make purchase - } - ) { - Text("checkout_button") - .font(.system(size: 16)) - .foregroundColor(.white) - .padding() - .frame(maxWidth: .infinity) - .background(Color.black) - .cornerRadius(10) - } - } - .padding(.horizontal) - .padding(.vertical, 20) - } - } -} diff --git a/App/Views/Screens/SettingsScreenView.struct.swift b/App/Views/Screens/SettingsScreenView.struct.swift index acf20db..c6eedab 100644 --- a/App/Views/Screens/SettingsScreenView.struct.swift +++ b/App/Views/Screens/SettingsScreenView.struct.swift @@ -40,10 +40,9 @@ struct SettingsScreenView: View { } .padding() .navigationTitle("settings_tab_title") - .background(Color.white.edgesIgnoringSafeArea(.all)) + .background(AppColors.colorWhite.edgesIgnoringSafeArea(.all)) .onAppear{ navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) - //TODO: Chage to real loading loadData() } } @@ -59,21 +58,3 @@ struct SettingsScreenView: View { } } } - -struct SettingsErrorScreenView: View { - let errorMessage: String - let retryAction: () -> Void - - var body: some View { - VStack { - Text(errorMessage) - .foregroundColor(.red) - .padding() - - Button("retry_button_title") { - retryAction() - } - .padding() - } - } -} diff --git a/App/Views/Screens/SplashScreenView.struct.swift b/App/Views/Screens/SplashScreenView.struct.swift index aaedc0b..98e5ddb 100644 --- a/App/Views/Screens/SplashScreenView.struct.swift +++ b/App/Views/Screens/SplashScreenView.struct.swift @@ -5,12 +5,15 @@ struct SplashScreenView: View { var body: some View { ZStack { - Color.black.edgesIgnoringSafeArea(.all) + AppColors.colorBlack.edgesIgnoringSafeArea(.all) Image("SplashLogo") .resizable() .scaledToFit() - .frame(width: Sizes.Size.mediumImage, height: Sizes.Size.mediumImage) + .frame( + width: Sizes.Size.mediumImage, + height: Sizes.Size.mediumImage + ) .foregroundColor(AppColors.colorWhite) } .onAppear { diff --git a/Core/Resources/Sizes/Sizes.struct.swift b/Core/Resources/Sizes/Sizes.struct.swift index e79276b..f5c2bd7 100644 --- a/Core/Resources/Sizes/Sizes.struct.swift +++ b/Core/Resources/Sizes/Sizes.struct.swift @@ -8,7 +8,8 @@ struct Sizes { static let small: CGFloat = 5 static let extraSmall: CGFloat = 2 static let buttonHorizontal: CGFloat = 16 - static let xLarge: CGFloat = 10 + static let large: CGFloat = 10 + static let xLarge: CGFloat = 12 static let xxLarge: CGFloat = 20 } @@ -23,18 +24,22 @@ struct Sizes { struct FontSize { static let lineWidth: CGFloat = 1 static let small: CGFloat = 12 - static let medium: CGFloat = 13 + static let medium: CGFloat = 14 static let standard: CGFloat = 16 static let large: CGFloat = 17 static let extraLarge: CGFloat = 18 static let xxLarge: CGFloat = 20 static let xxxLarge: CGFloat = 24 + static let enormous: CGFloat = 32 } struct Size { static let xxLargeImageSize: CGFloat = 350 + static let smallIconSize: CGFloat = 24 + static let smallImageSize: CGFloat = 64 static let largeImageSize: CGFloat = 300 static let largeImageWidth: CGFloat = 280 + static let largeContainerHeight: CGFloat = 250 static let smallCircle: CGFloat = 10 static let badge: CGFloat = 14 static let buttonHeight: CGFloat = 50 diff --git a/Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift b/Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift new file mode 100644 index 0000000..5732d0f --- /dev/null +++ b/Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift @@ -0,0 +1,46 @@ +import SwiftUI + +struct NavigationButtonsView: View { + + @ObservedObject var navigationManager: NavigationManager + + var body: some View { + VStack{ + HStack(spacing: Sizes.Spacing.standard) { + Button( + action: { + navigationManager.navigateBack() + } + ) { + Text("continue_button") + .font(.system(size: Sizes.Spacing.standard)) + .foregroundColor(AppColors.colorBlack) + .padding() + .frame(maxWidth: .infinity) + .background(AppColors.colorWhite) + .cornerRadius(Sizes.CornerRadius.standard) + .overlay( + RoundedRectangle(cornerRadius: Sizes.CornerRadius.standard) + .stroke(Color.black, lineWidth: Sizes.BorderWidth.standard) + ) + } + + Button( + action: { + // TODO Make purchase + } + ) { + Text("checkout_button") + .font(.system(size: Sizes.FontSize.standard)) + .foregroundColor(AppColors.colorWhite) + .padding() + .frame(maxWidth: .infinity) + .background(AppColors.colorBlack) + .cornerRadius(Sizes.CornerRadius.large) + } + } + .padding(.horizontal) + .padding(.vertical, Sizes.Padding.xxLarge) + } + } +} diff --git a/Feature/Cart/Presentation/View/Button/RemoveButtonView.struct.swift b/Feature/Cart/Presentation/View/Button/RemoveButtonView.struct.swift new file mode 100644 index 0000000..680750d --- /dev/null +++ b/Feature/Cart/Presentation/View/Button/RemoveButtonView.struct.swift @@ -0,0 +1,16 @@ +import SwiftUI + +struct RemoveButtonView: View { + var action: () -> Void + + var body: some View { + Button(action: action) { + Image(systemName: "xmark") + .foregroundColor(AppColors.colorWhite) + .frame(width: Sizes.Size.smallIconSize, height: Sizes.Size.smallIconSize) + .background(AppColors.colorGray) + .clipShape(Circle()) + } + .buttonStyle(BorderlessButtonStyle()) + } +} diff --git a/Feature/Cart/Presentation/View/CartListItemView.struct.swift b/Feature/Cart/Presentation/View/CartListItemView.struct.swift deleted file mode 100644 index 39a8e27..0000000 --- a/Feature/Cart/Presentation/View/CartListItemView.struct.swift +++ /dev/null @@ -1,63 +0,0 @@ - -import SwiftUI - -struct CartListItemView: View { - var cartItem: ProductCartItem - var removeFromCart: () -> Void - - var body: some View { - VStack(spacing: 0) { - HStack(spacing: 16) { - RemoteImageView( - urlString: cartItem.product.imageUrl, - width: 64, - height: 64, - contentMode: .fit, - showBorder: false - ) - - VStack(alignment: .leading, spacing: 4) { - Text(cartItem.product.brand) - .font(.system(size: 12)) - .foregroundColor(.gray) - - Text(cartItem.product.name) - .font(.system(size: 16)) - .foregroundColor(.black) - .lineLimit(1) - .truncationMode(.tail) - - Text(String(format: NSLocalizedString("quantity_title", comment: ""), "\(cartItem.quantity)")) - .font(.system(size: 14)) - .foregroundColor(.black) - } - .frame(maxWidth: .infinity, alignment: .leading) - - Text(cartItem.product.priceFormatted ?? "") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding(.trailing, 12) - - Button( - action: { - removeFromCart() - } - ) { - Image(systemName: "xmark") - .foregroundColor(.white) - .frame(width: 24, height: 24) - .background(Color.gray) - .clipShape(Circle()) - } - .buttonStyle(BorderlessButtonStyle()) - } - .padding(.vertical, 8) - .background(Color.white) - - Divider() - } - .listRowInsets(EdgeInsets()) - .background(Color.clear) - .padding(.horizontal) - } -} diff --git a/Feature/Cart/Presentation/View/EmptyScreenState/EmptyCartView.struct.swift b/Feature/Cart/Presentation/View/EmptyScreenState/EmptyCartView.struct.swift new file mode 100644 index 0000000..3afac4c --- /dev/null +++ b/Feature/Cart/Presentation/View/EmptyScreenState/EmptyCartView.struct.swift @@ -0,0 +1,19 @@ +import SwiftUI + +struct EmptyCartView: View { + var body: some View { + VStack { + Spacer() + Text("empty_cart_title") + .font( + .system( + size: Sizes.FontSize.extraLarge, + weight: .bold + ) + ) + .foregroundColor(AppColors.colorGray) + Spacer() + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } +} diff --git a/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift b/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift new file mode 100644 index 0000000..dfa7ecc --- /dev/null +++ b/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift @@ -0,0 +1,51 @@ +import SwiftUI + +struct CartListItemView: View { + var cartItem: ProductCartItem + var removeFromCart: () -> Void + + var body: some View { + LazyVStack(spacing: 0) { + HStack(spacing: Sizes.Spacing.standard) { + RemoteImageView( + urlString: cartItem.product.imageUrl, + width: Sizes.Size.smallImageSize, + height: Sizes.Size.smallImageSize, + contentMode: .fit, + showBorder: false + ) + + VStack(alignment: .leading, spacing: Sizes.Spacing.small) { + Text(cartItem.product.brand) + .font(.system(size: Sizes.FontSize.small)) + .foregroundColor(AppColors.colorGray) + + Text(cartItem.product.name) + .font(.system(size: Sizes.FontSize.standard)) + .foregroundColor(AppColors.colorBlack) + .lineLimit(1) + .truncationMode(.tail) + + Text(String(format: NSLocalizedString("quantity_title", comment: ""), "\(cartItem.quantity)")) + .font(.system(size: Sizes.FontSize.medium)) + .foregroundColor(AppColors.colorBlack) + } + .frame(maxWidth: .infinity, alignment: .leading) + + Text(cartItem.product.priceFormatted ?? "") + .font(.system(size: Sizes.FontSize.standard)) + .foregroundColor(AppColors.colorBlack) + .padding(.trailing, Sizes.Padding.xLarge) + + RemoveButtonView(action: removeFromCart) + } + .padding(.vertical, Sizes.Padding.medium) + .background(AppColors.colorWhite) + + Divider() + } + .listRowInsets(EdgeInsets()) + .background(Color.clear) + .padding(.horizontal) + } +} diff --git a/Feature/Cart/Presentation/View/Price/TotalPriceSection.struct.swift b/Feature/Cart/Presentation/View/Price/TotalPriceSection.struct.swift new file mode 100644 index 0000000..baf265d --- /dev/null +++ b/Feature/Cart/Presentation/View/Price/TotalPriceSection.struct.swift @@ -0,0 +1,36 @@ +import SwiftUI + +struct TotalPriceSection: View { + var totalPrice: Int + + var body: some View { + VStack(alignment: .trailing, spacing: 12) { + Spacer().frame(height: 10) + + HStack { + Spacer() + Text("shipping_title") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding(.trailing, 12) + + Text("Free") + .font(.system(size: 16, weight: .bold)) + .foregroundColor(.black) + } + + HStack { + Spacer() + Text("total_title") + .font(.system(size: 16)) + .foregroundColor(.black) + .padding(.trailing, 12) + + Text("\(totalPrice)") + .font(.system(size: 16, weight: .bold)) + .foregroundColor(.black) + } + } + .padding(.horizontal) + } +} diff --git a/Feature/Settings/Presentation/View/Errors/SettingsErrorScreenView.struct.swift b/Feature/Settings/Presentation/View/Errors/SettingsErrorScreenView.struct.swift new file mode 100644 index 0000000..0894368 --- /dev/null +++ b/Feature/Settings/Presentation/View/Errors/SettingsErrorScreenView.struct.swift @@ -0,0 +1,19 @@ +import SwiftUI + +struct SettingsErrorScreenView: View { + let errorMessage: String + let retryAction: () -> Void + + var body: some View { + VStack { + Text(errorMessage) + .foregroundColor(AppColors.colorRed) + .padding() + + Button("retry_button_title") { + retryAction() + } + .padding() + } + } +} diff --git a/Feature/Settings/Presentation/View/SettingsErrroScreenView.struct.swift b/Feature/Settings/Presentation/View/Errors/SettingsErrroScreenView.struct.swift similarity index 56% rename from Feature/Settings/Presentation/View/SettingsErrroScreenView.struct.swift rename to Feature/Settings/Presentation/View/Errors/SettingsErrroScreenView.struct.swift index 7f03c5f..39729b2 100644 --- a/Feature/Settings/Presentation/View/SettingsErrroScreenView.struct.swift +++ b/Feature/Settings/Presentation/View/Errors/SettingsErrroScreenView.struct.swift @@ -7,25 +7,25 @@ struct SettingsErrroScreenView: View { var body: some View { VStack { Text("default_error_title") - .font(.system(size: 32)) + .font(.system(size: Sizes.FontSize.enormous)) .multilineTextAlignment(.center) - .foregroundColor(.black) + .foregroundColor(AppColors.colorBlack) .font(Font.footnote.weight(.bold)) Text("default_error_sub_title") - .font(.system(size: 18)) - .padding(.vertical,20) - .padding(.horizontal,16) + .font(.system(size: Sizes.FontSize.extraLarge)) + .padding(.vertical,Sizes.Spacing.large) + .padding(.horizontal,Sizes.Spacing.standard) .multilineTextAlignment(.center) - .foregroundColor(.black) + .foregroundColor(AppColors.colorBlack) Button(action: retryAction) { Text("go_home_button") - .foregroundColor(.white) - .frame(height: 44) + .foregroundColor(AppColors.colorWhite) + .frame(height: Sizes.Size.textFrameWidth) .frame(maxWidth: .infinity) - .background(Color.black) - .cornerRadius(10) + .background(AppColors.colorBlack) + .cornerRadius(Sizes.CornerRadius.large) } .padding(.horizontal) } diff --git a/Feature/Settings/Presentation/View/SettingsInputCodeView.struct.swift b/Feature/Settings/Presentation/View/TextInput/SettingsInputCodeView.struct.swift similarity index 100% rename from Feature/Settings/Presentation/View/SettingsInputCodeView.struct.swift rename to Feature/Settings/Presentation/View/TextInput/SettingsInputCodeView.struct.swift diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 42d6727..444cbcd 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -54,6 +54,19 @@ 75BAD49B2C60EE8100DFFF02 /* CounterSectionView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4982C60EE8100DFFF02 /* CounterSectionView.struct.swift */; }; 75BAD49E2C60EF8A00DFFF02 /* ProductDetailsSectionView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD49D2C60EF8A00DFFF02 /* ProductDetailsSectionView.struct.swift */; }; 75BAD4A32C60F54300DFFF02 /* PriceSectionView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4A22C60F54300DFFF02 /* PriceSectionView.struct.swift */; }; + 75BAD4A92C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4A82C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift */; }; + 75BAD4AA2C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4A82C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift */; }; + 75BAD4AB2C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4A82C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift */; }; + 75BAD4B02C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4AF2C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift */; }; + 75BAD4B42C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */; }; + 75BAD4B52C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */; }; + 75BAD4B62C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */; }; + 75BAD4B92C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */; }; + 75BAD4BA2C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */; }; + 75BAD4BB2C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */; }; + 75BAD4BD2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */; }; + 75BAD4BE2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */; }; + 75BAD4BF2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */; }; 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */; }; 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */; }; 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */; }; @@ -212,6 +225,11 @@ 75BAD4982C60EE8100DFFF02 /* CounterSectionView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CounterSectionView.struct.swift; sourceTree = ""; }; 75BAD49D2C60EF8A00DFFF02 /* ProductDetailsSectionView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailsSectionView.struct.swift; sourceTree = ""; }; 75BAD4A22C60F54300DFFF02 /* PriceSectionView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceSectionView.struct.swift; sourceTree = ""; }; + 75BAD4A82C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrorScreenView.struct.swift; sourceTree = ""; }; + 75BAD4AF2C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationButtonsView.struct.swift; sourceTree = ""; }; + 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TotalPriceSection.struct.swift; sourceTree = ""; }; + 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyCartView.struct.swift; sourceTree = ""; }; + 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveButtonView.struct.swift; sourceTree = ""; }; 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.struct.swift; sourceTree = ""; }; 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbarView.struct.swift; sourceTree = ""; }; 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.struct.swift; sourceTree = ""; }; @@ -487,6 +505,56 @@ path = Price; sourceTree = ""; }; + 75BAD4A62C60F6C600DFFF02 /* Errors */ = { + isa = PBXGroup; + children = ( + 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.struct.swift */, + 75BAD4A82C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift */, + ); + path = Errors; + sourceTree = ""; + }; + 75BAD4A72C60F6D300DFFF02 /* TextInput */ = { + isa = PBXGroup; + children = ( + 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.struct.swift */, + ); + path = TextInput; + sourceTree = ""; + }; + 75BAD4AC2C60F8C100DFFF02 /* ListItem */ = { + isa = PBXGroup; + children = ( + 75E979D32C4974660081B069 /* CartListItemView.struct.swift */, + ); + path = ListItem; + sourceTree = ""; + }; + 75BAD4AD2C60F8CC00DFFF02 /* Button */ = { + isa = PBXGroup; + children = ( + 75BAD4AF2C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift */, + 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */, + ); + path = Button; + sourceTree = ""; + }; + 75BAD4AE2C60F8DB00DFFF02 /* Price */ = { + isa = PBXGroup; + children = ( + 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */, + ); + path = Price; + sourceTree = ""; + }; + 75BAD4B72C6101FE00DFFF02 /* EmptyScreenState */ = { + isa = PBXGroup; + children = ( + 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */, + ); + path = EmptyScreenState; + sourceTree = ""; + }; 75E979842C4935170081B069 /* Core */ = { isa = PBXGroup; children = ( @@ -632,8 +700,11 @@ 75E979B32C4958B20081B069 /* View */ = { isa = PBXGroup; children = ( + 75BAD4B72C6101FE00DFFF02 /* EmptyScreenState */, + 75BAD4AE2C60F8DB00DFFF02 /* Price */, + 75BAD4AD2C60F8CC00DFFF02 /* Button */, + 75BAD4AC2C60F8C100DFFF02 /* ListItem */, 75E979CF2C4974440081B069 /* CartListView.struct.swift */, - 75E979D32C4974660081B069 /* CartListItemView.struct.swift */, ); path = View; sourceTree = ""; @@ -693,8 +764,8 @@ 75E979BF2C495A1B0081B069 /* View */ = { isa = PBXGroup; children = ( - 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.struct.swift */, - 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.struct.swift */, + 75BAD4A72C60F6D300DFFF02 /* TextInput */, + 75BAD4A62C60F6C600DFFF02 /* Errors */, ); path = View; sourceTree = ""; @@ -1213,6 +1284,7 @@ 75E97A412C5025080081B069 /* SearchCategory.struct.swift in Sources */, 75ECCD102C36BE2000D6D346 /* ProductsScreenView.struct.swift in Sources */, 75E97A492C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, + 75BAD4A92C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */, 75E97AB02C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */, 75674CEF2C3D39F9007FAB88 /* StoriesViewControllerRepresentable.struct.swift in Sources */, 75BAD48C2C60EB0F00DFFF02 /* TopSectionView.struct.swift in Sources */, @@ -1224,9 +1296,12 @@ 75E979DE2C4ADDD20081B069 /* RootScreenType.enum.swift in Sources */, 75E97A1C2C501D660081B069 /* ScreenTypeProviderProtocol.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.struct.swift in Sources */, + 75BAD4B42C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */, 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift in Sources */, + 75BAD4B02C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift in Sources */, 75BAD4832C60DB1C00DFFF02 /* ProductImageView.struct.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.struct.swift in Sources */, + 75BAD4B92C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */, 75E97A822C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */, 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */, @@ -1240,6 +1315,7 @@ 75B935572C3564360063E814 /* DemoStoreApp.struct.swift in Sources */, 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.struct.swift in Sources */, 75BAD4942C60ED4A00DFFF02 /* ActionSectionView.struct.swift in Sources */, + 75BAD4BD2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.struct.swift in Sources */, 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.struct.swift in Sources */, 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */, @@ -1285,17 +1361,21 @@ 75E97A3A2C5024CD0081B069 /* SearchProduct.struct.swift in Sources */, 75E97A4A2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, 75E979F22C4D2DBE0081B069 /* Timer.swift in Sources */, + 75BAD4AA2C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */, 75E97A422C5025080081B069 /* SearchCategory.struct.swift in Sources */, 75A4D61B2C5D0AE800929368 /* AppColors.struct.swift in Sources */, 75E97A832C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 75A4D6172C5D0AD400929368 /* Sizes.struct.swift in Sources */, + 75BAD4BA2C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */, 75E97A242C5023600081B069 /* SearchFilter.struct.swift in Sources */, 75E97A3E2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */, 75E97A4E2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, 75E97AB12C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */, 75E97A282C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */, 75BAD49A2C60EE8100DFFF02 /* CounterSectionView.struct.swift in Sources */, + 75BAD4BE2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */, 75E97A2C2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */, + 75BAD4B52C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */, 75E97A462C5025240081B069 /* SearchQuery.struct.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1308,17 +1388,21 @@ 75E97A4B2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, 75E97A4F2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, 75E97A472C5025240081B069 /* SearchQuery.struct.swift in Sources */, + 75BAD4AB2C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */, 75E97A432C5025080081B069 /* SearchCategory.struct.swift in Sources */, 75A4D61C2C5D0AE800929368 /* AppColors.struct.swift in Sources */, 75E97A842C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 75A4D6182C5D0AD400929368 /* Sizes.struct.swift in Sources */, + 75BAD4BB2C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */, 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */, 75E97A252C5023600081B069 /* SearchFilter.struct.swift in Sources */, 75E97A292C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */, 75E97AB22C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */, 75E97A3B2C5024CD0081B069 /* SearchProduct.struct.swift in Sources */, 75BAD49B2C60EE8100DFFF02 /* CounterSectionView.struct.swift in Sources */, + 75BAD4BF2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */, 75E97A2D2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */, + 75BAD4B62C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */, 75E97A3F2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From e78dd6113f955faa2e5a4d933527cd7ed55b1fdf Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 7 Aug 2024 14:59:01 +0200 Subject: [PATCH 83/85] refactor(app): Moved sizes, colors & typography in app module --- ...wift => ScreenTypeProvider.protocol.swift} | 0 .../UI}/Colors/AppColors.struct.swift | 0 App/UI/Fonts/Typography.struct.swift | 15 ++++ .../UI}/Sizes/Sizes.struct.swift | 12 ---- .../BottomBar/BottomBarView.struct.swift | 2 +- ...bBarButton.swift => BottomBarButton.swift} | 2 +- ...tocol.swift => SDKManaging.protocol.swift} | 2 +- Core/DI/SdkResolver.swift | 2 +- Core/Presentation/ViewModel/SdkManager.swift | 2 +- .../Views/RemoteImageView.struct.swift | 2 +- Feature/Cart/DI/CartResolver.swift | 2 +- ...ository.swift => CartRepositoryImpl.swift} | 2 +- ...ol.swift => CartRepository.protocol.swift} | 2 +- .../Button/NavigationButtonsView.struct.swift | 2 +- .../EmptyCartView.struct.swift | 2 +- .../ListItem/CartListItemView.struct.swift | 8 +-- .../ViewModel/CartViewModel.swift | 2 +- .../UseCase/GetRecommendationsUseCase.swift | 2 +- .../ViewModel/HomeViewModel.swift | 4 +- .../Button/ActionSectionView.struct.swift | 2 +- .../Counter/CounterSectionView.struct.swift | 6 +- .../ProductDetailsSectionView.struct.swift | 10 +-- .../View/Price/PriceSectionView.struct.swift | 6 +- .../ViewModel/ProductsViewModel.swift | 2 +- .../ViewModel/SearchViewModel.swift | 2 +- .../SettingsErrroScreenView.struct.swift | 4 +- demo-store-ios.xcodeproj/project.pbxproj | 68 +++++++++++++------ 27 files changed, 96 insertions(+), 69 deletions(-) rename App/Navigation/Protocols/{ScreenTypeProviderProtocol.swift => ScreenTypeProvider.protocol.swift} (100%) rename {Core/Resources => App/UI}/Colors/AppColors.struct.swift (100%) create mode 100644 App/UI/Fonts/Typography.struct.swift rename {Core/Resources => App/UI}/Sizes/Sizes.struct.swift (80%) rename App/Views/BottomBar/button/{TabBarButton.swift => BottomBarButton.swift} (92%) rename Core/DI/Protocols/{SDKManagingProtocol.swift => SDKManaging.protocol.swift} (71%) rename Feature/Cart/Domain/Repository/Implementation/{CartRepository.swift => CartRepositoryImpl.swift} (96%) rename Feature/Cart/Domain/Repository/Protocols/{CartRepositoryProtocol.swift => CartRepository.protocol.swift} (88%) diff --git a/App/Navigation/Protocols/ScreenTypeProviderProtocol.swift b/App/Navigation/Protocols/ScreenTypeProvider.protocol.swift similarity index 100% rename from App/Navigation/Protocols/ScreenTypeProviderProtocol.swift rename to App/Navigation/Protocols/ScreenTypeProvider.protocol.swift diff --git a/Core/Resources/Colors/AppColors.struct.swift b/App/UI/Colors/AppColors.struct.swift similarity index 100% rename from Core/Resources/Colors/AppColors.struct.swift rename to App/UI/Colors/AppColors.struct.swift diff --git a/App/UI/Fonts/Typography.struct.swift b/App/UI/Fonts/Typography.struct.swift new file mode 100644 index 0000000..2ab0800 --- /dev/null +++ b/App/UI/Fonts/Typography.struct.swift @@ -0,0 +1,15 @@ +import Foundation + +struct Typography { + struct FontSize { + static let lineWidth: CGFloat = 1 + static let small: CGFloat = 12 + static let medium: CGFloat = 14 + static let standard: CGFloat = 16 + static let large: CGFloat = 17 + static let extraLarge: CGFloat = 18 + static let xxLarge: CGFloat = 20 + static let xxxLarge: CGFloat = 24 + static let enormous: CGFloat = 32 + } +} diff --git a/Core/Resources/Sizes/Sizes.struct.swift b/App/UI/Sizes/Sizes.struct.swift similarity index 80% rename from Core/Resources/Sizes/Sizes.struct.swift rename to App/UI/Sizes/Sizes.struct.swift index f5c2bd7..ca9a7bc 100644 --- a/Core/Resources/Sizes/Sizes.struct.swift +++ b/App/UI/Sizes/Sizes.struct.swift @@ -21,18 +21,6 @@ struct Sizes { static let extraLarge: CGFloat = 36 } - struct FontSize { - static let lineWidth: CGFloat = 1 - static let small: CGFloat = 12 - static let medium: CGFloat = 14 - static let standard: CGFloat = 16 - static let large: CGFloat = 17 - static let extraLarge: CGFloat = 18 - static let xxLarge: CGFloat = 20 - static let xxxLarge: CGFloat = 24 - static let enormous: CGFloat = 32 - } - struct Size { static let xxLargeImageSize: CGFloat = 350 static let smallIconSize: CGFloat = 24 diff --git a/App/Views/BottomBar/BottomBarView.struct.swift b/App/Views/BottomBar/BottomBarView.struct.swift index 2250df9..7f9fbc4 100644 --- a/App/Views/BottomBar/BottomBarView.struct.swift +++ b/App/Views/BottomBar/BottomBarView.struct.swift @@ -17,7 +17,7 @@ struct BottomBarView: View { if !navigationManager.isBottomBarHidden { HStack(spacing: 0) { ForEach(tabs) { tab in - TabBarButton(image: tab.image, isSelected: navigationManager.selectedTab == tab.type) + BottomBarButton(image: tab.image, isSelected: navigationManager.selectedTab == tab.type) .onTapGesture { navigationManager.selectedTab = tab.type navigationManager.navigateToRootScreen(screen: tab.screen, selectedTab: tab.type) diff --git a/App/Views/BottomBar/button/TabBarButton.swift b/App/Views/BottomBar/button/BottomBarButton.swift similarity index 92% rename from App/Views/BottomBar/button/TabBarButton.swift rename to App/Views/BottomBar/button/BottomBarButton.swift index 9014e49..0a5ac8a 100644 --- a/App/Views/BottomBar/button/TabBarButton.swift +++ b/App/Views/BottomBar/button/BottomBarButton.swift @@ -1,6 +1,6 @@ import SwiftUI -struct TabBarButton: View { +struct BottomBarButton: View { var image: String var isSelected: Bool diff --git a/Core/DI/Protocols/SDKManagingProtocol.swift b/Core/DI/Protocols/SDKManaging.protocol.swift similarity index 71% rename from Core/DI/Protocols/SDKManagingProtocol.swift rename to Core/DI/Protocols/SDKManaging.protocol.swift index b71f87a..902bc66 100644 --- a/Core/DI/Protocols/SDKManagingProtocol.swift +++ b/Core/DI/Protocols/SDKManaging.protocol.swift @@ -1,6 +1,6 @@ import Foundation import REES46 -protocol SDKManagingProtocol { +protocol SDKManaging { var sdk: PersonalizationSDK? { get } } diff --git a/Core/DI/SdkResolver.swift b/Core/DI/SdkResolver.swift index c5ebd04..2d34ea7 100644 --- a/Core/DI/SdkResolver.swift +++ b/Core/DI/SdkResolver.swift @@ -2,6 +2,6 @@ import Resolver extension Resolver { static func registerSdk() { - register { SDKManager() as SDKManagingProtocol }.scope(.application) + register { SDKManager() as SDKManaging }.scope(.application) } } diff --git a/Core/Presentation/ViewModel/SdkManager.swift b/Core/Presentation/ViewModel/SdkManager.swift index 79258b8..1726991 100644 --- a/Core/Presentation/ViewModel/SdkManager.swift +++ b/Core/Presentation/ViewModel/SdkManager.swift @@ -1,6 +1,6 @@ import REES46 -class SDKManager: SDKManagingProtocol { +class SDKManager: SDKManaging { var sdk: PersonalizationSDK? init() { diff --git a/Core/Presentation/Views/RemoteImageView.struct.swift b/Core/Presentation/Views/RemoteImageView.struct.swift index f4e955a..494e5b6 100644 --- a/Core/Presentation/Views/RemoteImageView.struct.swift +++ b/Core/Presentation/Views/RemoteImageView.struct.swift @@ -36,7 +36,7 @@ struct RemoteImageView: View { showBorder ? RoundedRectangle(cornerRadius: Sizes.CornerRadius.large).stroke( Color.gray.opacity(0.5), - lineWidth: Sizes.FontSize.lineWidth + lineWidth: Typography.FontSize.lineWidth ) : nil ) } else { diff --git a/Feature/Cart/DI/CartResolver.swift b/Feature/Cart/DI/CartResolver.swift index af0d270..5f05f2f 100644 --- a/Feature/Cart/DI/CartResolver.swift +++ b/Feature/Cart/DI/CartResolver.swift @@ -4,6 +4,6 @@ import Resolver extension Resolver { static func registerCartServices() { register { CartViewModel() }.scope(.application) - register { CartRepository() as CartRepositoryProtocol }.scope(.application) + register { CartRepositoryImpl() as CartRepository }.scope(.application) } } diff --git a/Feature/Cart/Domain/Repository/Implementation/CartRepository.swift b/Feature/Cart/Domain/Repository/Implementation/CartRepositoryImpl.swift similarity index 96% rename from Feature/Cart/Domain/Repository/Implementation/CartRepository.swift rename to Feature/Cart/Domain/Repository/Implementation/CartRepositoryImpl.swift index aaebb8b..7ec62a3 100644 --- a/Feature/Cart/Domain/Repository/Implementation/CartRepository.swift +++ b/Feature/Cart/Domain/Repository/Implementation/CartRepositoryImpl.swift @@ -1,7 +1,7 @@ import Foundation import Combine -class CartRepository: ObservableObject, CartRepositoryProtocol { +class CartRepositoryImpl: ObservableObject, CartRepository { @Published var cartItems: [ProductCartItem] = [] diff --git a/Feature/Cart/Domain/Repository/Protocols/CartRepositoryProtocol.swift b/Feature/Cart/Domain/Repository/Protocols/CartRepository.protocol.swift similarity index 88% rename from Feature/Cart/Domain/Repository/Protocols/CartRepositoryProtocol.swift rename to Feature/Cart/Domain/Repository/Protocols/CartRepository.protocol.swift index ce5a726..966d304 100644 --- a/Feature/Cart/Domain/Repository/Protocols/CartRepositoryProtocol.swift +++ b/Feature/Cart/Domain/Repository/Protocols/CartRepository.protocol.swift @@ -1,7 +1,7 @@ import Foundation import Combine -protocol CartRepositoryProtocol { +protocol CartRepository { var cartItemsPublisher: Published<[ProductCartItem]>.Publisher { get } func addToCart(product: RecommendedProduct, quantity: Int) func updateCartItem(productId: String, quantity: Int) diff --git a/Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift b/Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift index 5732d0f..2609dd1 100644 --- a/Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift +++ b/Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift @@ -31,7 +31,7 @@ struct NavigationButtonsView: View { } ) { Text("checkout_button") - .font(.system(size: Sizes.FontSize.standard)) + .font(.system(size: Typography.FontSize.standard)) .foregroundColor(AppColors.colorWhite) .padding() .frame(maxWidth: .infinity) diff --git a/Feature/Cart/Presentation/View/EmptyScreenState/EmptyCartView.struct.swift b/Feature/Cart/Presentation/View/EmptyScreenState/EmptyCartView.struct.swift index 3afac4c..a48cd1a 100644 --- a/Feature/Cart/Presentation/View/EmptyScreenState/EmptyCartView.struct.swift +++ b/Feature/Cart/Presentation/View/EmptyScreenState/EmptyCartView.struct.swift @@ -7,7 +7,7 @@ struct EmptyCartView: View { Text("empty_cart_title") .font( .system( - size: Sizes.FontSize.extraLarge, + size: Typography.FontSize.extraLarge, weight: .bold ) ) diff --git a/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift b/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift index dfa7ecc..7b5bd90 100644 --- a/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift +++ b/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift @@ -17,23 +17,23 @@ struct CartListItemView: View { VStack(alignment: .leading, spacing: Sizes.Spacing.small) { Text(cartItem.product.brand) - .font(.system(size: Sizes.FontSize.small)) + .font(.system(size: Typography.FontSize.small)) .foregroundColor(AppColors.colorGray) Text(cartItem.product.name) - .font(.system(size: Sizes.FontSize.standard)) + .font(.system(size: Typography.FontSize.standard)) .foregroundColor(AppColors.colorBlack) .lineLimit(1) .truncationMode(.tail) Text(String(format: NSLocalizedString("quantity_title", comment: ""), "\(cartItem.quantity)")) - .font(.system(size: Sizes.FontSize.medium)) + .font(.system(size: Typography.FontSize.medium)) .foregroundColor(AppColors.colorBlack) } .frame(maxWidth: .infinity, alignment: .leading) Text(cartItem.product.priceFormatted ?? "") - .font(.system(size: Sizes.FontSize.standard)) + .font(.system(size: Typography.FontSize.standard)) .foregroundColor(AppColors.colorBlack) .padding(.trailing, Sizes.Padding.xLarge) diff --git a/Feature/Cart/Presentation/ViewModel/CartViewModel.swift b/Feature/Cart/Presentation/ViewModel/CartViewModel.swift index f3689dc..8d0e16a 100644 --- a/Feature/Cart/Presentation/ViewModel/CartViewModel.swift +++ b/Feature/Cart/Presentation/ViewModel/CartViewModel.swift @@ -8,7 +8,7 @@ class CartViewModel { @Published var recommenderProducts: [RecommendedProduct] = [] @Published var isLoading: Bool = true - @Injected var cartRepository: CartRepositoryProtocol + @Injected var cartRepository: CartRepository @Injected var getRecommendationsUseCase: GetRecommendationsUseCase private var cancellables = Set() diff --git a/Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift b/Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift index 315956c..7b2e7a5 100644 --- a/Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift +++ b/Feature/Home/Domain/UseCase/GetRecommendationsUseCase.swift @@ -5,7 +5,7 @@ import Resolver class GetRecommendationsUseCase { - @Injected var sdkManager: SDKManagingProtocol + @Injected var sdkManager: SDKManaging func execute( currentProductId: String, diff --git a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift index 27357c5..7d36977 100644 --- a/Feature/Home/Presentation/ViewModel/HomeViewModel.swift +++ b/Feature/Home/Presentation/ViewModel/HomeViewModel.swift @@ -5,8 +5,8 @@ import Resolver class HomeViewModel { - @Injected var sdkManager: SDKManagingProtocol - @Injected var cartRepository: CartRepositoryProtocol + @Injected var sdkManager: SDKManaging + @Injected var cartRepository: CartRepository @Injected var getRecommendationsUseCase: GetRecommendationsUseCase @Published var arrivalsProducts: [RecommendedProduct] = [] diff --git a/Feature/Product/Presentation/View/Button/ActionSectionView.struct.swift b/Feature/Product/Presentation/View/Button/ActionSectionView.struct.swift index b282e70..a64fe92 100644 --- a/Feature/Product/Presentation/View/Button/ActionSectionView.struct.swift +++ b/Feature/Product/Presentation/View/Button/ActionSectionView.struct.swift @@ -22,7 +22,7 @@ struct ActionSectionView: View { } ) { Text("add_to_cart_button_title") - .font(.system(size: Sizes.FontSize.medium, weight: .bold)) + .font(.system(size: Typography.FontSize.medium, weight: .bold)) .foregroundColor(AppColors.colorWhite) .frame(maxWidth: .infinity, maxHeight: Sizes.Size.buttonHeight) .background(AppColors.colorBlack) diff --git a/Feature/Product/Presentation/View/Counter/CounterSectionView.struct.swift b/Feature/Product/Presentation/View/Counter/CounterSectionView.struct.swift index 5e9686c..4dd9298 100644 --- a/Feature/Product/Presentation/View/Counter/CounterSectionView.struct.swift +++ b/Feature/Product/Presentation/View/Counter/CounterSectionView.struct.swift @@ -13,14 +13,14 @@ struct CounterSectionView: View { } ) { Text("-") - .font(.system(size: Sizes.FontSize.xxLarge, weight: .bold)) + .font(.system(size: Typography.FontSize.xxLarge, weight: .bold)) .foregroundColor(AppColors.colorBlack) .background(AppColors.colorWhite) .frame(width: Sizes.Size.buttonHeight, height: Sizes.Size.buttonHeight) } Text("\(counter)") - .font(.system(size: Sizes.FontSize.xxLarge, weight: .bold)) + .font(.system(size: Typography.FontSize.xxLarge, weight: .bold)) .foregroundColor(AppColors.colorBlack) .background(AppColors.colorWhite) .frame(width: Sizes.Size.buttonHeight, height: Sizes.Size.buttonHeight) @@ -31,7 +31,7 @@ struct CounterSectionView: View { } ) { Text("+") - .font(.system(size: Sizes.FontSize.xxLarge, weight: .bold)) + .font(.system(size: Typography.FontSize.xxLarge, weight: .bold)) .foregroundColor(AppColors.colorBlack) .background(AppColors.colorWhite) .frame(width: Sizes.Size.buttonHeight, height: Sizes.Size.buttonHeight) diff --git a/Feature/Product/Presentation/View/Description/ProductDetailsSectionView.struct.swift b/Feature/Product/Presentation/View/Description/ProductDetailsSectionView.struct.swift index 409917e..a2975d7 100644 --- a/Feature/Product/Presentation/View/Description/ProductDetailsSectionView.struct.swift +++ b/Feature/Product/Presentation/View/Description/ProductDetailsSectionView.struct.swift @@ -9,13 +9,13 @@ struct ProductDetailsSectionView: View { Spacer().frame(height: Sizes.Spacing.large) Text(product.brand) - .font(.system(size: Sizes.FontSize.standard)) + .font(.system(size: Typography.FontSize.standard)) .foregroundColor(AppColors.colorBlack) .lineLimit(1) Spacer().frame(height: Sizes.Spacing.small) Text(product.name) - .font(.system(size: Sizes.FontSize.xxxLarge, weight: .bold)) + .font(.system(size: Typography.FontSize.xxxLarge, weight: .bold)) .foregroundColor(AppColors.colorBlack) .lineLimit(1) Spacer().frame(height: Sizes.Spacing.medium) @@ -25,18 +25,18 @@ struct ProductDetailsSectionView: View { Spacer().frame(width: Sizes.Spacing.medium) Text("\(Int.random(in: 1...100))") - .font(.system(size: Sizes.FontSize.small)) + .font(.system(size: Typography.FontSize.small)) .foregroundColor(AppColors.colorBlack) .lineLimit(1) Text("rating_reviews") - .font(.system(size: Sizes.FontSize.small)) + .font(.system(size: Typography.FontSize.small)) .foregroundColor(AppColors.colorBlack) .lineLimit(1) } Spacer().frame(height: Sizes.Spacing.medium) Text(product.description) - .font(.system(size: Sizes.FontSize.medium, weight: .regular)) + .font(.system(size: Typography.FontSize.medium, weight: .regular)) .foregroundColor(AppColors.colorBlack) .lineSpacing(Sizes.Padding.medium) } diff --git a/Feature/Product/Presentation/View/Price/PriceSectionView.struct.swift b/Feature/Product/Presentation/View/Price/PriceSectionView.struct.swift index 889c172..e5051d3 100644 --- a/Feature/Product/Presentation/View/Price/PriceSectionView.struct.swift +++ b/Feature/Product/Presentation/View/Price/PriceSectionView.struct.swift @@ -9,20 +9,20 @@ struct PriceSectionView: View { if let oldPrice = product.oldPriceFormatted { Text(oldPrice) - .font(.system(size: Sizes.FontSize.large)) + .font(.system(size: Typography.FontSize.large)) .foregroundColor(.secondary) .strikethrough() } HStack { Text(product.priceFormatted ?? "") - .font(.system(size: Sizes.FontSize.large, weight: .bold)) + .font(.system(size: Typography.FontSize.large, weight: .bold)) .foregroundColor(.primary) Spacer().frame(width: Sizes.Spacing.medium) Text("\(Int.random(in: 1...50))%") - .font(.system(size: Sizes.FontSize.standard)) + .font(.system(size: Typography.FontSize.standard)) .frame(width: Sizes.Size.textFrameWidth, height: Sizes.Size.textFrameHeight) .foregroundColor(AppColors.colorWhite) .padding(Sizes.Padding.medium) diff --git a/Feature/Product/Presentation/ViewModel/ProductsViewModel.swift b/Feature/Product/Presentation/ViewModel/ProductsViewModel.swift index 3f62444..fa75990 100644 --- a/Feature/Product/Presentation/ViewModel/ProductsViewModel.swift +++ b/Feature/Product/Presentation/ViewModel/ProductsViewModel.swift @@ -5,7 +5,7 @@ import Resolver class ProductsViewModel { - @Injected var cartRepository: CartRepositoryProtocol + @Injected var cartRepository: CartRepository @Injected var getRecommendationsUseCase: GetRecommendationsUseCase @Published var recommenderProducts: [RecommendedProduct] = [] diff --git a/Feature/Search/Presentation/ViewModel/SearchViewModel.swift b/Feature/Search/Presentation/ViewModel/SearchViewModel.swift index b0a4c0a..8f309cf 100644 --- a/Feature/Search/Presentation/ViewModel/SearchViewModel.swift +++ b/Feature/Search/Presentation/ViewModel/SearchViewModel.swift @@ -5,7 +5,7 @@ import Resolver class SearchViewModel { - @Injected var sdkManager: SDKManagingProtocol + @Injected var sdkManager: SDKManaging @Published var searchText: String = "" @Published var searchResults: SearchProductResponse? = nil diff --git a/Feature/Settings/Presentation/View/Errors/SettingsErrroScreenView.struct.swift b/Feature/Settings/Presentation/View/Errors/SettingsErrroScreenView.struct.swift index 39729b2..378b4da 100644 --- a/Feature/Settings/Presentation/View/Errors/SettingsErrroScreenView.struct.swift +++ b/Feature/Settings/Presentation/View/Errors/SettingsErrroScreenView.struct.swift @@ -7,13 +7,13 @@ struct SettingsErrroScreenView: View { var body: some View { VStack { Text("default_error_title") - .font(.system(size: Sizes.FontSize.enormous)) + .font(.system(size: Typography.FontSize.enormous)) .multilineTextAlignment(.center) .foregroundColor(AppColors.colorBlack) .font(Font.footnote.weight(.bold)) Text("default_error_sub_title") - .font(.system(size: Sizes.FontSize.extraLarge)) + .font(.system(size: Typography.FontSize.extraLarge)) .padding(.vertical,Sizes.Spacing.large) .padding(.horizontal,Sizes.Spacing.standard) .multilineTextAlignment(.center) diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 444cbcd..3b66022 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 37CF7497084E2A6C5AB03AAF /* Pods_demo_store_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D65FBB29DC18ECADC9C8C94 /* Pods_demo_store_ios.framework */; }; 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D392C41E01D002D4AC3 /* ProductCartItem.struct.swift */; }; 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */; }; - 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */; }; + 752F1D402C41E5BC002D4AC3 /* CartRepositoryImpl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D3F2C41E5BC002D4AC3 /* CartRepositoryImpl.swift */; }; 752F1D432C45779F002D4AC3 /* GetRecommendationsUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */; }; 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */; }; 752F1D492C459680002D4AC3 /* SearchScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752F1D482C459680002D4AC3 /* SearchScreenView.struct.swift */; }; @@ -28,7 +28,7 @@ 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.struct.swift */; }; 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */; }; 75A3F4292C38593800AAC175 /* ToolbarView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4282C38593800AAC175 /* ToolbarView.struct.swift */; }; - 75A4D5AE2C579A3F00929368 /* SDKManagingProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */; }; + 75A4D5AE2C579A3F00929368 /* SDKManaging.protocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D5AD2C579A3F00929368 /* SDKManaging.protocol.swift */; }; 75A4D5B22C579A4900929368 /* SdkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D5B12C579A4900929368 /* SdkManager.swift */; }; 75A4D60F2C5CD84800929368 /* RemoteImageView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D60D2C5CD80500929368 /* RemoteImageView.struct.swift */; }; 75A4D6162C5D0AD400929368 /* Sizes.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */; }; @@ -41,7 +41,7 @@ 75B935592C3564360063E814 /* ContentView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B935582C3564360063E814 /* ContentView.struct.swift */; }; 75B9355B2C3564370063E814 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355A2C3564370063E814 /* Assets.xcassets */; }; 75B9355E2C3564370063E814 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75B9355D2C3564370063E814 /* Preview Assets.xcassets */; }; - 75BAD4742C60D5ED00DFFF02 /* TabBarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4732C60D5ED00DFFF02 /* TabBarButton.swift */; }; + 75BAD4742C60D5ED00DFFF02 /* BottomBarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4732C60D5ED00DFFF02 /* BottomBarButton.swift */; }; 75BAD47F2C60D97B00DFFF02 /* ProductInfoView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD47A2C60D91700DFFF02 /* ProductInfoView.struct.swift */; }; 75BAD4802C60D98700DFFF02 /* PriceAndShopButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4782C60D8EA00DFFF02 /* PriceAndShopButtonView.struct.swift */; }; 75BAD4832C60DB1C00DFFF02 /* ProductImageView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD47C2C60D95F00DFFF02 /* ProductImageView.struct.swift */; }; @@ -67,6 +67,9 @@ 75BAD4BD2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */; }; 75BAD4BE2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */; }; 75BAD4BF2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */; }; + 75BAD56A2C63A4F000DFFF02 /* Typography.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD5692C63A4F000DFFF02 /* Typography.struct.swift */; }; + 75BAD56B2C63A4F000DFFF02 /* Typography.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD5692C63A4F000DFFF02 /* Typography.struct.swift */; }; + 75BAD56C2C63A4F000DFFF02 /* Typography.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD5692C63A4F000DFFF02 /* Typography.struct.swift */; }; 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */; }; 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */; }; 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */; }; @@ -88,7 +91,7 @@ 75E979F32C4D2DBE0081B069 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F02C4D2DBE0081B069 /* Timer.swift */; }; 75E979F72C4D37940081B069 /* ViewState.enum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E979F62C4D37940081B069 /* ViewState.enum.swift */; }; 75E97A172C501B120081B069 /* ScreenWrapper.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A162C501B120081B069 /* ScreenWrapper.struct.swift */; }; - 75E97A1C2C501D660081B069 /* ScreenTypeProviderProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A1A2C501D660081B069 /* ScreenTypeProviderProtocol.swift */; }; + 75E97A1C2C501D660081B069 /* ScreenTypeProvider.protocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A1A2C501D660081B069 /* ScreenTypeProvider.protocol.swift */; }; 75E97A232C5023600081B069 /* SearchFilter.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.struct.swift */; }; 75E97A242C5023600081B069 /* SearchFilter.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.struct.swift */; }; 75E97A252C5023600081B069 /* SearchFilter.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A222C5023600081B069 /* SearchFilter.struct.swift */; }; @@ -129,7 +132,7 @@ 75E97A822C5133AD0081B069 /* LoadingView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */; }; 75E97A832C5133AD0081B069 /* LoadingView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */; }; 75E97A842C5133AD0081B069 /* LoadingView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */; }; - 75E97A882C51414D0081B069 /* CartRepositoryProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A872C51414D0081B069 /* CartRepositoryProtocol.swift */; }; + 75E97A882C51414D0081B069 /* CartRepository.protocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A872C51414D0081B069 /* CartRepository.protocol.swift */; }; 75E97A8D2C5142F10081B069 /* ProductsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A8C2C5142F10081B069 /* ProductsViewModel.swift */; }; 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97A912C5143630081B069 /* ProductsResolver.swift */; }; 75E97AA22C5147A20081B069 /* SdkResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E97AA12C5147A20081B069 /* SdkResolver.swift */; }; @@ -182,7 +185,7 @@ 09908BAF81F91172D8D6062C /* Pods_demo_store_iosTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_demo_store_iosTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 752F1D392C41E01D002D4AC3 /* ProductCartItem.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductCartItem.struct.swift; sourceTree = ""; }; 752F1D3B2C41E156002D4AC3 /* CartViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartViewModel.swift; sourceTree = ""; }; - 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepository.swift; sourceTree = ""; }; + 752F1D3F2C41E5BC002D4AC3 /* CartRepositoryImpl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepositoryImpl.swift; sourceTree = ""; }; 752F1D422C45779F002D4AC3 /* GetRecommendationsUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetRecommendationsUseCase.swift; sourceTree = ""; }; 752F1D462C45954A002D4AC3 /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; 752F1D482C459680002D4AC3 /* SearchScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchScreenView.struct.swift; sourceTree = ""; }; @@ -204,7 +207,7 @@ 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrroScreenView.struct.swift; sourceTree = ""; }; 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationManager.swift; sourceTree = ""; }; 75A3F4282C38593800AAC175 /* ToolbarView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarView.struct.swift; sourceTree = ""; }; - 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKManagingProtocol.swift; sourceTree = ""; }; + 75A4D5AD2C579A3F00929368 /* SDKManaging.protocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKManaging.protocol.swift; sourceTree = ""; }; 75A4D5B12C579A4900929368 /* SdkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkManager.swift; sourceTree = ""; }; 75A4D60D2C5CD80500929368 /* RemoteImageView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageView.struct.swift; sourceTree = ""; }; 75A4D6152C5D0AD400929368 /* Sizes.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sizes.struct.swift; sourceTree = ""; }; @@ -214,7 +217,7 @@ 75B935582C3564360063E814 /* ContentView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.struct.swift; sourceTree = ""; }; 75B9355A2C3564370063E814 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 75B9355D2C3564370063E814 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 75BAD4732C60D5ED00DFFF02 /* TabBarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarButton.swift; sourceTree = ""; }; + 75BAD4732C60D5ED00DFFF02 /* BottomBarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomBarButton.swift; sourceTree = ""; }; 75BAD4782C60D8EA00DFFF02 /* PriceAndShopButtonView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceAndShopButtonView.struct.swift; sourceTree = ""; }; 75BAD47A2C60D91700DFFF02 /* ProductInfoView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductInfoView.struct.swift; sourceTree = ""; }; 75BAD47C2C60D95F00DFFF02 /* ProductImageView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductImageView.struct.swift; sourceTree = ""; }; @@ -230,6 +233,7 @@ 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TotalPriceSection.struct.swift; sourceTree = ""; }; 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyCartView.struct.swift; sourceTree = ""; }; 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveButtonView.struct.swift; sourceTree = ""; }; + 75BAD5692C63A4F000DFFF02 /* Typography.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typography.struct.swift; sourceTree = ""; }; 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.struct.swift; sourceTree = ""; }; 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbarView.struct.swift; sourceTree = ""; }; 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.struct.swift; sourceTree = ""; }; @@ -247,7 +251,7 @@ 75E979F02C4D2DBE0081B069 /* Timer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; 75E979F62C4D37940081B069 /* ViewState.enum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewState.enum.swift; sourceTree = ""; }; 75E97A162C501B120081B069 /* ScreenWrapper.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenWrapper.struct.swift; sourceTree = ""; }; - 75E97A1A2C501D660081B069 /* ScreenTypeProviderProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenTypeProviderProtocol.swift; sourceTree = ""; }; + 75E97A1A2C501D660081B069 /* ScreenTypeProvider.protocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenTypeProvider.protocol.swift; sourceTree = ""; }; 75E97A222C5023600081B069 /* SearchFilter.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFilter.struct.swift; sourceTree = ""; }; 75E97A262C50237F0081B069 /* SearchIndustrialFilters.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchIndustrialFilters.struct.swift; sourceTree = ""; }; 75E97A2A2C5023960081B069 /* SearchFashionSize.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFashionSize.struct.swift; sourceTree = ""; }; @@ -263,7 +267,7 @@ 75E97A6F2C5041780081B069 /* ImageItem.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageItem.struct.swift; sourceTree = ""; }; 75E97A772C512F8C0081B069 /* DependenciesInitialization.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DependenciesInitialization.struct.swift; sourceTree = ""; }; 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.struct.swift; sourceTree = ""; }; - 75E97A872C51414D0081B069 /* CartRepositoryProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepositoryProtocol.swift; sourceTree = ""; }; + 75E97A872C51414D0081B069 /* CartRepository.protocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartRepository.protocol.swift; sourceTree = ""; }; 75E97A8C2C5142F10081B069 /* ProductsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsViewModel.swift; sourceTree = ""; }; 75E97A912C5143630081B069 /* ProductsResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductsResolver.swift; sourceTree = ""; }; 75E97AA12C5147A20081B069 /* SdkResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SdkResolver.swift; sourceTree = ""; }; @@ -348,7 +352,7 @@ 75A4D5AC2C579A2100929368 /* Protocols */ = { isa = PBXGroup; children = ( - 75A4D5AD2C579A3F00929368 /* SDKManagingProtocol.swift */, + 75A4D5AD2C579A3F00929368 /* SDKManaging.protocol.swift */, ); path = Protocols; sourceTree = ""; @@ -411,6 +415,7 @@ 75B935552C3564360063E814 /* App */ = { isa = PBXGroup; children = ( + 75BAD5672C63A4BE00DFFF02 /* UI */, 75E979E12C4AE4630081B069 /* Views */, 75E97A1F2C501E650081B069 /* ViewModels */, 75ECCD182C36F92A00D6D346 /* Navigation */, @@ -433,7 +438,7 @@ 75BAD4722C60D5CC00DFFF02 /* button */ = { isa = PBXGroup; children = ( - 75BAD4732C60D5ED00DFFF02 /* TabBarButton.swift */, + 75BAD4732C60D5ED00DFFF02 /* BottomBarButton.swift */, ); path = button; sourceTree = ""; @@ -555,6 +560,24 @@ path = EmptyScreenState; sourceTree = ""; }; + 75BAD5672C63A4BE00DFFF02 /* UI */ = { + isa = PBXGroup; + children = ( + 75BAD5682C63A4D800DFFF02 /* Fonts */, + 75A4D6142C5D09C400929368 /* Sizes */, + 75A4D6132C5D09BB00929368 /* Colors */, + ); + path = UI; + sourceTree = ""; + }; + 75BAD5682C63A4D800DFFF02 /* Fonts */ = { + isa = PBXGroup; + children = ( + 75BAD5692C63A4F000DFFF02 /* Typography.struct.swift */, + ); + path = Fonts; + sourceTree = ""; + }; 75E979842C4935170081B069 /* Core */ = { isa = PBXGroup; children = ( @@ -885,7 +908,7 @@ 75E97A1B2C501D660081B069 /* Protocols */ = { isa = PBXGroup; children = ( - 75E97A1A2C501D660081B069 /* ScreenTypeProviderProtocol.swift */, + 75E97A1A2C501D660081B069 /* ScreenTypeProvider.protocol.swift */, ); path = Protocols; sourceTree = ""; @@ -980,7 +1003,7 @@ 75E97A852C5140F70081B069 /* Protocols */ = { isa = PBXGroup; children = ( - 75E97A872C51414D0081B069 /* CartRepositoryProtocol.swift */, + 75E97A872C51414D0081B069 /* CartRepository.protocol.swift */, ); path = Protocols; sourceTree = ""; @@ -988,7 +1011,7 @@ 75E97A862C5141320081B069 /* Implementation */ = { isa = PBXGroup; children = ( - 752F1D3F2C41E5BC002D4AC3 /* CartRepository.swift */, + 752F1D3F2C41E5BC002D4AC3 /* CartRepositoryImpl.swift */, ); path = Implementation; sourceTree = ""; @@ -1022,8 +1045,6 @@ children = ( 75A4D61E2C5D0C7500929368 /* Assets */, 75A4D61D2C5D0C6900929368 /* Strings */, - 75A4D6132C5D09BB00929368 /* Colors */, - 75A4D6142C5D09C400929368 /* Sizes */, ); name = Resources; path = Core/Resources; @@ -1268,7 +1289,7 @@ 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */, 75A4D60F2C5CD84800929368 /* RemoteImageView.struct.swift in Sources */, 75E97A652C50320F0081B069 /* RecommendedProduct.struct.swift in Sources */, - 75BAD4742C60D5ED00DFFF02 /* TabBarButton.swift in Sources */, + 75BAD4742C60D5ED00DFFF02 /* BottomBarButton.swift in Sources */, 752F1D3A2C41E01D002D4AC3 /* ProductCartItem.struct.swift in Sources */, 75A4D6162C5D0AD400929368 /* Sizes.struct.swift in Sources */, 75E97A8D2C5142F10081B069 /* ProductsViewModel.swift in Sources */, @@ -1290,11 +1311,11 @@ 75BAD48C2C60EB0F00DFFF02 /* TopSectionView.struct.swift in Sources */, 75E979E72C4AE8870081B069 /* TabItem.struct.swift in Sources */, 75E97A6B2C5037130081B069 /* MainViews.struct.swift in Sources */, - 75E97A882C51414D0081B069 /* CartRepositoryProtocol.swift in Sources */, + 75E97A882C51414D0081B069 /* CartRepository.protocol.swift in Sources */, 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */, 75E979CC2C4973DA0081B069 /* CartResolver.swift in Sources */, 75E979DE2C4ADDD20081B069 /* RootScreenType.enum.swift in Sources */, - 75E97A1C2C501D660081B069 /* ScreenTypeProviderProtocol.swift in Sources */, + 75E97A1C2C501D660081B069 /* ScreenTypeProvider.protocol.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.struct.swift in Sources */, 75BAD4B42C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */, 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift in Sources */, @@ -1305,6 +1326,7 @@ 75E97A822C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 752F1D472C45954A002D4AC3 /* SearchViewModel.swift in Sources */, 75E979C72C496E1C0081B069 /* HomeResolver.swift in Sources */, + 75BAD56A2C63A4F000DFFF02 /* Typography.struct.swift in Sources */, 75E97A2F2C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */, 75BAD4802C60D98700DFFF02 /* PriceAndShopButtonView.struct.swift in Sources */, 75E97A172C501B120081B069 /* ScreenWrapper.struct.swift in Sources */, @@ -1334,10 +1356,10 @@ 75E97A2B2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */, 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift in Sources */, 75BAD4892C60DC4F00DFFF02 /* StoriesViewController.swift in Sources */, - 752F1D402C41E5BC002D4AC3 /* CartRepository.swift in Sources */, + 752F1D402C41E5BC002D4AC3 /* CartRepositoryImpl.swift in Sources */, 75E97A272C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */, 75E979D02C4974440081B069 /* CartListView.struct.swift in Sources */, - 75A4D5AE2C579A3F00929368 /* SDKManagingProtocol.swift in Sources */, + 75A4D5AE2C579A3F00929368 /* SDKManaging.protocol.swift in Sources */, 75E97A712C5041920081B069 /* ImageItem.struct.swift in Sources */, 75E979D42C4974660081B069 /* CartListItemView.struct.swift in Sources */, 75E97A392C5024CD0081B069 /* SearchProduct.struct.swift in Sources */, @@ -1364,6 +1386,7 @@ 75BAD4AA2C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */, 75E97A422C5025080081B069 /* SearchCategory.struct.swift in Sources */, 75A4D61B2C5D0AE800929368 /* AppColors.struct.swift in Sources */, + 75BAD56B2C63A4F000DFFF02 /* Typography.struct.swift in Sources */, 75E97A832C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 75A4D6172C5D0AD400929368 /* Sizes.struct.swift in Sources */, 75BAD4BA2C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */, @@ -1391,6 +1414,7 @@ 75BAD4AB2C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */, 75E97A432C5025080081B069 /* SearchCategory.struct.swift in Sources */, 75A4D61C2C5D0AE800929368 /* AppColors.struct.swift in Sources */, + 75BAD56C2C63A4F000DFFF02 /* Typography.struct.swift in Sources */, 75E97A842C5133AD0081B069 /* LoadingView.struct.swift in Sources */, 75A4D6182C5D0AD400929368 /* Sizes.struct.swift in Sources */, 75BAD4BB2C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */, From 9292243bb82e58606222ad3daab298af3a82370b Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 7 Aug 2024 16:19:55 +0200 Subject: [PATCH 84/85] refactor(app): Remove hardcode sizes from toolbar --- App/UI/Sizes/Sizes.struct.swift | 2 ++ App/Views/ToolBar/ToolbarView.struct.swift | 16 ++++++++-------- .../HomeStoriesContainerView.struct.swift | 8 ++++---- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/App/UI/Sizes/Sizes.struct.swift b/App/UI/Sizes/Sizes.struct.swift index ca9a7bc..93a5b33 100644 --- a/App/UI/Sizes/Sizes.struct.swift +++ b/App/UI/Sizes/Sizes.struct.swift @@ -11,6 +11,7 @@ struct Sizes { static let large: CGFloat = 10 static let xLarge: CGFloat = 12 static let xxLarge: CGFloat = 20 + static let xxxLarge: CGFloat = 32 } struct Spacing { @@ -28,6 +29,7 @@ struct Sizes { static let largeImageSize: CGFloat = 300 static let largeImageWidth: CGFloat = 280 static let largeContainerHeight: CGFloat = 250 + static let storiesHeight: CGFloat = 200 static let smallCircle: CGFloat = 10 static let badge: CGFloat = 14 static let buttonHeight: CGFloat = 50 diff --git a/App/Views/ToolBar/ToolbarView.struct.swift b/App/Views/ToolBar/ToolbarView.struct.swift index 35a6cfb..0c64590 100644 --- a/App/Views/ToolBar/ToolbarView.struct.swift +++ b/App/Views/ToolBar/ToolbarView.struct.swift @@ -12,26 +12,26 @@ struct ToolbarView: View { Image("ToolbarLogo") .resizable() .aspectRatio(contentMode: .fit) - .padding(.vertical, 10) + .padding(.vertical, Sizes.Padding.large) .foregroundColor(.white) } - .frame(height: 50) + .frame(height: Sizes.Size.buttonHeight) - HStack(spacing: 20) { + HStack(spacing: Sizes.Spacing.large) { Image("MenuIcon") .resizable() .renderingMode(.template) - .frame(width: 24, height: 24) + .frame(width: Sizes.Size.smallIconSize, height: Sizes.Size.smallIconSize) .foregroundColor(.black) - .padding(.leading, 12) + .padding(.leading, Sizes.Padding.xLarge) Spacer() Image("SearchIcon") .resizable() .renderingMode(.template) - .frame(width: 30, height: 30) + .frame(width: Sizes.Size.icon, height: Sizes.Size.icon) .foregroundColor(.black) .onTapGesture { navigationManager.navigateToScreen(SearchScreenView()) @@ -40,9 +40,9 @@ struct ToolbarView: View { Image("CartIcon") .resizable() .renderingMode(.template) - .frame(width: 30, height: 30) + .frame(width: Sizes.Size.icon, height: Sizes.Size.icon) .foregroundColor(.black) - .padding(.trailing, 12) + .padding(.trailing, Sizes.Padding.xLarge) .onTapGesture { navigationManager.navigateToScreen(CartScreenView()) } diff --git a/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.struct.swift b/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.struct.swift index bee14fd..d166fed 100644 --- a/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.struct.swift +++ b/Feature/Home/Presentation/View/Stories/HomeStoriesContainerView.struct.swift @@ -4,15 +4,15 @@ import UIKit struct HomeStoriesContainerView: View { var body: some View { - VStack(alignment: .leading, spacing: 16) { + VStack(alignment: .leading, spacing: Sizes.Spacing.standard) { Text("stories_title") - .font(.system(size: 24)) + .font(.system(size: Typography.FontSize.xxxLarge)) .foregroundColor(.black) .padding(.horizontal) - .padding(.top, 32) + .padding(.top, Sizes.Padding.xxxLarge) StoriesViewControllerRepresentable() - .frame(height: 200) + .frame(height: Sizes.Size.storiesHeight) } } } From f30e211978dfc134f26e3c435de29bf116859d10 Mon Sep 17 00:00:00 2001 From: Daniel Green Date: Wed, 7 Aug 2024 16:57:18 +0200 Subject: [PATCH 85/85] refactor(cart): Rename cart views and used sizes from constants --- App/UI/Sizes/Sizes.struct.swift | 1 + App/Views/Screens/CartScreenView.struct.swift | 20 ++++---- .../Presentation/Views/LoadingStateView.swift | 16 +++++++ ...r.struct.swift => RatingView.struct.swift} | 2 +- ...ift => CartActionButtonsView.struct.swift} | 4 +- .../View/Button/RemoveButtonView.struct.swift | 16 ------- .../ListItem/CartListItemView.struct.swift | 9 +++- .../Price/CartTotalPriceSection.struct.swift | 36 ++++++++++++++ .../View/Price/TotalPriceSection.struct.swift | 36 -------------- .../ShortRecommendationListView.struct.swift | 13 +++-- demo-store-ios.xcodeproj/project.pbxproj | 48 +++++++++---------- 11 files changed, 103 insertions(+), 98 deletions(-) create mode 100644 Core/Presentation/Views/LoadingStateView.swift rename Core/Presentation/Views/{RatingConverter.struct.swift => RatingView.struct.swift} (94%) rename Feature/Cart/Presentation/View/Button/{NavigationButtonsView.struct.swift => CartActionButtonsView.struct.swift} (91%) delete mode 100644 Feature/Cart/Presentation/View/Button/RemoveButtonView.struct.swift create mode 100644 Feature/Cart/Presentation/View/Price/CartTotalPriceSection.struct.swift delete mode 100644 Feature/Cart/Presentation/View/Price/TotalPriceSection.struct.swift diff --git a/App/UI/Sizes/Sizes.struct.swift b/App/UI/Sizes/Sizes.struct.swift index 93a5b33..91bca4e 100644 --- a/App/UI/Sizes/Sizes.struct.swift +++ b/App/UI/Sizes/Sizes.struct.swift @@ -15,6 +15,7 @@ struct Sizes { } struct Spacing { + static let extraSmall: CGFloat = 2 static let small: CGFloat = 5 static let standard: CGFloat = 16 static let large: CGFloat = 20 diff --git a/App/Views/Screens/CartScreenView.struct.swift b/App/Views/Screens/CartScreenView.struct.swift index f5ee370..60c2c12 100644 --- a/App/Views/Screens/CartScreenView.struct.swift +++ b/App/Views/Screens/CartScreenView.struct.swift @@ -28,14 +28,13 @@ struct CartScreenView: View { var body: some View { ScrollView { - VStack(spacing: 0) { + LazyVStack(spacing: 0) { Spacer().frame(height: Sizes.Spacing.large) if isLoading { LoadingView(isLoading: $isLoading) } else if viewModel.cartItems.isEmpty { - EmptyCartView() - .frame(height: Sizes.Size.largeContainerHeight) + EmptyCartView().frame(height: Sizes.Size.largeContainerHeight) } else { CartListView( cartItems: viewModel.cartItems, @@ -44,14 +43,10 @@ struct CartScreenView: View { } ).frame(height: Sizes.Size.largeContainerHeight) - TotalPriceSection(totalPrice: totalPrice) + CartTotalPriceSection(totalPrice: totalPrice) + + CartActionButtonsView(navigationManager: navigationManager) - NavigationButtonsView( - navigationManager: navigationManager - ) - } - - if !isLoading { ShortRecommendationListView( recommendedProducts: viewModel.recommenderProducts, title: NSLocalizedString("recommend_like_title", comment: "") @@ -62,7 +57,10 @@ struct CartScreenView: View { } .navigationBarTitle("cart_tab_title") .onAppear { - navigationManager.setVisibility(hideToolbar: false, hideBottomBar: false) + navigationManager.setVisibility( + hideToolbar: false, + hideBottomBar: false + ) viewModel.loadRecommenderRecommendations() } } diff --git a/Core/Presentation/Views/LoadingStateView.swift b/Core/Presentation/Views/LoadingStateView.swift new file mode 100644 index 0000000..930aa2b --- /dev/null +++ b/Core/Presentation/Views/LoadingStateView.swift @@ -0,0 +1,16 @@ +import SwiftUI + +struct LoadingStateView: View { + let isLoading: Bool + let content: () -> Content + + var body: some View { + Group { + if isLoading { + LoadingView(isLoading: .constant(true)) + } else { + content() + } + } + } +} diff --git a/Core/Presentation/Views/RatingConverter.struct.swift b/Core/Presentation/Views/RatingView.struct.swift similarity index 94% rename from Core/Presentation/Views/RatingConverter.struct.swift rename to Core/Presentation/Views/RatingView.struct.swift index 3de01e7..7dabe30 100644 --- a/Core/Presentation/Views/RatingConverter.struct.swift +++ b/Core/Presentation/Views/RatingView.struct.swift @@ -12,7 +12,7 @@ struct RatingView: View { } var body: some View { - HStack(spacing: 2) { + HStack(spacing: Sizes.Spacing.extraSmall) { ForEach(1...5, id: \.self) { index in Image(systemName: self.starType(for: index)) .foregroundColor(AppColors.ratingColor) diff --git a/Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift b/Feature/Cart/Presentation/View/Button/CartActionButtonsView.struct.swift similarity index 91% rename from Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift rename to Feature/Cart/Presentation/View/Button/CartActionButtonsView.struct.swift index 2609dd1..8768312 100644 --- a/Feature/Cart/Presentation/View/Button/NavigationButtonsView.struct.swift +++ b/Feature/Cart/Presentation/View/Button/CartActionButtonsView.struct.swift @@ -1,6 +1,6 @@ import SwiftUI -struct NavigationButtonsView: View { +struct CartActionButtonsView: View { @ObservedObject var navigationManager: NavigationManager @@ -21,7 +21,7 @@ struct NavigationButtonsView: View { .cornerRadius(Sizes.CornerRadius.standard) .overlay( RoundedRectangle(cornerRadius: Sizes.CornerRadius.standard) - .stroke(Color.black, lineWidth: Sizes.BorderWidth.standard) + .stroke(AppColors.colorBlack, lineWidth: Sizes.BorderWidth.standard) ) } diff --git a/Feature/Cart/Presentation/View/Button/RemoveButtonView.struct.swift b/Feature/Cart/Presentation/View/Button/RemoveButtonView.struct.swift deleted file mode 100644 index 680750d..0000000 --- a/Feature/Cart/Presentation/View/Button/RemoveButtonView.struct.swift +++ /dev/null @@ -1,16 +0,0 @@ -import SwiftUI - -struct RemoveButtonView: View { - var action: () -> Void - - var body: some View { - Button(action: action) { - Image(systemName: "xmark") - .foregroundColor(AppColors.colorWhite) - .frame(width: Sizes.Size.smallIconSize, height: Sizes.Size.smallIconSize) - .background(AppColors.colorGray) - .clipShape(Circle()) - } - .buttonStyle(BorderlessButtonStyle()) - } -} diff --git a/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift b/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift index 7b5bd90..8f6e944 100644 --- a/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift +++ b/Feature/Cart/Presentation/View/ListItem/CartListItemView.struct.swift @@ -37,7 +37,14 @@ struct CartListItemView: View { .foregroundColor(AppColors.colorBlack) .padding(.trailing, Sizes.Padding.xLarge) - RemoveButtonView(action: removeFromCart) + Button(action: removeFromCart) { + Image(systemName: "xmark") + .foregroundColor(AppColors.colorWhite) + .frame(width: Sizes.Size.smallIconSize, height: Sizes.Size.smallIconSize) + .background(AppColors.colorGray) + .clipShape(Circle()) + } + .buttonStyle(BorderlessButtonStyle()) } .padding(.vertical, Sizes.Padding.medium) .background(AppColors.colorWhite) diff --git a/Feature/Cart/Presentation/View/Price/CartTotalPriceSection.struct.swift b/Feature/Cart/Presentation/View/Price/CartTotalPriceSection.struct.swift new file mode 100644 index 0000000..fd98583 --- /dev/null +++ b/Feature/Cart/Presentation/View/Price/CartTotalPriceSection.struct.swift @@ -0,0 +1,36 @@ +import SwiftUI + +struct CartTotalPriceSection: View { + var totalPrice: Int + + var body: some View { + VStack(alignment: .trailing, spacing: Sizes.Spacing.medium) { + Spacer().frame(height: Sizes.Spacing.medium) + + HStack { + Spacer() + Text("shipping_title") + .font(.system(size: Typography.FontSize.standard)) + .foregroundColor(AppColors.colorBlack) + .padding(.trailing, Sizes.Padding.xLarge) + + Text("Free") + .font(.system(size: Typography.FontSize.standard, weight: .bold)) + .foregroundColor(.black) + } + + HStack { + Spacer() + Text("total_title") + .font(.system(size: Typography.FontSize.standard)) + .foregroundColor(AppColors.colorBlack) + .padding(.trailing, Sizes.Padding.xLarge) + + Text("\(totalPrice)") + .font(.system(size: Typography.FontSize.standard, weight: .bold)) + .foregroundColor(AppColors.colorBlack) + } + } + .padding(.horizontal) + } +} diff --git a/Feature/Cart/Presentation/View/Price/TotalPriceSection.struct.swift b/Feature/Cart/Presentation/View/Price/TotalPriceSection.struct.swift deleted file mode 100644 index baf265d..0000000 --- a/Feature/Cart/Presentation/View/Price/TotalPriceSection.struct.swift +++ /dev/null @@ -1,36 +0,0 @@ -import SwiftUI - -struct TotalPriceSection: View { - var totalPrice: Int - - var body: some View { - VStack(alignment: .trailing, spacing: 12) { - Spacer().frame(height: 10) - - HStack { - Spacer() - Text("shipping_title") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding(.trailing, 12) - - Text("Free") - .font(.system(size: 16, weight: .bold)) - .foregroundColor(.black) - } - - HStack { - Spacer() - Text("total_title") - .font(.system(size: 16)) - .foregroundColor(.black) - .padding(.trailing, 12) - - Text("\(totalPrice)") - .font(.system(size: 16, weight: .bold)) - .foregroundColor(.black) - } - } - .padding(.horizontal) - } -} diff --git a/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift b/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift index c366b81..c949cb5 100644 --- a/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift +++ b/Feature/Home/Presentation/View/ListRecommendation/ShortRecommendationListView.struct.swift @@ -1,6 +1,7 @@ import SwiftUI struct ShortRecommendationListView: View { + @EnvironmentObject var navigationManager: NavigationManager var recommendedProducts: [RecommendedProduct] var title: String @@ -9,11 +10,9 @@ struct ShortRecommendationListView: View { VStack(alignment: .leading) { SectionHeaderView(title: title) { navigationManager.navigateToScreen( - AnyView( - FullRecommendationListView( - recommendedProducts: recommendedProducts, - title: NSLocalizedString("reccomender_title", comment: "") - ) + FullRecommendationListView( + recommendedProducts: recommendedProducts, + title: NSLocalizedString("reccomender_title", comment: "") ) ) } @@ -23,8 +22,8 @@ struct ShortRecommendationListView: View { ForEach(recommendedProducts, id: \.id) { product in ProductListItemView( product: product, - containerWidth: 140, - containerHeight: 270, + containerWidth: Sizes.Size.mediumImage, + containerHeight: Sizes.Size.largeImageWidth, imageWidth: Sizes.Size.mediumImage, imageHeight: Sizes.Size.mediumImage, showShopButton: false diff --git a/demo-store-ios.xcodeproj/project.pbxproj b/demo-store-ios.xcodeproj/project.pbxproj index 3b66022..9a52b14 100644 --- a/demo-store-ios.xcodeproj/project.pbxproj +++ b/demo-store-ios.xcodeproj/project.pbxproj @@ -23,7 +23,7 @@ 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CF12C3D7A5D007FAB88 /* SectionHeaderView.struct.swift */; }; 75674CFE2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift */; }; 75674D012C3DA0FA007FAB88 /* RemoteImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */; }; - 75674D032C3DA14F007FAB88 /* RatingConverter.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D022C3DA14F007FAB88 /* RatingConverter.struct.swift */; }; + 75674D032C3DA14F007FAB88 /* RatingView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75674D022C3DA14F007FAB88 /* RatingView.struct.swift */; }; 75A3F4232C383CEF00AAC175 /* SettingsInputCodeView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.struct.swift */; }; 75A3F4252C383E8100AAC175 /* SettingsErrroScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.struct.swift */; }; 75A3F4272C3858DE00AAC175 /* NavigationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75A3F4262C3858DE00AAC175 /* NavigationManager.swift */; }; @@ -57,19 +57,19 @@ 75BAD4A92C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4A82C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift */; }; 75BAD4AA2C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4A82C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift */; }; 75BAD4AB2C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4A82C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift */; }; - 75BAD4B02C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4AF2C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift */; }; - 75BAD4B42C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */; }; - 75BAD4B52C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */; }; - 75BAD4B62C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */; }; + 75BAD4B02C60F8ED00DFFF02 /* CartActionButtonsView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4AF2C60F8ED00DFFF02 /* CartActionButtonsView.struct.swift */; }; + 75BAD4B42C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B32C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift */; }; + 75BAD4B52C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B32C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift */; }; + 75BAD4B62C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B32C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift */; }; 75BAD4B92C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */; }; 75BAD4BA2C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */; }; 75BAD4BB2C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */; }; - 75BAD4BD2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */; }; - 75BAD4BE2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */; }; - 75BAD4BF2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */; }; 75BAD56A2C63A4F000DFFF02 /* Typography.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD5692C63A4F000DFFF02 /* Typography.struct.swift */; }; 75BAD56B2C63A4F000DFFF02 /* Typography.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD5692C63A4F000DFFF02 /* Typography.struct.swift */; }; 75BAD56C2C63A4F000DFFF02 /* Typography.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD5692C63A4F000DFFF02 /* Typography.struct.swift */; }; + 75BAD56E2C63BFAA00DFFF02 /* LoadingStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD56D2C63BFAA00DFFF02 /* LoadingStateView.swift */; }; + 75BAD56F2C63BFAA00DFFF02 /* LoadingStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD56D2C63BFAA00DFFF02 /* LoadingStateView.swift */; }; + 75BAD5702C63BFAA00DFFF02 /* LoadingStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75BAD56D2C63BFAA00DFFF02 /* LoadingStateView.swift */; }; 75E1C8EB2C3E9401005018B4 /* FullRecommendationListView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */; }; 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */; }; 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.struct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */; }; @@ -201,7 +201,7 @@ 75674CFB2C3D9964007FAB88 /* RecommendedProductMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendedProductMapper.swift; sourceTree = ""; }; 75674CFD2C3D9A5A007FAB88 /* ShortRecommendationListView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortRecommendationListView.struct.swift; sourceTree = ""; }; 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteImageLoader.swift; sourceTree = ""; }; - 75674D022C3DA14F007FAB88 /* RatingConverter.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingConverter.struct.swift; sourceTree = ""; }; + 75674D022C3DA14F007FAB88 /* RatingView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RatingView.struct.swift; sourceTree = ""; }; 75A3F4212C3828A400AAC175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 75A3F4222C383CEF00AAC175 /* SettingsInputCodeView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInputCodeView.struct.swift; sourceTree = ""; }; 75A3F4242C383E8100AAC175 /* SettingsErrroScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrroScreenView.struct.swift; sourceTree = ""; }; @@ -229,11 +229,11 @@ 75BAD49D2C60EF8A00DFFF02 /* ProductDetailsSectionView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductDetailsSectionView.struct.swift; sourceTree = ""; }; 75BAD4A22C60F54300DFFF02 /* PriceSectionView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PriceSectionView.struct.swift; sourceTree = ""; }; 75BAD4A82C60F7D500DFFF02 /* SettingsErrorScreenView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsErrorScreenView.struct.swift; sourceTree = ""; }; - 75BAD4AF2C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationButtonsView.struct.swift; sourceTree = ""; }; - 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TotalPriceSection.struct.swift; sourceTree = ""; }; + 75BAD4AF2C60F8ED00DFFF02 /* CartActionButtonsView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartActionButtonsView.struct.swift; sourceTree = ""; }; + 75BAD4B32C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CartTotalPriceSection.struct.swift; sourceTree = ""; }; 75BAD4B82C61021800DFFF02 /* EmptyCartView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyCartView.struct.swift; sourceTree = ""; }; - 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveButtonView.struct.swift; sourceTree = ""; }; 75BAD5692C63A4F000DFFF02 /* Typography.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typography.struct.swift; sourceTree = ""; }; + 75BAD56D2C63BFAA00DFFF02 /* LoadingStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingStateView.swift; sourceTree = ""; }; 75E1C8EA2C3E9401005018B4 /* FullRecommendationListView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullRecommendationListView.struct.swift; sourceTree = ""; }; 75E1C8EC2C3EACDA005018B4 /* DetailsToolbarView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailsToolbarView.struct.swift; sourceTree = ""; }; 75E1C8EE2C3ECC95005018B4 /* ProductListItemView.struct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListItemView.struct.swift; sourceTree = ""; }; @@ -538,8 +538,7 @@ 75BAD4AD2C60F8CC00DFFF02 /* Button */ = { isa = PBXGroup; children = ( - 75BAD4AF2C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift */, - 75BAD4BC2C61047C00DFFF02 /* RemoveButtonView.struct.swift */, + 75BAD4AF2C60F8ED00DFFF02 /* CartActionButtonsView.struct.swift */, ); path = Button; sourceTree = ""; @@ -547,7 +546,7 @@ 75BAD4AE2C60F8DB00DFFF02 /* Price */ = { isa = PBXGroup; children = ( - 75BAD4B32C60F9C300DFFF02 /* TotalPriceSection.struct.swift */, + 75BAD4B32C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift */, ); path = Price; sourceTree = ""; @@ -978,8 +977,9 @@ children = ( 75674D002C3DA0FA007FAB88 /* RemoteImageLoader.swift */, 75A4D60D2C5CD80500929368 /* RemoteImageView.struct.swift */, - 75674D022C3DA14F007FAB88 /* RatingConverter.struct.swift */, + 75674D022C3DA14F007FAB88 /* RatingView.struct.swift */, 75E97A812C5133AD0081B069 /* LoadingView.struct.swift */, + 75BAD56D2C63BFAA00DFFF02 /* LoadingStateView.swift */, ); path = Views; sourceTree = ""; @@ -1287,6 +1287,7 @@ 75E97AAC2C514B4D0081B069 /* SearchResolver.swift in Sources */, 75E97A642C50320F0081B069 /* RecommendedProductMapper.swift in Sources */, 75E97AA52C5147FC0081B069 /* HomeViewModel.swift in Sources */, + 75BAD56E2C63BFAA00DFFF02 /* LoadingStateView.swift in Sources */, 75A4D60F2C5CD84800929368 /* RemoteImageView.struct.swift in Sources */, 75E97A652C50320F0081B069 /* RecommendedProduct.struct.swift in Sources */, 75BAD4742C60D5ED00DFFF02 /* BottomBarButton.swift in Sources */, @@ -1317,9 +1318,9 @@ 75E979DE2C4ADDD20081B069 /* RootScreenType.enum.swift in Sources */, 75E97A1C2C501D660081B069 /* ScreenTypeProvider.protocol.swift in Sources */, 75674CF22C3D7A5D007FAB88 /* SectionHeaderView.struct.swift in Sources */, - 75BAD4B42C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */, + 75BAD4B42C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift in Sources */, 75674CDE2C3C4292007FAB88 /* HomeStoriesContainerView.struct.swift in Sources */, - 75BAD4B02C60F8ED00DFFF02 /* NavigationButtonsView.struct.swift in Sources */, + 75BAD4B02C60F8ED00DFFF02 /* CartActionButtonsView.struct.swift in Sources */, 75BAD4832C60DB1C00DFFF02 /* ProductImageView.struct.swift in Sources */, 75ECCD0B2C36BDF500D6D346 /* HomeScreenView.struct.swift in Sources */, 75BAD4B92C61021800DFFF02 /* EmptyCartView.struct.swift in Sources */, @@ -1337,7 +1338,6 @@ 75B935572C3564360063E814 /* DemoStoreApp.struct.swift in Sources */, 75E1C8ED2C3EACDA005018B4 /* DetailsToolbarView.struct.swift in Sources */, 75BAD4942C60ED4A00DFFF02 /* ActionSectionView.struct.swift in Sources */, - 75BAD4BD2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */, 7559449F2C357E5C00C274C9 /* SplashScreenView.struct.swift in Sources */, 75E1C8EF2C3ECC95005018B4 /* ProductListItemView.struct.swift in Sources */, 75E97A922C5143630081B069 /* ProductsResolver.swift in Sources */, @@ -1363,7 +1363,7 @@ 75E97A712C5041920081B069 /* ImageItem.struct.swift in Sources */, 75E979D42C4974660081B069 /* CartListItemView.struct.swift in Sources */, 75E97A392C5024CD0081B069 /* SearchProduct.struct.swift in Sources */, - 75674D032C3DA14F007FAB88 /* RatingConverter.struct.swift in Sources */, + 75674D032C3DA14F007FAB88 /* RatingView.struct.swift in Sources */, 75BAD49E2C60EF8A00DFFF02 /* ProductDetailsSectionView.struct.swift in Sources */, 75BAD4902C60EB4D00DFFF02 /* ProductImagesSectionView.struct.swift in Sources */, 752F1D3C2C41E157002D4AC3 /* CartViewModel.swift in Sources */, @@ -1379,6 +1379,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75BAD56F2C63BFAA00DFFF02 /* LoadingStateView.swift in Sources */, 75E97A302C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */, 75E97A3A2C5024CD0081B069 /* SearchProduct.struct.swift in Sources */, 75E97A4A2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, @@ -1396,9 +1397,8 @@ 75E97AB12C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */, 75E97A282C50237F0081B069 /* SearchIndustrialFilters.struct.swift in Sources */, 75BAD49A2C60EE8100DFFF02 /* CounterSectionView.struct.swift in Sources */, - 75BAD4BE2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */, 75E97A2C2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */, - 75BAD4B52C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */, + 75BAD4B52C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift in Sources */, 75E97A462C5025240081B069 /* SearchQuery.struct.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1407,6 +1407,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 75BAD5702C63BFAA00DFFF02 /* LoadingStateView.swift in Sources */, 75E97A312C5023B10081B069 /* SearchFashionColor.struct.swift in Sources */, 75E97A4B2C50253A0081B069 /* SearchSuggest.struct.swift in Sources */, 75E97A4F2C50255A0081B069 /* SearchPriceRange.struct.swift in Sources */, @@ -1424,9 +1425,8 @@ 75E97AB22C514D2D0081B069 /* AppConvigVariables.struct.swift in Sources */, 75E97A3B2C5024CD0081B069 /* SearchProduct.struct.swift in Sources */, 75BAD49B2C60EE8100DFFF02 /* CounterSectionView.struct.swift in Sources */, - 75BAD4BF2C61047C00DFFF02 /* RemoveButtonView.struct.swift in Sources */, 75E97A2D2C5023960081B069 /* SearchFashionSize.struct.swift in Sources */, - 75BAD4B62C60F9C300DFFF02 /* TotalPriceSection.struct.swift in Sources */, + 75BAD4B62C60F9C300DFFF02 /* CartTotalPriceSection.struct.swift in Sources */, 75E97A3F2C5024EF0081B069 /* SearchRedirect.struct.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0;