diff --git a/assets/images/esim_top_bg.png b/assets/images/esim_top_bg.png index 12139ff..79fcc4c 100644 Binary files a/assets/images/esim_top_bg.png and b/assets/images/esim_top_bg.png differ diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5ae94a6..5a9f2a4 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,15 @@ objects = { /* Begin PBXBuildFile section */ - 00C1AB7B0C8F1922F3F1AE65 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54C8901E9D1856D980DFFE46 /* Pods_Runner.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 81D638B66EB4658C8192CA0D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 445696AB37183A7C63CB7E98 /* Pods_RunnerTests.framework */; }; + 94B491F6EAAA79D2947A02BD /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BA7A98D7E1CD160163E28329 /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + B7B14C5E8DB2459D45E2AD2E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75864C28F633B337B6CD7995 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -46,13 +46,14 @@ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 369614DBDD277BF9018C34BC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 445696AB37183A7C63CB7E98 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4FD33ADDA221C4BBA29FA3D6 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 54C8901E9D1856D980DFFE46 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 626B072D1717B50A277DA3C7 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 62ED1D923084D6092BECB5AC /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 6997591091A0E8DA4E4776AA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 6BD7534B4533D500F969D46C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 75864C28F633B337B6CD7995 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -61,10 +62,9 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B691822B373AD22ECA93B798 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - C1FCB3EF88270ED76DFA3FBD /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - D56ABB8F306EF9F6809C0C1E /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - E2E6DC2B6718F55E3BF165E7 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + AB77C0F975F5B780954288AA /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + AE2DC54B7F4682B91B6259C6 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + BA7A98D7E1CD160163E28329 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,7 +72,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 00C1AB7B0C8F1922F3F1AE65 /* Pods_Runner.framework in Frameworks */, + B7B14C5E8DB2459D45E2AD2E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -80,7 +80,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 81D638B66EB4658C8192CA0D /* Pods_RunnerTests.framework in Frameworks */, + 94B491F6EAAA79D2947A02BD /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,24 +95,15 @@ path = RunnerTests; sourceTree = ""; }; - 5D45FB84C63476582408C414 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 54C8901E9D1856D980DFFE46 /* Pods_Runner.framework */, - 445696AB37183A7C63CB7E98 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 6D4A73F1E55857ADBD000C6A /* Pods */ = { isa = PBXGroup; children = ( - B691822B373AD22ECA93B798 /* Pods-Runner.debug.xcconfig */, - 4FD33ADDA221C4BBA29FA3D6 /* Pods-Runner.release.xcconfig */, - D56ABB8F306EF9F6809C0C1E /* Pods-Runner.profile.xcconfig */, - E2E6DC2B6718F55E3BF165E7 /* Pods-RunnerTests.debug.xcconfig */, - 626B072D1717B50A277DA3C7 /* Pods-RunnerTests.release.xcconfig */, - C1FCB3EF88270ED76DFA3FBD /* Pods-RunnerTests.profile.xcconfig */, + 369614DBDD277BF9018C34BC /* Pods-Runner.debug.xcconfig */, + 6BD7534B4533D500F969D46C /* Pods-Runner.release.xcconfig */, + 6997591091A0E8DA4E4776AA /* Pods-Runner.profile.xcconfig */, + 62ED1D923084D6092BECB5AC /* Pods-RunnerTests.debug.xcconfig */, + AB77C0F975F5B780954288AA /* Pods-RunnerTests.release.xcconfig */, + AE2DC54B7F4682B91B6259C6 /* Pods-RunnerTests.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -136,7 +127,7 @@ 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, 6D4A73F1E55857ADBD000C6A /* Pods */, - 5D45FB84C63476582408C414 /* Frameworks */, + F3A521C4EE6E75D0D8A88556 /* Frameworks */, ); sourceTree = ""; }; @@ -164,6 +155,15 @@ path = Runner; sourceTree = ""; }; + F3A521C4EE6E75D0D8A88556 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 75864C28F633B337B6CD7995 /* Pods_Runner.framework */, + BA7A98D7E1CD160163E28329 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -171,7 +171,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - BC66FA7BADCD3982DC87655E /* [CP] Check Pods Manifest.lock */, + 42DBF8C3008CA78F0E130EA1 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, CF8A29BE993C0C902CB143AF /* Frameworks */, @@ -190,15 +190,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 3825EC0F330C0B58EA2A8981 /* [CP] Check Pods Manifest.lock */, + 46DBB6E51DCB00168B7FED03 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 41FC0A605EBADE26C841287E /* [CP] Embed Pods Frameworks */, - D10E98BB568B7005161E1ABD /* [CP] Copy Pods Resources */, + E0E7566711BD38D2F6C5330A /* [CP] Embed Pods Frameworks */, + 5BB9E9D50E854F4D876D849A /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -270,28 +270,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3825EC0F330C0B58EA2A8981 /* [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-Runner-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; - }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -308,39 +286,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 41FC0A605EBADE26C841287E /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - BC66FA7BADCD3982DC87655E /* [CP] Check Pods Manifest.lock */ = { + 42DBF8C3008CA78F0E130EA1 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -362,7 +308,29 @@ 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; }; - D10E98BB568B7005161E1ABD /* [CP] Copy Pods Resources */ = { + 46DBB6E51DCB00168B7FED03 /* [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-Runner-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; + }; + 5BB9E9D50E854F4D876D849A /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -379,6 +347,38 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + E0E7566711BD38D2F6C5330A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -515,7 +515,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E2E6DC2B6718F55E3BF165E7 /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 62ED1D923084D6092BECB5AC /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -533,7 +533,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 626B072D1717B50A277DA3C7 /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = AB77C0F975F5B780954288AA /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -549,7 +549,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C1FCB3EF88270ED76DFA3FBD /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = AE2DC54B7F4682B91B6259C6 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/lib/common_packages/app_bar.dart b/lib/common_packages/app_bar.dart index 5ead337..6079a45 100644 --- a/lib/common_packages/app_bar.dart +++ b/lib/common_packages/app_bar.dart @@ -35,46 +35,57 @@ class CommonAppBar extends StatelessWidget { /// LEFT SIDE Row( children: [ - /// ✅ LOGO / PATH ICON (SIZE CONTROLLED) - NOW FROM LOCAL STORAGE - FutureBuilder( - future: LocalPreference.getSelectedCityLogo(), - builder: (context, snapshot) { - final String? logoPath = snapshot.data; - final bool hasLogo = snapshot.hasData && - logoPath != null && - logoPath.isNotEmpty; - - // ✅ Build full image URL with base URL - final String? fullLogoUrl = hasLogo - ? "${ApiUrls.baseUrl}$logoPath" - : null; - - return SizedBox( - height: hasLogo ? 40.h : 32.h, // 🔥 ONLY city logo bigger - child: hasLogo && fullLogoUrl != null - ? Image.network( - fullLogoUrl, - fit: BoxFit.contain, - errorBuilder: (context, error, stackTrace) { - return Image.asset( - isWhiteLogo - ? "assets/logo/logo_city_cards_white.png" - : "assets/logo/logo_city_cards.png", - fit: BoxFit.contain, - ); - }, - ) - : Image.asset( - isWhiteLogo - ? "assets/logo/logo_city_cards_white.png" - : "assets/logo/logo_city_cards.png", - fit: BoxFit.contain, - ), + /// ✅ LOGO (TAP ENABLED ONLY WHEN isSelectCity == true) + GestureDetector( + onTap: isSelectCity + ? () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (_) => const CitySelectionBottomSheet(), ); - }, + } + : null, + child: FutureBuilder( + future: LocalPreference.getSelectedCityLogo(), + builder: (context, snapshot) { + final String? logoPath = snapshot.data; + final bool hasLogo = snapshot.hasData && + logoPath != null && + logoPath.isNotEmpty; + + final String? fullLogoUrl = + hasLogo ? "${ApiUrls.baseUrl}$logoPath" : null; + + return SizedBox( + height: hasLogo ? 40.h : 32.h, + child: hasLogo && fullLogoUrl != null + ? Image.network( + fullLogoUrl, + fit: BoxFit.contain, + errorBuilder: + (context, error, stackTrace) { + return Image.asset( + isWhiteLogo + ? "assets/logo/logo_city_cards_white.png" + : "assets/logo/logo_city_cards.png", + fit: BoxFit.contain, + ); + }, + ) + : Image.asset( + isWhiteLogo + ? "assets/logo/logo_city_cards_white.png" + : "assets/logo/logo_city_cards.png", + fit: BoxFit.contain, + ), + ); + }, + ), ), - /// ✅ CITY DROPDOWN + /// ✅ CITY DROPDOWN ICON (UNCHANGED) if (isSelectCity) IconButton( onPressed: () { @@ -82,7 +93,8 @@ class CommonAppBar extends StatelessWidget { context: context, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (_) => const CitySelectionBottomSheet(), + builder: (_) => + const CitySelectionBottomSheet(), ); }, icon: Icon( @@ -134,29 +146,28 @@ class CommonAppBar extends StatelessWidget { builder: (context, state) { String? imagePath; - // ✅ Get image from profile state if (state is ProfileLoaded) { - imagePath = state.profile.profileImage; + imagePath = + state.profile.profileImage; } - // ✅ Build full image URL final String? imageUrl = - (imagePath != null && imagePath.isNotEmpty) + (imagePath != null && + imagePath.isNotEmpty) ? "${ApiUrls.baseUrl}$imagePath" : null; return CircleAvatar( radius: 20.r, - backgroundColor: const Color(0xffFFDFDF), - - // ✅ Network image only if exists + backgroundColor: + const Color(0xffFFDFDF), backgroundImage: - (imageUrl != null && imageUrl.isNotEmpty) + (imageUrl != null && + imageUrl.isNotEmpty) ? NetworkImage(imageUrl) : null, - - // ✅ Default fallback (unchanged) - child: (imageUrl == null || imageUrl.isEmpty) + child: (imageUrl == null || + imageUrl.isEmpty) ? Image.asset( "assets/images/profile_default_img.png", ) @@ -169,12 +180,16 @@ class CommonAppBar extends StatelessWidget { ), ], ), + /// DIVIDER if (showDivider) Column( children: [ SizedBox(height: 12.h), - const Divider(height: 1, color: Color(0xFFD9D9D9)), + const Divider( + height: 1, + color: Color(0xFFD9D9D9), + ), SizedBox(height: 22.h), ], ), diff --git a/lib/esim_offer/esim_offer_view.dart b/lib/esim_offer/esim_offer_view.dart index a4c672b..eb6bb3e 100644 --- a/lib/esim_offer/esim_offer_view.dart +++ b/lib/esim_offer/esim_offer_view.dart @@ -12,307 +12,359 @@ class EsimOfferPage extends StatelessWidget { return Scaffold( backgroundColor: Colors.white, body: SafeArea( - child: SingleChildScrollView( - child: Column( - children: [ - Container( - color: Colors.white, - padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), - child: CommonAppBar(isWhiteLogo: false, isProfilePage: false,showDivider: true,), + child: Column( + children: [ + Container( + color: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), + child: CommonAppBar( + isWhiteLogo: false, + isProfilePage: false, + showDivider: true, ), - - /************************* Top Banner ***********************/ - Stack( - children: [ - Image.asset( - "assets/images/esim_top_bg.png", - width: double.infinity, - ), - Positioned( - top: 32.h, - left: 24.w, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - height: 48.h, - width: 48.w, - decoration: BoxDecoration( - color: Color(0xFFFFFFFF).withOpacity(.2), - borderRadius: BorderRadius.circular(20.r), - ), - child: Icon(Icons.wifi, color: Colors.white), - ), - - SizedBox(height: 24.h), - SizedBox( - width: 350.w, - child: CustomText( - text: - "Stay Connected Instantly with Your Complimentary eSIM", - size: 22.sp, - color: Color(0xFFFFFFFF), - ), - ), - SizedBox(height: 12.h), - SizedBox( - width: 350, - child: CustomText( - text: - "Because every unforgettable trip starts with seamless connectivity.", - size: 14.sp, - color: Colors.white, - ), - ), - SizedBox(height: 22.h), - Container( - height: 48.h, - width: 165.w, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(38.r), - boxShadow: [ - BoxShadow( - color: Colors.black12, - offset: Offset(4, 4), - blurRadius: 5, - ), - ], - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - CustomText( - text: "View Plans", - size: 16.sp, - color: Color(0xFFF95F62), - ), - SizedBox(width: 6.w), - Icon( - Icons.arrow_forward, - color: Color(0xFFF95F62), - size: 18, - ), - ], - ), - ), - ], - ), - ), - ], - ), - - SizedBox(height: 32.h), - - Text.rich( - TextSpan( - children: [ - TextSpan( - text: "With your ", - style: TextStyle( - fontSize: 26.sp, - fontWeight: FontWeight.w300, - ), - ), - TextSpan( - text: "eSIM", - style: TextStyle( - color: Color(0xFFF95F62), - fontSize: 26.sp, - fontWeight: FontWeight.w700, - ), - ), - TextSpan( - text: ", you can:", - style: TextStyle( - fontSize: 26.sp, - fontWeight: FontWeight.w300, - ), - ), - ], - ), - ), - SizedBox(height: 37.h), - ServiceCard( - "assets/icons/esim_location.png", - "Navigate the city with ease", - "Access real-time maps and directions wherever you go", - ), - SizedBox(height: 28.h), - ServiceCard( - "assets/icons/esim_phone.png", - "Book rides, access maps, and find attractions in real time", - "Stay connected to all essential travel services", - ), - SizedBox(height: 28.h), - ServiceCard( - "assets/icons/esim_camera.png", - "Share photos and memories instantly", - "Upload and share your travel moments without delay", - ), - SizedBox(height: 28.h), - ServiceCard( - "assets/icons/esim_people.png", - "Stay connected with friends, family, and travel plans", - "Never miss important updates or messages while traveling", - ), - - SizedBox(height: 75.h), - - Container( - width: double.infinity, - padding: EdgeInsets.only( - left: 33.w, - right: 33.w, - top: 70.h, - bottom: 37.h, - ), - color: Color(0xFFFFF5F5), + ), + Expanded( + child: SingleChildScrollView( child: Column( children: [ + /************************* Top Banner ***********************/ + ClipRRect( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(24.r), + bottomRight: Radius.circular(24.r), + ), + child: Container( + height: 340.h, + width: double.infinity, + child: Stack( + children: [ + Positioned.fill( + child: Image.asset( + "assets/images/esim_top_bg.png", + width: double.infinity, + height: double.infinity, + fit: BoxFit.cover, + ), + ), + // Black gradient overlay from top to bottom + Positioned.fill( + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Colors.black.withOpacity(0.6), + Colors.black.withOpacity(0.3), + Colors.transparent, + ], + stops: [0.0, 0.4, 1.0], + ), + ), + ), + ), + Positioned( + top: 32.h, + left: 24.w, + right: 24.w, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 48.h, + width: 48.w, + decoration: BoxDecoration( + color: Color(0xFFFFFFFF).withOpacity(.2), + borderRadius: BorderRadius.circular(20.r), + ), + child: Icon(Icons.wifi, color: Colors.white), + ), + SizedBox(height: 24.h), + SizedBox( + width: 350.w, + child: CustomText( + text: + "Stay Connected Instantly with Your Complimentary eSIM", + size: 22.sp, + color: Color(0xFFFFFFFF), + ), + ), + SizedBox(height: 12.h), + SizedBox( + width: 350, + child: CustomText( + text: + "Because every unforgettable trip starts with seamless connectivity.", + size: 14.sp, + color: Colors.white, + ), + ), + SizedBox(height: 22.h), + Container( + height: 48.h, + width: 165.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(38.r), + boxShadow: [ + BoxShadow( + color: Colors.black12, + offset: Offset(4, 4), + blurRadius: 5, + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CustomText( + text: "View Plans", + size: 16.sp, + color: Color(0xFFF95F62), + ), + SizedBox(width: 6.w), + Icon( + Icons.arrow_forward, + color: Color(0xFFF95F62), + size: 18, + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ), + + SizedBox(height: 32.h), + Text.rich( TextSpan( children: [ TextSpan( - text: "Simple ", - style: TextStyle(fontSize: 26.sp), + text: "With your ", + style: TextStyle( + fontSize: 26.sp, + fontWeight: FontWeight.w300, + ), ), TextSpan( - text: "3-Step Process", + text: "eSIM", style: TextStyle( color: Color(0xFFF95F62), fontSize: 26.sp, fontWeight: FontWeight.w700, ), ), + TextSpan( + text: ", you can:", + style: TextStyle( + fontSize: 26.sp, + fontWeight: FontWeight.w300, + ), + ), ], ), ), - SizedBox(height: 16.h), - CustomText( - text: "Get connected in seconds", - size: 17.5, - color: Color(0xFF4B5563), - ), - SizedBox(height: 56.h), - ProcessCard( - "Receive QR Code", - "Get your unique eSIM QR code with your CityCard", - "1", - "assets/icons/process_qr.png", + SizedBox(height: 37.h), + ServiceCard( + "assets/icons/esim_location.png", + "Navigate the city with ease", + "Access real-time maps and directions wherever you go", ), SizedBox(height: 28.h), - ProcessCard( - "Scan Code", - "Open your phone camera and scan the QR code", - "2", - "assets/icons/process_phone.png", + ServiceCard( + "assets/icons/esim_phone.png", + "Book rides, access maps, and find attractions in real time", + "Stay connected to all essential travel services", ), SizedBox(height: 28.h), - ProcessCard( - "Connected", - "You're online instantly - start exploring!", - "3", - "assets/icons/process_wifi.png", + ServiceCard( + "assets/icons/esim_camera.png", + "Share photos and memories instantly", + "Upload and share your travel moments without delay", + ), + SizedBox(height: 28.h), + ServiceCard( + "assets/icons/esim_people.png", + "Stay connected with friends, family, and travel plans", + "Never miss important updates or messages while traveling", + ), + + SizedBox(height: 75.h), + + Container( + width: double.infinity, + padding: EdgeInsets.only( + left: 33.w, + right: 33.w, + top: 70.h, + bottom: 37.h, + ), + color: Color(0xFFFFF5F5), + child: Column( + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "Simple ", + style: TextStyle(fontSize: 26.sp), + ), + TextSpan( + text: "3-Step Process", + style: TextStyle( + color: Color(0xFFF95F62), + fontSize: 26.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + SizedBox(height: 16.h), + CustomText( + text: "Get connected in seconds", + size: 17.5, + color: Color(0xFF4B5563), + ), + SizedBox(height: 56.h), + ProcessCard( + "Receive QR Code", + "Get your unique eSIM QR code with your CityCard", + "1", + "assets/icons/process_qr.png", + ), + SizedBox(height: 28.h), + ProcessCard( + "Scan Code", + "Open your phone camera and scan the QR code", + "2", + "assets/icons/process_phone.png", + ), + SizedBox(height: 28.h), + ProcessCard( + "Connected", + "You're online instantly - start exploring!", + "3", + "assets/icons/process_wifi.png", + ), + ], + ), + ), + + Stack( + children: [ + Image.asset( + 'assets/images/esim_bottom_banner.png', + fit: BoxFit.contain, + ), + Positioned.fill( + child: Container( + height: double.infinity, + width: double.infinity, + color: Colors.black.withOpacity(.68), + ), + ), + Positioned.fill( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "It's one more way", + style: TextStyle( + color: Colors.white, + fontSize: 21.sp, + fontWeight: FontWeight.w400, + ), + ), + TextSpan( + text: " CityCard", + style: TextStyle( + color: Color(0xFFF95F62), + fontSize: 21.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + SizedBox( + height: 4.h, + ), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "makes your journey", + style: TextStyle( + color: Colors.white, + fontSize: 21.sp, + fontWeight: FontWeight.w400, + ), + ), + TextSpan( + text: " smarter", + style: TextStyle( + color: Color(0xFFF95F62), + fontSize: 21.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + SizedBox( + height: 4.h, + ), + Text.rich( + TextSpan( + children: [ + TextSpan( + text: "and more", + style: TextStyle( + color: Colors.white, + fontSize: 21.sp, + fontWeight: FontWeight.w400, + ), + ), + TextSpan( + text: " effortless", + style: TextStyle( + color: Color(0xFFF95F62), + fontSize: 21.sp, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + SizedBox( + height: 28.h, + ), + CustomFilledButton( + onTap: () {}, + label: "Start Your Journey Today", + height: 60.h, + width: 300.w, + showArrow: true, + ), + ], + ), + ), + ], ), ], ), ), - - Stack( - children: [ - Image.asset( - 'assets/images/esim_bottom_banner.png', - fit: BoxFit.contain, - ), - Positioned.fill( - child: Container( - height: double.infinity, - width: double.infinity, - color: Colors.black.withOpacity(.68), - ), - ), - Positioned.fill( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text.rich( - TextSpan( - children: [ - TextSpan( - text: "It's one more way", - style: TextStyle( - color: Colors.white, - fontSize: 21.sp, - fontWeight: FontWeight.w400, - ), - ), - TextSpan( - text: " CityCard", - style: TextStyle( - color: Color(0xFFF95F62), - fontSize: 21.sp, - fontWeight: FontWeight.w700, - ), - ), - ], - ), - ), - SizedBox(height: 4.h,), - Text.rich( - TextSpan( - children: [ - TextSpan( - text: "makes your journey", - style: TextStyle( - color: Colors.white, - fontSize: 21.sp, - fontWeight: FontWeight.w400, - ), - ), - TextSpan( - text: " smarter", - style: TextStyle( - color: Color(0xFFF95F62), - fontSize: 21.sp, - fontWeight: FontWeight.w700, - ), - ), - ], - ), - ), - SizedBox(height: 4.h,), - Text.rich( - TextSpan( - children: [ - TextSpan( - text: "and more", - style: TextStyle( - color: Colors.white, - fontSize: 21.sp, - fontWeight: FontWeight.w400, - ), - ), - TextSpan( - text: " effortless", - style: TextStyle( - color: Color(0xFFF95F62), - fontSize: 21.sp, - fontWeight: FontWeight.w700, - ), - ), - ], - ), - ), - SizedBox(height: 28.h,), - CustomFilledButton(onTap: (){}, label: "Start Your Journey Today", height: 60.h, width: 300.w,showArrow: true,), - ], - ), - ), - ], - ), - ], - ), + ), + ], ), ), ); @@ -401,4 +453,4 @@ class EsimOfferPage extends StatelessWidget { ), ); } -} +} \ No newline at end of file diff --git a/lib/home/views/first_time_user_home_page.dart b/lib/home/views/first_time_user_home_page.dart index 024b4a6..bda8766 100644 --- a/lib/home/views/first_time_user_home_page.dart +++ b/lib/home/views/first_time_user_home_page.dart @@ -108,7 +108,7 @@ class _FirstTimeUserHomePageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( - "Get You'r CityCard", + "Get Your CityCard", style: TextStyle(color: Colors.white), ), SizedBox(width: 10.w), diff --git a/lib/home/views/registered_user_home_page.dart b/lib/home/views/registered_user_home_page.dart index 3cd1633..68209ae 100644 --- a/lib/home/views/registered_user_home_page.dart +++ b/lib/home/views/registered_user_home_page.dart @@ -151,8 +151,8 @@ class _RegisteredUserHomePageState extends State { // imageUrl: cityIconUrl, isSelectCity: true, ), - SizedBox(height: 60.h), - + SizedBox(height: 120.h), + // City name from API Text( city?.cityName ?? "City Name", @@ -163,7 +163,7 @@ class _RegisteredUserHomePageState extends State { ), ), SizedBox(height: 4.h), - + // City description from API Text( city?.description ?? "City description", @@ -176,7 +176,7 @@ class _RegisteredUserHomePageState extends State { overflow: TextOverflow.ellipsis, ), SizedBox(height: 12.h), - + // Category tags - you can customize this based on your needs Wrap( spacing: 8, @@ -190,7 +190,7 @@ class _RegisteredUserHomePageState extends State { ) .toList(), ), - SizedBox(height: 60.h), + SizedBox(height: 40.h), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -291,10 +291,8 @@ class _RegisteredUserHomePageState extends State { ESimOfferSection(), HotelOffersSection(), - const SizedBox(height: 10), - Padding( - padding: const EdgeInsets.all(16.0), + padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -429,46 +427,31 @@ class _RegisteredUserHomePageState extends State { ); } Widget _buildBannerImage(String? imageUrl) { - if (imageUrl == null || imageUrl.isEmpty) { - // Use placeholder if no image URL - return Image.asset( - "assets/images/chicago.png", - height: 300.h, - width: double.infinity, - fit: BoxFit.cover, - ); - } - - return Image.network( - imageUrl, - height: 300.h, + return SizedBox( + height: 350.h, // 🔒 fixed height width: double.infinity, - fit: BoxFit.cover, - loadingBuilder: (context, child, loadingProgress) { - if (loadingProgress == null) return child; - return Container( - height: 300.h, - width: double.infinity, - color: Colors.grey[300], - child: Center( - child: CircularProgressIndicator( - value: loadingProgress.expectedTotalBytes != null - ? loadingProgress.cumulativeBytesLoaded / - loadingProgress.expectedTotalBytes! - : null, - ), - ), - ); - }, - errorBuilder: (context, error, stackTrace) { - // Use placeholder on error - return Image.asset( - "assets/images/chicago.png", - height: 300.h, - width: double.infinity, - fit: BoxFit.cover, - ); - }, + child: imageUrl == null || imageUrl.isEmpty + ? Image.asset( + "assets/images/chicago.png", + fit: BoxFit.cover, + ) + : Image.network( + imageUrl, + fit: BoxFit.cover, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return Container( + color: Colors.grey[300], + child: const Center(child: CircularProgressIndicator()), + ); + }, + errorBuilder: (context, error, stackTrace) { + return Image.asset( + "assets/images/chicago.png", + fit: BoxFit.cover, + ); + }, + ), ); } } \ No newline at end of file diff --git a/lib/home/widgets/attractions_list.dart b/lib/home/widgets/attractions_list.dart index 9a60bc9..43f6d4b 100644 --- a/lib/home/widgets/attractions_list.dart +++ b/lib/home/widgets/attractions_list.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + import '../../attraction_details/views/attraction_details_view.dart'; -import '../../core/route_constants.dart'; import '../model/home_model.dart'; class AttractionsListView extends StatefulWidget { @@ -39,14 +40,12 @@ class _AttractionsListViewState extends State { }); } - // Get cover image from attraction galleries String? _getCoverImage(Attraction attraction) { if (attraction.attractionGalleries == null || attraction.attractionGalleries!.isEmpty) { return null; } - // Try to find the cover image final coverImage = attraction.attractionGalleries!.firstWhere( (gallery) => gallery.isCoverImage == true, orElse: () => attraction.attractionGalleries!.first, @@ -57,14 +56,13 @@ class _AttractionsListViewState extends State { @override Widget build(BuildContext context) { - // Show placeholder if no attractions if (widget.attractions.isEmpty) { - return const Center( + return Center( child: Padding( - padding: EdgeInsets.all(20.0), + padding: EdgeInsets.all(20.w), child: Text( 'No attractions available', - style: TextStyle(fontSize: 16, color: Colors.grey), + style: TextStyle(fontSize: 16.sp, color: Colors.grey), ), ), ); @@ -73,11 +71,11 @@ class _AttractionsListViewState extends State { return Column( children: [ SizedBox( - height: 240, + height: 240.h, child: ListView.builder( controller: _scrollController, scrollDirection: Axis.horizontal, - padding: const EdgeInsets.only(right: 16), + padding: EdgeInsets.only(right: 16.w), itemCount: widget.attractions.length, itemBuilder: (context, index) { final attraction = widget.attractions[index]; @@ -88,47 +86,51 @@ class _AttractionsListViewState extends State { Navigator.push( context, MaterialPageRoute( - builder: (context) => AttractionDetailsView(attractionId: attraction.id), + builder: (context) => + AttractionDetailsView(attractionId: attraction.id), ), ); }, child: Container( alignment: Alignment.center, - margin: const EdgeInsets.only(right: 16), - padding: const EdgeInsets.all(4), + margin: EdgeInsets.only(right: 16.w), + padding: EdgeInsets.all(4.r), decoration: BoxDecoration( border: Border.all( color: const Color(0xFFF95F62).withOpacity(0.24), ), - borderRadius: BorderRadius.circular(16), + borderRadius: BorderRadius.circular(16.r), ), child: Container( - height: 232, - width: 161, + height: 232.h, + width: 161.w, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16), + borderRadius: BorderRadius.circular(16.r), color: Colors.grey[300], ), child: Stack( children: [ - // Image or placeholder + // Image if (imageUrl != null) ClipRRect( - borderRadius: BorderRadius.circular(16), + borderRadius: BorderRadius.circular(16.r), child: Image.network( imageUrl, - height: 232, - width: 161, + height: 232.h, + width: 161.w, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) { return _buildPlaceholder(); }, - loadingBuilder: (context, child, loadingProgress) { + loadingBuilder: + (context, child, loadingProgress) { if (loadingProgress == null) return child; return Center( child: CircularProgressIndicator( - value: loadingProgress.expectedTotalBytes != null - ? loadingProgress.cumulativeBytesLoaded / + value: loadingProgress.expectedTotalBytes != + null + ? loadingProgress + .cumulativeBytesLoaded / loadingProgress.expectedTotalBytes! : null, ), @@ -139,17 +141,21 @@ class _AttractionsListViewState extends State { else _buildPlaceholder(), - // Title overlay + // Title + Description Overlay Positioned( bottom: 0, left: 0, right: 0, child: Container( - padding: const EdgeInsets.all(12), + width: double.infinity, + padding: EdgeInsets.symmetric( + horizontal: 12.w, + vertical: 12.h, + ), decoration: BoxDecoration( - borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(16), - bottomRight: Radius.circular(16), + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(16.r), + bottomRight: Radius.circular(16.r), ), gradient: LinearGradient( begin: Alignment.topCenter, @@ -160,15 +166,34 @@ class _AttractionsListViewState extends State { ], ), ), - child: Text( - attraction.title ?? 'Untitled', - style: GoogleFonts.poppins( - color: Colors.white, - fontWeight: FontWeight.w600, - fontSize: 14, - ), - maxLines: 2, - overflow: TextOverflow.ellipsis, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + attraction.title ?? 'Untitled', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 14.sp, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + SizedBox(height: 4.h), + Text( + attraction.description ?? '', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + color: + Colors.white.withOpacity(0.8), + fontSize: 12.sp, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ], ), ), ), @@ -180,16 +205,16 @@ class _AttractionsListViewState extends State { }, ), ), - const SizedBox(height: 20), + SizedBox(height: 20.h), Align( alignment: Alignment.center, child: SizedBox( - width: 200, + width: 200.w, child: ClipRRect( - borderRadius: BorderRadius.circular(10), + borderRadius: BorderRadius.circular(10.r), child: LinearProgressIndicator( value: _scrollProgress, - minHeight: 6, + minHeight: 6.h, backgroundColor: const Color(0xffFEE7E7), color: const Color(0xffF95F62), ), @@ -203,16 +228,16 @@ class _AttractionsListViewState extends State { Widget _buildPlaceholder() { return Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16), + borderRadius: BorderRadius.circular(16.r), color: Colors.grey[300], ), - child: const Center( + child: Center( child: Icon( Icons.image_outlined, - size: 50, + size: 50.sp, color: Colors.grey, ), ), ); } -} \ No newline at end of file +} \ No newline at end of file diff --git a/lib/hotel_offer/hotel_offer_view.dart b/lib/hotel_offer/hotel_offer_view.dart index 072ec18..33b33f5 100644 --- a/lib/hotel_offer/hotel_offer_view.dart +++ b/lib/hotel_offer/hotel_offer_view.dart @@ -53,7 +53,7 @@ class HotelOfferView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - "Enjoy 20% Off at\nMarriott Hotels\nExclusively with CityCard", + "Enjoy 20% Off Iconic\nMarriott Hotels -\nExclusively with CityCard", style: TextStyle( fontSize: 32.sp, fontWeight: FontWeight.w600, @@ -70,6 +70,14 @@ class HotelOfferView extends StatelessWidget { ), textAlign: TextAlign.center, ), + SizedBox(height: 30.h), + CustomFilledButton( + onTap: () { + // Navigator.of(context).pushNamed(RouteConstants.uploadPhotoPage); + }, + label: "Book Now", + showArrow: true, + ), ], ), ), diff --git a/lib/networkApiServices/api_urls.dart b/lib/networkApiServices/api_urls.dart index bab2aec..69e72f6 100644 --- a/lib/networkApiServices/api_urls.dart +++ b/lib/networkApiServices/api_urls.dart @@ -1,8 +1,8 @@ class ApiUrls { // static const baseUrl = "https://devapi.citycards.betadelivery.com";//Normal API - // static const baseUrl = "https://testingapi.citycards.betadelivery.com";// Test API - static const baseUrl = "https://uatapi.citycard.betadelivery.com";// Production Lvl API + static const baseUrl = "https://testingapi.citycards.betadelivery.com";// Test API + // static const baseUrl = "https://uatapi.citycard.betadelivery.com";// Production Lvl API static const refreshToken = "$baseUrl/auth/refresh"; diff --git a/lib/postcard/views/my_postcards_view.dart b/lib/postcard/views/my_postcards_view.dart index 633e42d..3bc2e64 100644 --- a/lib/postcard/views/my_postcards_view.dart +++ b/lib/postcard/views/my_postcards_view.dart @@ -303,35 +303,42 @@ class _MyPostCardsViewState extends State { ), SizedBox(height: 36.h), + CustomFilledButton( + width: 340.w, + onTap: () { + Navigator.of(context).pushNamed(RouteConstants.uploadPhotoPage); + }, + label: "Lets Create ", + ), ], ), ), ), // Create postcard button - SizedBox( - width: double.infinity, - child: ElevatedButton( - onPressed: () { - Navigator.of(context).pushNamed(RouteConstants.uploadPhotoPage); - }, - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xffF95F62), - padding: EdgeInsets.symmetric(vertical: 16.h), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(40), - ), - ), - child: Text( - "Lets Create", - style: GoogleFonts.poppins( - color: Colors.white, - fontSize: 14.sp, - fontWeight: FontWeight.w600, - ), - ), - ), - ), + // SizedBox( + // width: double.infinity, + // child: ElevatedButton( + // onPressed: () { + // Navigator.of(context).pushNamed(RouteConstants.uploadPhotoPage); + // }, + // style: ElevatedButton.styleFrom( + // backgroundColor: const Color(0xffF95F62), + // padding: EdgeInsets.symmetric(vertical: 16.h), + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(40), + // ), + // ), + // child: Text( + // "Lets Create", + // style: GoogleFonts.poppins( + // color: Colors.white, + // fontSize: 14.sp, + // fontWeight: FontWeight.w600, + // ), + // ), + // ), + // ), ], ); } diff --git a/lib/postcard/views/postcard_purchase_form_page_view.dart b/lib/postcard/views/postcard_purchase_form_page_view.dart index 0a61d3e..eb61ade 100644 --- a/lib/postcard/views/postcard_purchase_form_page_view.dart +++ b/lib/postcard/views/postcard_purchase_form_page_view.dart @@ -190,17 +190,28 @@ class _PostcardPurchaseFormPageViewState extends State