8 Commits

Author SHA1 Message Date
840a81f09e Update: Started API integration 2026-01-16 12:27:15 +05:30
mystery012728
a2bad0f139 Added NetworkApiService File 2026-01-08 17:07:53 +05:30
mystery012728
22f2de1bbe Flexi rename into Selective and mad taht dynamic and bug fixes 2026-01-07 18:27:24 +05:30
mystery012728
b77bcea769 Bug fixes and error solved 2026-01-07 14:45:24 +05:30
ada6040514 Fix :- Fixed the grey screen bug in get a pass and cart section. 2026-01-06 15:34:37 +05:30
3c05534262 Merge remote-tracking branch 'origin/vinayak' into dinesh
# Conflicts:
#	android/app/src/main/res/drawable-hdpi/android12splash.png
#	android/app/src/main/res/drawable-mdpi/android12splash.png
#	android/app/src/main/res/drawable-night-hdpi/android12splash.png
#	android/app/src/main/res/drawable-night-mdpi/android12splash.png
#	android/app/src/main/res/drawable-night-xhdpi/android12splash.png
#	android/app/src/main/res/drawable-night-xxhdpi/android12splash.png
#	android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png
#	android/app/src/main/res/drawable-v21/launch_background.xml
#	android/app/src/main/res/drawable-xhdpi/android12splash.png
#	android/app/src/main/res/drawable-xxhdpi/android12splash.png
#	android/app/src/main/res/drawable-xxxhdpi/android12splash.png
#	android/app/src/main/res/drawable/launch_background.xml
#	android/app/src/main/res/values-night-v31/styles.xml
#	android/app/src/main/res/values-v31/styles.xml
#	lib/core/route_constants.dart
#	pubspec.yaml
2025-11-14 11:21:36 +05:30
3caa52d9f8 vinayak's pull merged 2025-11-11 11:14:22 +05:30
Vinayakkadge04
e2f9217d57 Updated Splash Screen... 2025-11-10 12:38:50 +05:30
69 changed files with 1594 additions and 609 deletions

View File

@@ -21,7 +21,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.citycards_customer.citycards_customer"
applicationId = "com.citycard.customer"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion

View File

@@ -13,7 +13,7 @@
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:theme="@style/NormalTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 699 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

View File

@@ -3,7 +3,4 @@
<item>
<bitmap android:gravity="fill" android:src="@drawable/background"/>
</item>
<item>
<bitmap android:gravity="center" android:src="@drawable/splash"/>
</item>
</layer-list>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 699 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -3,7 +3,4 @@
<item>
<bitmap android:gravity="fill" android:src="@drawable/background"/>
</item>
<item>
<bitmap android:gravity="center" android:src="@drawable/splash"/>
</item>
</layer-list>

View File

@@ -7,7 +7,6 @@
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#F95F62</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your

View File

@@ -7,7 +7,6 @@
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#F95F62</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your

View File

@@ -2,8 +2,7 @@
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<!-- Use a plain background instead of a splash drawable -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">false</item>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
assets/logo/logoframe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
assets/logo/splash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

3
devtools_options.yaml Normal file
View File

@@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:

View File

@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '13.0'
platform :ios, '16.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

99
ios/Podfile.lock Normal file
View File

@@ -0,0 +1,99 @@
PODS:
- Flutter (1.0.0)
- flutter_angle (0.3.8):
- Flutter
- FlutterAngle (~> 0.0.8)
- FlutterMacOS
- flutter_native_splash (2.4.3):
- Flutter
- FlutterAngle (0.0.8)
- geolocator_apple (1.2.0):
- Flutter
- FlutterMacOS
- Google-Maps-iOS-Utils (6.1.0):
- GoogleMaps (~> 9.0)
- google_maps_flutter_ios (0.0.1):
- Flutter
- Google-Maps-iOS-Utils (< 7.0, >= 5.0)
- GoogleMaps (< 10.0, >= 8.4)
- GoogleMaps (9.4.0):
- GoogleMaps/Maps (= 9.4.0)
- GoogleMaps/Maps (9.4.0)
- image_picker_ios (0.0.1):
- Flutter
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
- three_js_sensors (0.1.2):
- Flutter
- video_player_avfoundation (0.0.1):
- Flutter
- FlutterMacOS
DEPENDENCIES:
- Flutter (from `Flutter`)
- flutter_angle (from `.symlinks/plugins/flutter_angle/darwin`)
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`)
- google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- three_js_sensors (from `.symlinks/plugins/three_js_sensors/ios`)
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
SPEC REPOS:
trunk:
- FlutterAngle
- Google-Maps-iOS-Utils
- GoogleMaps
EXTERNAL SOURCES:
Flutter:
:path: Flutter
flutter_angle:
:path: ".symlinks/plugins/flutter_angle/darwin"
flutter_native_splash:
:path: ".symlinks/plugins/flutter_native_splash/ios"
geolocator_apple:
:path: ".symlinks/plugins/geolocator_apple/darwin"
google_maps_flutter_ios:
:path: ".symlinks/plugins/google_maps_flutter_ios/ios"
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
three_js_sensors:
:path: ".symlinks/plugins/three_js_sensors/ios"
video_player_avfoundation:
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
SPEC CHECKSUMS:
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_angle: 7b1a2b3e733221bf2e0325e42fc3edf95b5d44c4
flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf
FlutterAngle: c810891af800750361b1d0e7cc944f2338d5ae18
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
Google-Maps-iOS-Utils: 0a484b05ed21d88c9f9ebbacb007956edd508a96
google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264
GoogleMaps: 0608099d4870cac8754bdba9b6953db543432438
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
three_js_sensors: f516b092803411e05b1e3dc7625efa36acd8f455
video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
PODFILE CHECKSUM: 1857a7cdb7dfafe45f2b0e9a9af44644190f7506
COCOAPODS: 1.16.2

View File

@@ -7,10 +7,12 @@
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 */; };
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 */; };
@@ -45,6 +47,10 @@
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
@@ -55,6 +61,10 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -62,6 +72,15 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
00C1AB7B0C8F1922F3F1AE65 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
CF8A29BE993C0C902CB143AF /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
81D638B66EB4658C8192CA0D /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -76,6 +95,28 @@
path = RunnerTests;
sourceTree = "<group>";
};
5D45FB84C63476582408C414 /* Frameworks */ = {
isa = PBXGroup;
children = (
54C8901E9D1856D980DFFE46 /* Pods_Runner.framework */,
445696AB37183A7C63CB7E98 /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
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 */,
);
path = Pods;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@@ -94,6 +135,8 @@
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
6D4A73F1E55857ADBD000C6A /* Pods */,
5D45FB84C63476582408C414 /* Frameworks */,
);
sourceTree = "<group>";
};
@@ -128,8 +171,10 @@
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
BC66FA7BADCD3982DC87655E /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
CF8A29BE993C0C902CB143AF /* Frameworks */,
);
buildRules = (
);
@@ -145,12 +190,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
3825EC0F330C0B58EA2A8981 /* [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 */,
);
buildRules = (
);
@@ -222,6 +270,28 @@
/* 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;
@@ -238,6 +308,23 @@
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;
@@ -253,6 +340,45 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
BC66FA7BADCD3982DC87655E /* [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-RunnerTests-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;
};
D10E98BB568B7005161E1ABD /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -361,24 +487,35 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A89AY6VY4F;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "CityCard Customer";
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.citycardscustomer.citycardsCustomer;
PRODUCT_BUNDLE_IDENTIFIER = com.citycard.customer;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = E2E6DC2B6718F55E3BF165E7 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -396,6 +533,7 @@
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 626B072D1717B50A277DA3C7 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -411,6 +549,7 @@
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = C1FCB3EF88270ED76DFA3FBD /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
@@ -475,7 +614,7 @@
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
ONLY_ACTIVE_ARCH = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
@@ -526,6 +665,7 @@
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
@@ -541,19 +681,29 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A89AY6VY4F;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "CityCard Customer";
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.citycardscustomer.citycardsCustomer;
PRODUCT_BUNDLE_IDENTIFIER = com.citycard.customer;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
@@ -564,18 +714,28 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A89AY6VY4F;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "CityCard Customer";
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.citycardscustomer.citycardsCustomer;
PRODUCT_BUNDLE_IDENTIFIER = com.citycard.customer;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;

View File

@@ -4,4 +4,7 @@
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 69 B

View File

@@ -38,7 +38,7 @@
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="399" height="138"/>
<image name="LaunchImage" width="168" height="185"/>
<image name="LaunchBackground" width="1" height="1"/>
</resources>
</document>

View File

@@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
@@ -17,17 +19,29 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<string>3</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>We need access to your camera for taking photos for profile and to build a postcard.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Citycard customer needs your location to find the closest place you can visit.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Citycard customer needs your location to find the closest place you can visit.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>We need access to your camera for taking photos for profile and to build a postcard.</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
@@ -41,11 +55,5 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIStatusBarHidden</key>
<false/>
</dict>
</plist>

View File

@@ -1,3 +1,5 @@
import 'package:citycards_customer/common_packages/common_app_texts.dart';
import '../models/attraction_model.dart';
class AttractionsRepository {
@@ -8,7 +10,7 @@ class AttractionsRepository {
location: "Krong Siem Reap",
price: "\$25",
image: "assets/dummy/dummy_1.jpg",
tags: ["Unlimited Card", "Flexi Card"],
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
isBookingRequired: false,
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
@@ -28,7 +30,7 @@ class AttractionsRepository {
location: "Krong Siem Reap",
price: "\$25",
image: "assets/dummy/dummy_3.jpg",
tags: ["Unlimited Card", "Flexi Card"],
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
isBookingRequired: false,
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
@@ -38,7 +40,7 @@ class AttractionsRepository {
location: "Krong Siem Reap",
price: "\$25",
image: "assets/dummy/dummy_4.jpg",
tags: ["Flexi Card"],
tags: ["${CommonAppText.selectiveCard} Card"],
isBookingRequired: false,
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
@@ -48,7 +50,7 @@ class AttractionsRepository {
location: "Krong Siem Reap",
price: "\$25",
image: "assets/dummy/dummy_5.jpg",
tags: ["Unlimited Card", "Flexi Card"],
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
isBookingRequired: false,
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
@@ -63,7 +65,7 @@ class AttractionsRepository {
location: "Krong Siem Reap",
price: "\$25",
image: "assets/dummy/dummy_1.jpg",
tags: ["Unlimited Card", "Flexi Card"],
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
isBookingRequired: true,
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
@@ -83,7 +85,7 @@ class AttractionsRepository {
location: "Krong Siem Reap",
price: "\$25",
image: "assets/dummy/dummy_3.jpg",
tags: ["Unlimited Card", "Flexi Card"],
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
isBookingRequired: true,
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
@@ -93,7 +95,7 @@ class AttractionsRepository {
location: "Krong Siem Reap",
price: "\$25",
image: "assets/dummy/dummy_4.jpg",
tags: ["Flexi Card"],
tags: ["${CommonAppText.selectiveCard} Card"],
isBookingRequired: true,
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",
@@ -103,7 +105,7 @@ class AttractionsRepository {
location: "Krong Siem Reap",
price: "\$25",
image: "assets/dummy/dummy_5.jpg",
tags: ["Unlimited Card", "Flexi Card"],
tags: ["Unlimited Card", "${CommonAppText.selectiveCard} Card"],
isBookingRequired: true,
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Convallis condimentum morbi non egestas enim amet sagittis. Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac.Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non... ",

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../common_packages/common_app_texts.dart';
import '../../core/route_constants.dart';
import '../models/attraction_model.dart';
@@ -86,13 +87,13 @@ class AttractionCard extends StatelessWidget {
vertical: 4,
),
decoration: BoxDecoration(
color: tag == "Flexi Card"
color: tag == "${CommonAppText.selectiveCard} Card"
? const Color(0xffF95FAF).withOpacity(0.1)
: const Color(
0xffF95F62,
).withOpacity(0.1),
border: Border.all(
color: tag == "Flexi Card"
color: tag == "${CommonAppText.selectiveCard} Card"
? const Color(0xffF95FAF)
: const Color(0xffF95F62),
),

View File

@@ -7,6 +7,8 @@ import 'package:citycards_customer/core/route_constants.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../common_packages/common_app_texts.dart';
class BuyPassView extends StatelessWidget {
BuyPassView({super.key});
@@ -68,9 +70,9 @@ class BuyPassView extends StatelessWidget {
scrollDirection: Axis.horizontal,
child: Row(
children: [
PassCardView(themeColor: Color(0xFFF95FAF)),
PassCardView(themeColor: Color(0xFFF97316)),
SizedBox(width: 12.w),
PassCardView(themeColor: Color(0xFF1E8AF6)),
PassCardView(themeColor: Color(0xFF1E8AF6),),
],
),
),
@@ -203,6 +205,8 @@ class BuyPassView extends StatelessWidget {
text: offer["description"] ?? "",
color: Colors.black.withOpacity(.6),
size: 12.sp,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
],
),
@@ -215,7 +219,7 @@ class BuyPassView extends StatelessWidget {
Center(
child: PaymentCard(
city: 'Melbourne',
tag: 'Flexi Card',
tag: '${CommonAppText.selectiveCard} Card',
oldPrice: 120,
newPrice: 90,
),

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../common_packages/common_app_texts.dart';
class FeatureTable extends StatelessWidget {
const FeatureTable({super.key});
@@ -66,7 +68,7 @@ class FeatureTable extends StatelessWidget {
padding: EdgeInsets.symmetric(vertical: 6.h),
child: Center(
child: Text(
'Flexi',
'${CommonAppText.selectiveCard}',
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 16.sp),
),
),

View File

@@ -2,6 +2,8 @@ import 'package:citycards_customer/common_packages/custom_text.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../common_packages/common_app_texts.dart';
class PassCardView extends StatelessWidget {
final Color? themeColor;
final String? city;
@@ -26,140 +28,138 @@ class PassCardView extends StatelessWidget {
border: Border.all(color:( themeColor ?? Color(0xFFF95FAF)).withOpacity(0.24)),
borderRadius: BorderRadius.circular(8.r),
),
child: Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8.r),
bottomLeft: Radius.circular(8.r)
),
child: Image.asset(
"assets/images/card_banner.png",
scale: 4,
width: 103.w,
height:140.h,
fit: BoxFit.cover,
),
),
SizedBox(width: 6.66.w),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CustomText(
text: "Melbourne",
weight: FontWeight.w500,
size: 16.sp,
),
Row(
children: [
Text(
"From ",
style: TextStyle(
color: Colors.black.withOpacity(0.6),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
),
Text(
"\$80",
style: TextStyle(
color:themeColor,
fontWeight: FontWeight.w500,
fontSize: 24.sp,
),
),
Text(
" /Adult",
style: TextStyle(
color: Colors.black.withOpacity(0.8),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
),
],
),
Row(
children: [
Text(
"and ",
style: TextStyle(
color: Colors.black.withOpacity(0.6),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
),
Text(
"\$10",
style: TextStyle(
color: themeColor,
fontWeight: FontWeight.w500,
fontSize: 24.sp,
),
),
Text(
" /child",
style: TextStyle(
color: Colors.black.withOpacity(0.8),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
),
],
),
SizedBox(
width: 193.w,
child: CustomText(
text:
"Dive into an extensive selection of thrilling destinations!",
color: Color(0xFF000000).withOpacity(0.6),
size: 11.sp,
),
),
],
),
],
),
Container(
width: 35.w,
height: 140.h,
decoration: BoxDecoration(
color: themeColor,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
ClipRRect(
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(8.r),
topRight: Radius.circular(8.r),
topLeft: Radius.circular(8.r),
bottomLeft: Radius.circular(8.r)
),
child: Image.asset(
"assets/images/card_banner.png",
scale: 4,
width: 103.w,
height:140.h,
fit: BoxFit.cover,
),
),
child: RotatedBox(
quarterTurns: -1,
child: Center(
child: RichText(
text: TextSpan(
children: [
TextSpan(
text: "Flexi ",
style: TextStyle(color: Colors.white, fontSize: 16.sp),
SizedBox(width: 6.66.w),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CustomText(
text: "Melbourne",
weight: FontWeight.w500,
size: 16.sp,
),
Row(
children: [
Text(
"From ",
style: TextStyle(
color: Colors.black.withOpacity(0.6),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
TextSpan(
text: "Card",
style: TextStyle(color: Colors.white, fontSize: 12.sp),
),
Text(
"\$80",
style: TextStyle(
color:themeColor,
fontWeight: FontWeight.w500,
fontSize: 24.sp,
),
],
),
Text(
" /Adult",
style: TextStyle(
color: Colors.black.withOpacity(0.8),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
),
],
),
Row(
children: [
Text(
"and ",
style: TextStyle(
color: Colors.black.withOpacity(0.6),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
),
Text(
"\$10",
style: TextStyle(
color: themeColor,
fontWeight: FontWeight.w500,
fontSize: 24.sp,
),
),
Text(
" /child",
style: TextStyle(
color: Colors.black.withOpacity(0.8),
fontSize: 11.sp,
fontWeight: FontWeight.w400,
),
),
],
),
SizedBox(
width: 193.w,
child: CustomText(
text:
"Dive into an extensive selection of thrilling destinations!",
color: Color(0xFF000000).withOpacity(0.6),
size: 11.sp,
),
),
],
),
],
),
Container(
width: 35.w,
height: 140.h,
decoration: BoxDecoration(
color: themeColor,
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(8.r),
topRight: Radius.circular(8.r),
),
),
child: RotatedBox(
quarterTurns: -1,
child: Center(
child: RichText(
text: TextSpan(
children: [
TextSpan(
text: "${CommonAppText.selectiveCard} ",
style: TextStyle(color: Colors.white, fontSize: 16.sp),
),
TextSpan(
text: "Card",
style: TextStyle(color: Colors.white, fontSize: 12.sp),
),
],
),
),
),
),
],
),
),
],
),
);
);
}
}

View File

@@ -6,6 +6,8 @@ import 'package:citycards_customer/common_packages/custom_text.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../checkout/widget/login_email_bottomsheet.dart';
import '../../common_packages/common_app_texts.dart';
import '../blocs/pass_bloc.dart';
class MyPassesPage extends StatelessWidget {
@@ -23,14 +25,13 @@ class MyPassesPage extends StatelessWidget {
children: [
SizedBox(height: 22.h),
Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: Color(0xFFF95FAF).withOpacity(0.2),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: Color(0xFFF95FAF).withOpacity(0.2),
),
borderRadius: BorderRadius.circular(8.r),
),
borderRadius: BorderRadius.circular(8.r),
),
child: Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
@@ -154,7 +155,7 @@ class MyPassesPage extends StatelessWidget {
width: 35.w,
height: 123.h,
decoration: BoxDecoration(
color: Color(0xFFF95FAF),
color: Color(0xFFF97316),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(8.r),
topRight: Radius.circular(8.r),
@@ -167,7 +168,7 @@ class MyPassesPage extends StatelessWidget {
text: TextSpan(
children: [
TextSpan(
text: "Flexi ",
text: "${CommonAppText.selectiveCard} ",
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
@@ -189,8 +190,6 @@ class MyPassesPage extends StatelessWidget {
],
),
),
),
SizedBox(height: 15.h),
Container(
padding: EdgeInsets.symmetric(
@@ -336,7 +335,19 @@ class MyPassesPage extends StatelessWidget {
SizedBox(height: 150.h,),
CustomFilledButton(
onTap: () {},
onTap: () {
showModalBottomSheet(
backgroundColor: Colors.white,
context: context,
isScrollControlled: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r),
),
),
builder: (_) => const LoginEmailBottomsheet(),
);
},
width: double.infinity,
label: "Proceed to Checkout",
),

View File

@@ -5,6 +5,7 @@ import 'package:citycards_customer/common_packages/custom_text.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../checkout/widget/login_email_bottomsheet.dart';
import '../blocs/postcard_bloc.dart';
class MyPostCardsPage extends StatelessWidget {
@@ -156,7 +157,19 @@ class MyPostCardsPage extends StatelessWidget {
),
SizedBox(height: 60.h),
CustomFilledButton(
onTap: () {},
onTap: () {
showModalBottomSheet(
backgroundColor: Colors.white,
context: context,
isScrollControlled: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r),
),
),
builder: (_) => const LoginEmailBottomsheet(),
);
},
width: double.infinity,
label: "Proceed to Checkout",
),

View File

@@ -7,6 +7,8 @@ import 'package:citycards_customer/common_packages/custom_dashed_line.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../common_packages/common_app_texts.dart';
class CheckoutView extends StatelessWidget {
const CheckoutView({super.key});
@@ -40,13 +42,13 @@ class CheckoutView extends StatelessWidget {
),
SizedBox(height: 22.h),
Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Color(0xFFF95FAF).withOpacity(0.2)),
borderRadius: BorderRadius.circular(8.r),
),
child: Expanded(
Expanded(
child: Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Color(0xFFF95FAF).withOpacity(0.2)),
borderRadius: BorderRadius.circular(8.r),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
@@ -167,7 +169,7 @@ class CheckoutView extends StatelessWidget {
width: 35.w,
height: 123.h,
decoration: BoxDecoration(
color: Color(0xFFF95FAF),
color: Color(0xFFF97316),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(8.r),
topRight: Radius.circular(8.r),
@@ -180,7 +182,7 @@ class CheckoutView extends StatelessWidget {
text: TextSpan(
children: [
TextSpan(
text: "Flexi ",
text: "${CommonAppText.selectiveCard} ",
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
@@ -204,7 +206,7 @@ class CheckoutView extends StatelessWidget {
),
),
SizedBox(height: 15.h),
SizedBox(height: 10.h),
Container(
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 12.h),
decoration: BoxDecoration(

View File

@@ -19,93 +19,95 @@ class LoginEmailBottomsheet extends StatelessWidget {
right: 20.h,
bottom: MediaQuery.of(context).viewInsets.bottom,
),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min, // shrink to fit content
children: [
Image.asset("assets/logo/logo_city_cards_orange.png", scale: 4),
SizedBox(height: 8.h),
CustomText(text: "Get Started", size: 18.sp, weight: FontWeight.w500),
SizedBox(height: 42.h),
CustomText(
text: "Enter your email to begin your CityCards journey",
size: 14.sp,
color: const Color(0xFF000000).withOpacity(.6),
),
SizedBox(height: 12.h),
TextField(
decoration: InputDecoration(
filled: true,
contentPadding: EdgeInsets.symmetric(vertical: 6.h),
fillColor: const Color(0xFFFFF5F5),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
borderRadius: BorderRadius.circular(8.sp),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
borderRadius: BorderRadius.circular(8.sp),
),
prefixIcon: const Icon(Icons.email_outlined, color: Color(0xFFF95F62)),
hintText: "john.doe@gmail.com",
hintStyle: TextStyle(
color: const Color(0xFF000000).withOpacity(0.6),
fontSize: 12.sp,
),
child: SafeArea(
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min, // shrink to fit content
children: [
Image.asset("assets/logo/logo_city_cards_orange.png", scale: 4),
SizedBox(height: 8.h),
CustomText(text: "Get Started", size: 18.sp, weight: FontWeight.w500),
SizedBox(height: 42.h),
CustomText(
text: "Enter your email to begin your CityCards journey",
size: 14.sp,
color: const Color(0xFF000000).withOpacity(.6),
),
),
SizedBox(height: 38.h),
CustomFilledButton(
onTap: () {
Navigator.pop(context);
showModalBottomSheet(
context: context,
backgroundColor: Colors.white,
isScrollControlled: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r),
),
SizedBox(height: 12.h),
TextField(
decoration: InputDecoration(
filled: true,
contentPadding: EdgeInsets.symmetric(vertical: 6.h),
fillColor: const Color(0xFFFFF5F5),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
borderRadius: BorderRadius.circular(8.sp),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
borderRadius: BorderRadius.circular(8.sp),
),
prefixIcon: const Icon(Icons.email_outlined, color: Color(0xFFF95F62)),
hintText: "john.doe@gmail.com",
hintStyle: TextStyle(
color: const Color(0xFF000000).withOpacity(0.6),
fontSize: 12.sp,
),
builder: (_) => VerifyOtpBottomsheet(),
);
},
label: "Continue",
width: double.infinity,
),
SizedBox(height: 20.h),
InkWell(
onTap: (){
Navigator.of(context).pushNamed(RouteConstants.createAcct);
},
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: "Already have an account?",
style: TextStyle(
color: Colors.black.withOpacity(0.6),
fontSize: 12.sp,
fontWeight: FontWeight.w400,
),
),
TextSpan(
text: " Sign in",
style: TextStyle(
color: const Color(0xFFF95F62),
fontSize: 12.sp,
fontWeight: FontWeight.w600,
),
),
],
),
),
),
SizedBox(height: 15.h),
],
SizedBox(height: 38.h),
CustomFilledButton(
onTap: () {
Navigator.pop(context);
showModalBottomSheet(
context: context,
backgroundColor: Colors.white,
isScrollControlled: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(12.r),
),
),
builder: (_) => VerifyOtpBottomsheet(),
);
},
label: "Continue",
width: double.infinity,
),
SizedBox(height: 20.h),
InkWell(
onTap: (){
Navigator.of(context).pushNamed(RouteConstants.createAcct);
},
child: Text.rich(
TextSpan(
children: [
TextSpan(
text: "Already have an account?",
style: TextStyle(
color: Colors.black.withOpacity(0.6),
fontSize: 12.sp,
fontWeight: FontWeight.w400,
),
),
TextSpan(
text: " Sign in",
style: TextStyle(
color: const Color(0xFFF95F62),
fontSize: 12.sp,
fontWeight: FontWeight.w600,
),
),
],
),
),
),
SizedBox(height: 15.h),
],
),
),
),
);

View File

@@ -0,0 +1,3 @@
class CommonAppText {
static const String selectiveCard = "Selective";
}

View File

@@ -21,7 +21,9 @@ import 'package:citycards_customer/offer_pass_detail/offer_pass_detail_view.dart
import 'package:citycards_customer/privacy/privacy_view.dart';
import 'package:citycards_customer/search_offers/bloc/search_offers_listing_bloc.dart';
import 'package:citycards_customer/search_offers/view/search_offers_with_listing.dart';
import 'package:citycards_customer/splash_screen/views/splash_screen.dart';
import 'package:citycards_customer/terms_and_condition/terms_and_condition_view.dart';
import 'package:citycards_customer/trail.dart';
import 'package:citycards_customer/your_itinerary/view/your_itinerary_view.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -34,6 +36,7 @@ import 'route_constants.dart';
class AppRouter {
Route onGenerateRoute(RouteSettings settings) {
print('Navigating to route: ${settings.name}');
switch (settings.name) {
case '/':
case RouteConstants.home:
@@ -46,10 +49,20 @@ class AppRouter {
},
);
case RouteConstants.splash:
print('✅ Splash route matched');
return MaterialPageRoute(
builder: (_) {
return SplashScreen();
},
);
case RouteConstants.intro:
return MaterialPageRoute(builder: (_){
return IntroScreensView();
});
return MaterialPageRoute(
builder: (_) {
return IntroScreensView();
},
);
case RouteConstants.attractionsPage:
final args = settings.arguments as String;
return MaterialPageRoute(builder: (_) => AttractionsPage(source: args));
@@ -192,19 +205,25 @@ class AppRouter {
);
case RouteConstants.magicItineraryEmptyScreen:
return MaterialPageRoute(builder: (_){
return MagicItineraryEmptyView();
});
return MaterialPageRoute(
builder: (_) {
return MagicItineraryEmptyView();
},
);
case RouteConstants.magicItineraryFilledScreen:
return MaterialPageRoute(builder: (_){
return MagicItineraryFilledView();
});
return MaterialPageRoute(
builder: (_) {
return MagicItineraryFilledView();
},
);
case RouteConstants.offerPassDetail:
return MaterialPageRoute(builder: (_){
return OfferPassDetailView();
});
return MaterialPageRoute(
builder: (_) {
return OfferPassDetailView();
},
);
case RouteConstants.registeredUserHome:
return MaterialPageRoute(

View File

@@ -10,6 +10,7 @@ import '../attractions/views/attractions_page_view.dart';
import '../buy_a_pass/view/buy_pass_view.dart';
import '../checkout/view/checkout_view.dart';
import '../create_account/create_account_view.dart';
import '../intro_screens/views/intro_screen_view.dart';
import '../itinerary_creation/bloc/itinerary_detail_bloc.dart';
import '../itinerary_creation/bloc/itinerary_steps_selection_bloc.dart';
import '../itinerary_creation/views/itinerary_creation_view.dart';
@@ -39,6 +40,11 @@ Widget buildOffstageNavigator(
case '/':
return MaterialPageRoute(builder: (_) => child);
case RouteConstants.intro:
return MaterialPageRoute(builder: (_){
return IntroScreensView();
});
// 🔹 Attractions Page
case RouteConstants.attractionsPage:
final args = settings.arguments as String;

View File

@@ -1,7 +1,8 @@
class RouteConstants {
static const String intro = 'intro';
static const String intro = '/intro';
static const String splash = '/splash';
/****************************** HOME SECTION ************************************/

View File

@@ -17,7 +17,6 @@ class CreateAccountView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
@@ -110,7 +109,7 @@ class CreateAccountView extends StatelessWidget {
),
),
SizedBox(height: 36.h),
SizedBox(height: 16.h),
CustomFilledButton(
width: double.infinity,
onTap: (){}, label: "Create Account")

View File

@@ -0,0 +1,112 @@
class CityList {
List<Cities>? cities;
List<UpcomingCities>? upcomingCities;
CityList({this.cities, this.upcomingCities});
CityList.fromJson(Map<String, dynamic> json) {
if (json['cities'] != null) {
cities = <Cities>[];
json['cities'].forEach((v) {
cities!.add(new Cities.fromJson(v));
});
}
if (json['upcomingCities'] != null) {
upcomingCities = <UpcomingCities>[];
json['upcomingCities'].forEach((v) {
upcomingCities!.add(new UpcomingCities.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.cities != null) {
data['cities'] = this.cities!.map((v) => v.toJson()).toList();
}
if (this.upcomingCities != null) {
data['upcomingCities'] =
this.upcomingCities!.map((v) => v.toJson()).toList();
}
return data;
}
}
class Cities {
int? id;
String? cityName;
String? tagLine;
String? bannerImage;
int? indivisualTicketAmt;
int? cityCardTicketAmt;
int? saveAmount;
String? saveLabel;
List<UpcomingCities>? upcomingCities;
Cities(
{this.id,
this.cityName,
this.tagLine,
this.bannerImage,
this.indivisualTicketAmt,
this.cityCardTicketAmt,
this.saveAmount,
this.saveLabel,
this.upcomingCities});
Cities.fromJson(Map<String, dynamic> json) {
id = json['id'];
cityName = json['cityName'];
tagLine = json['tagLine'];
bannerImage = json['bannerImage'];
indivisualTicketAmt = json['indivisualTicketAmt'];
cityCardTicketAmt = json['cityCardTicketAmt'];
saveAmount = json['saveAmount'];
saveLabel = json['saveLabel'];
if (json['upcomingCities'] != null) {
upcomingCities = <UpcomingCities>[];
json['upcomingCities'].forEach((v) {
upcomingCities!.add(new UpcomingCities.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['cityName'] = this.cityName;
data['tagLine'] = this.tagLine;
data['bannerImage'] = this.bannerImage;
data['indivisualTicketAmt'] = this.indivisualTicketAmt;
data['cityCardTicketAmt'] = this.cityCardTicketAmt;
data['saveAmount'] = this.saveAmount;
data['saveLabel'] = this.saveLabel;
if (this.upcomingCities != null) {
data['upcomingCities'] =
this.upcomingCities!.map((v) => v.toJson()).toList();
}
return data;
}
}
class UpcomingCities {
int? id;
String? cityName;
String? imgPathName;
UpcomingCities({this.id, this.cityName, this.imgPathName});
UpcomingCities.fromJson(Map<String, dynamic> json) {
id = json['id'];
cityName = json['cityName'];
imgPathName = json['imgPathName'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['cityName'] = this.cityName;
data['imgPathName'] = this.imgPathName;
return data;
}
}

View File

@@ -1,15 +1,17 @@
import 'package:citycards_customer/home/widgets/e_sim_offer_section.dart';
import 'package:citycards_customer/home/widgets/hotel_offers_section.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../common_bloc/bottom_navigation_bloc.dart';
import '../../common_packages/app_bar.dart';
import '../../core/route_constants.dart';
import '../widgets/attractions_list.dart';
import '../widgets/get_your_pass_card.dart';
import '../widgets/gradient_container_bg.dart';
import '../widgets/journey_cards_listview.dart';
import '../widgets/itineary_animation.dart';
import '../widgets/pass_card_list.dart';
class RegisteredUserHomePage extends StatefulWidget {
@@ -21,11 +23,6 @@ class RegisteredUserHomePage extends StatefulWidget {
class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
final List<Map<String, String>> attractions = [
{
'title': 'Long-Tail Boat Charter',
'subtitle': 'Lorem ipsum dolor sit amet...',
'image': 'assets/images/clock.png',
},
{
'title': 'Koh Rong Samloemr',
'subtitle': 'Lorem ipsum dolor sit amet...',
@@ -41,6 +38,11 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
'subtitle': 'Lorem ipsum dolor sit amet...',
'image': 'assets/images/koh_rong.png',
},
{
'title': 'Long-Tail Boat Charter',
'subtitle': 'Lorem ipsum dolor sit amet...',
'image': 'assets/images/clock.png',
},
];
@override
@@ -51,7 +53,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
children: [
Image.asset(
"assets/images/chicago.png",
height: 300,
height: 300.h,
width: double.infinity,
fit: BoxFit.cover,
),
@@ -69,7 +71,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
isProfilePage: false,
showDivider: false,
),
SizedBox(height: 70.h),
SizedBox(height: 60.h),
Text(
"Melbourne",
style: TextStyle(
@@ -78,7 +80,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
fontSize: 44,
),
),
const SizedBox(height: 4),
SizedBox(height: 4.h),
Text(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
"Cras posuere, nisl id dictum consequat, elit enim tincidunt magna...",
@@ -88,7 +90,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
fontWeight: FontWeight.w400,
),
),
const SizedBox(height: 12),
SizedBox(height: 12.h),
// Category tags
Wrap(
@@ -101,7 +103,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
],
),
const SizedBox(height: 40),
SizedBox(height: 60.h),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -152,9 +154,53 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
),
),
InwardCurvedContainer(
child: Stack(children: [DreamJourneySection()]),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(height: 40.h),
const ItineraryVideo(),
SizedBox(height: 20.h),
// 🔘 Button section
Container(
margin: const EdgeInsets.symmetric(horizontal: 16),
child: SizedBox(
width: 200,
child: ElevatedButton(
onPressed: () {
context.read<NavigationBloc>().add(NavigationTabChanged(1));
// Navigator.of(
// context,
// ).pushNamed(RouteConstants.buyPass);
},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xffF95F62),
padding: const EdgeInsets.symmetric(vertical: 14),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"Create my iternary",
style: GoogleFonts.poppins(
fontWeight: FontWeight.w500,
fontSize: 14.sp,
color: Colors.white,
),
),
const SizedBox(width: 4),
Icon(Icons.arrow_forward, color: Colors.white),
],
),
),
),
),
],
),
),
const SizedBox(height: 10),
ESimOfferSection(),
HotelOffersSection(),
const SizedBox(height: 10),
@@ -167,7 +213,9 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
children: [
InkWell(
onTap: () {
Navigator.of(context).pushNamed(RouteConstants.searchOffer);
Navigator.of(
context,
).pushNamed(RouteConstants.searchOffer);
},
child: _buildFeatureCard(
image: "assets/images/claim_offers_bg.jpg",
@@ -199,7 +247,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: BoxDecoration(
color: Color(0xffF95F62),
color: Color(0xffFFFFFF).withOpacity(0.29),
borderRadius: BorderRadius.circular(20),
),
child: Text(

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../core/route_constants.dart';
class AttractionsListView extends StatefulWidget {
final List<Map<String, String>> attractions;
@@ -38,69 +39,74 @@ class _AttractionsListViewState extends State<AttractionsListView> {
@override
Widget build(BuildContext context) {
return Column(
children: [
SizedBox(
height: 240,
child: ListView.builder(
controller: _scrollController,
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.only(left: 16),
itemCount: widget.attractions.length,
itemBuilder: (context, index) {
final item = widget.attractions[index];
return Container(
alignment: Alignment.center,
margin: const EdgeInsets.only(right: 16),
padding: const EdgeInsets.all(4),
decoration: BoxDecoration(
border: Border.all(
color: const Color(0xFFF95F62).withOpacity(0.24),
),
borderRadius: BorderRadius.circular(16),
),
child: Container(
height: 232,
width: 161,
return InkWell(
onTap: (){
Navigator.of(context).pushNamed(RouteConstants.attractionDetails);
},
child: Column(
children: [
SizedBox(
height: 240,
child: ListView.builder(
controller: _scrollController,
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.only(right: 16),
itemCount: widget.attractions.length,
itemBuilder: (context, index) {
final item = widget.attractions[index];
return Container(
alignment: Alignment.center,
margin: const EdgeInsets.only(right: 16),
padding: const EdgeInsets.all(4),
decoration: BoxDecoration(
border: Border.all(
color: const Color(0xFFF95F62).withOpacity(0.24),
),
borderRadius: BorderRadius.circular(16),
image: DecorationImage(
image: AssetImage(item['image']!),
fit: BoxFit.cover,
),
child: Container(
height: 232,
width: 161,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
image: DecorationImage(
image: AssetImage(item['image']!),
fit: BoxFit.cover,
),
),
alignment: Alignment.bottomLeft,
padding: const EdgeInsets.all(12),
child: Text(
item['title']!,
style: GoogleFonts.poppins(
color: Colors.white,
fontWeight: FontWeight.w600,
fontSize: 14,
),
),
),
alignment: Alignment.bottomLeft,
padding: const EdgeInsets.all(12),
child: Text(
item['title']!,
style: GoogleFonts.poppins(
color: Colors.white,
fontWeight: FontWeight.w600,
fontSize: 14,
),
),
),
);
},
);
},
),
),
),
const SizedBox(height: 20),
Align(
alignment: Alignment.center,
child: SizedBox(
width: 200,
child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: LinearProgressIndicator(
value: _scrollProgress,
minHeight: 6,
backgroundColor: const Color(0xffFEE7E7),
color: const Color(0xffF95F62),
const SizedBox(height: 20),
Align(
alignment: Alignment.center,
child: SizedBox(
width: 200,
child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: LinearProgressIndicator(
value: _scrollProgress,
minHeight: 6,
backgroundColor: const Color(0xffFEE7E7),
color: const Color(0xffF95F62),
),
),
),
),
),
],
],
),
);
}
}

View File

@@ -9,7 +9,7 @@ class ESimOfferSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 0),
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../core/route_constants.dart';
@@ -10,15 +11,14 @@ class GetYourPassCard extends StatelessWidget {
Widget build(BuildContext context) {
return Container(
width: double.infinity,
margin: const EdgeInsets.symmetric(horizontal: 14, vertical: 0),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20),
margin: EdgeInsets.symmetric(horizontal: 14.w, vertical: 0),
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.h),
decoration: BoxDecoration(
color: const Color(0xFFFFF1F1),
borderRadius: BorderRadius.circular(40),
border: Border.all(color: Color(0xffFDCDCE))
color: const Color(0xFFFFF1F1),
borderRadius: BorderRadius.circular(40.r),
border: Border.all(color: const Color(0xffFDCDCE))
),
child: Column(
children: [
// ===== Left Section =====
Row(
@@ -27,7 +27,7 @@ class GetYourPassCard extends StatelessWidget {
Text(
"Get your Pass",
style: GoogleFonts.poppins(
fontSize: 18,
fontSize: 18.sp,
fontWeight: FontWeight.w500,
color: Colors.black,
),
@@ -37,37 +37,38 @@ class GetYourPassCard extends StatelessWidget {
Navigator.of(context).pushNamed(RouteConstants.buyPass);
},
child: Container(
padding: const EdgeInsets.all(8),
padding: EdgeInsets.all(8.r),
decoration: const BoxDecoration(
color: Color(0xffF95F62),
shape: BoxShape.circle,
),
child: const Icon(
child: Icon(
Icons.arrow_forward,
color: Colors.black,
size: 18,
size: 18.sp,
),
),
),
],
),
const SizedBox(
height: 7,
),
SizedBox(height: 7.h),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
AttractionsAvatarStack(imagePath: 'assets/images/get_your_pass_bg.jpg',),
const SizedBox(width: 8),
AttractionsAvatarStack(
imagePath: 'assets/images/get_your_pass_bg.jpg',
),
SizedBox(width: 8.w),
Text(
"Attractions",
style: GoogleFonts.poppins(
fontSize: 13,
color: Colors.black,
fontWeight: FontWeight.w400
fontSize: 13.sp,
color: Colors.black,
fontWeight: FontWeight.w400
),
),
],
@@ -78,7 +79,7 @@ class GetYourPassCard extends StatelessWidget {
Text(
"From",
style: GoogleFonts.poppins(
fontSize: 12,
fontSize: 12.sp,
color: Colors.black87,
),
),
@@ -88,7 +89,7 @@ class GetYourPassCard extends StatelessWidget {
TextSpan(
text: "\$20",
style: GoogleFonts.poppins(
fontSize: 14,
fontSize: 14.sp,
fontWeight: FontWeight.w700,
color: Colors.black,
),
@@ -96,7 +97,7 @@ class GetYourPassCard extends StatelessWidget {
TextSpan(
text: " /Adult",
style: GoogleFonts.poppins(
fontSize: 13,
fontSize: 13.sp,
color: Colors.black87,
),
),
@@ -116,10 +117,10 @@ class GetYourPassCard extends StatelessWidget {
class AttractionsAvatarStack extends StatelessWidget {
const AttractionsAvatarStack({
super.key,
required this.imagePath, // from your assets/figma
this.size = 35, // circle diameter
this.count = 4, // total circles including the last “16+”
this.overlap = 8, // how much they overlap
required this.imagePath,
this.size = 35,
this.count = 4,
this.overlap = 8,
this.moreText = '16+',
});
@@ -131,10 +132,13 @@ class AttractionsAvatarStack extends StatelessWidget {
@override
Widget build(BuildContext context) {
final step = size - overlap; // horizontal step between circles
final responsiveSize = size.r;
final responsiveOverlap = overlap.r;
final step = responsiveSize - responsiveOverlap;
return SizedBox(
width: size + (count - 1) * step,
height: size,
width: responsiveSize + (count - 1) * step,
height: responsiveSize,
child: Stack(
clipBehavior: Clip.none,
children: List.generate(count, (i) {
@@ -144,7 +148,7 @@ class AttractionsAvatarStack extends StatelessWidget {
return Positioned(
left: left,
child: _AvatarCircle(
size: size,
size: responsiveSize,
imagePath: imagePath,
showOverlayText: isLast,
overlayText: moreText,
@@ -174,10 +178,10 @@ class _AvatarCircle extends StatelessWidget {
return Container(
width: size,
height: size,
padding: const EdgeInsets.all(1.5), // white ring thickness
padding: EdgeInsets.all(1.5.r),
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.white, // ring color
color: Colors.white,
),
child: ClipOval(
child: Stack(
@@ -190,9 +194,9 @@ class _AvatarCircle extends StatelessWidget {
alignment: Alignment.center,
child: Text(
overlayText,
style: const TextStyle(
style: TextStyle(
color: Colors.white,
fontSize: 11,
fontSize: 11.sp,
fontWeight: FontWeight.w700,
),
),
@@ -203,4 +207,3 @@ class _AvatarCircle extends StatelessWidget {
);
}
}

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class InwardCurvedContainer extends StatelessWidget {
final Widget child;
@@ -10,14 +11,14 @@ class InwardCurvedContainer extends StatelessWidget {
clipper: InwardAndBottomConvexClipper(),
child: Container(
width: double.infinity,
height: 700,
height: 450.h,
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Color(0xFFFFF5F5),
Color(0xFFFDCDCE),
Color(0xFFFEF5F8),
Color(0xFFFFF5F5),
],
),

View File

@@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class ItineraryVideo extends StatefulWidget {
const ItineraryVideo({super.key});
@override
State<ItineraryVideo> createState() => _ItineraryVideoState();
}
class _ItineraryVideoState extends State<ItineraryVideo> {
late VideoPlayerController _controller;
@override
void initState() {
super.initState();
_controller = VideoPlayerController.asset(
'assets/gif/itinenary_animation_for_citycards.mp4',
)
..initialize().then((_) {
_controller.setLooping(true);
_controller.play();
setState(() {});
});
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Center(
child: _controller.value.isInitialized
? AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: VideoPlayer(_controller),
)
: const CircularProgressIndicator(),
);
}
}

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../common_packages/common_app_texts.dart';
import '../../core/route_constants.dart';
class ChooseYourPassSection extends StatefulWidget {
@@ -20,7 +21,7 @@ class _ChooseYourPassSectionState extends State<ChooseYourPassSection> {
final List<Map<String, dynamic>> passes = [
{
"title": "Chicago-\nFLEXI CARD",
"title": "Chicago-\n${CommonAppText.selectiveCard} CARD",
"price": "\$50",
"color": const Color(0xffF95FAF),
"bgColor": const Color(0xFFFDE7F1),

View File

@@ -19,156 +19,158 @@ class IntroScreensView extends StatelessWidget {
return BlocProvider(
create: (_) => IntroScreensCubit(),
child: Scaffold(
body: BlocBuilder<IntroScreensCubit, IntroScreensState>(
builder: (context, state) {
return Stack(
children: [
// Background PageView
PageView.builder(
controller: _pageController,
itemCount: pages.length,
onPageChanged: (index) =>
context.read<IntroScreensCubit>().updatePage(index),
itemBuilder: (context, index) {
final page = pages[index];
return Stack(
fit: StackFit.expand,
children: [
Image.asset(page.image, fit: BoxFit.cover),
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Color(0xFF00000000), Color(0xFF000000)],
body: SafeArea(
child: BlocBuilder<IntroScreensCubit, IntroScreensState>(
builder: (context, state) {
return Stack(
children: [
// Background PageView
PageView.builder(
controller: _pageController,
itemCount: pages.length,
onPageChanged: (index) =>
context.read<IntroScreensCubit>().updatePage(index),
itemBuilder: (context, index) {
final page = pages[index];
return Stack(
fit: StackFit.expand,
children: [
Image.asset(page.image, fit: BoxFit.cover),
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Color(0xFF00000000), Color(0xFF000000)],
),
),
),
),
],
);
},
),
// Skip Button (Only first 2 pages)
if (state.currentPage < pages.length - 1)
Positioned(
top: 50,
right: 20,
child: GestureDetector(
onTap: (){
Navigator.pushReplacementNamed(context,RouteConstants.home);
},
child: Container(
height: 48.h,
width: 92.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16.r),
border: Border.all(color: Colors.white),
),
child: Center(
child: Text(
'Skip',
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
fontWeight: FontWeight.w500,
],
);
},
),
// Skip Button (Only first 2 pages)
if (state.currentPage < pages.length - 1)
Positioned(
top: 50,
right: 20,
child: GestureDetector(
onTap: (){
Navigator.pushReplacementNamed(context,RouteConstants.home);
},
child: Container(
height: 48.h,
width: 92.w,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16.r),
border: Border.all(color: Colors.white),
),
child: Center(
child: Text(
'Skip',
style: TextStyle(
color: Colors.white,
fontSize: 16.sp,
fontWeight: FontWeight.w500,
),
),
),
),
),
),
),
// Bottom Content
Align(
alignment: Alignment.bottomCenter,
child: GlassMorphismContainer(
blurIntensity: 0.5,
padding: EdgeInsets.symmetric(
horizontal: 24.w,
vertical: 17.h,
),
margin: const EdgeInsets.all(20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
pages[state.currentPage].title,
style: TextStyle(
color: Colors.white,
fontSize: 24.sp,
fontWeight: FontWeight.w500,
),
textAlign: TextAlign.center,
),
SizedBox(height: 8.h),
Text(
pages[state.currentPage].description,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
textAlign: TextAlign.center,
),
SizedBox(height: 24.h),
// Dots Indicator
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(
pages.length,
(index) => Container(
margin: const EdgeInsets.symmetric(
horizontal: 4.0,
),
width: 36.w,
height: 12.h,
decoration: BoxDecoration(
color: state.currentPage == index
? Color(0xFFF95F62)
: Color(0xFFF95F62).withOpacity(0.42),
borderRadius: BorderRadius.circular(12),
),
),
),
),
SizedBox(height: 24.h),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Color(0xFFF95F62),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16.r),
),
minimumSize: const Size(double.infinity, 52),
),
onPressed: () {
if (state.currentPage == pages.length - 1) {
Navigator.pushReplacementNamed(context, '/home');
} else {
_pageController.nextPage(
duration: const Duration(milliseconds: 400),
curve: Curves.easeInOut,
);
}
},
child: Text(
state.currentPage == pages.length - 1
? "Let's Get Started"
: 'Continue',
// Bottom Content
Align(
alignment: Alignment.bottomCenter,
child: GlassMorphismContainer(
blurIntensity: 0.5,
padding: EdgeInsets.symmetric(
horizontal: 24.w,
vertical: 17.h,
),
margin: const EdgeInsets.all(20),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
pages[state.currentPage].title,
style: TextStyle(
color: Colors.white,
fontSize: 20.sp,
fontWeight: FontWeight.w600,
fontSize: 24.sp,
fontWeight: FontWeight.w500,
),
textAlign: TextAlign.center,
),
SizedBox(height: 8.h),
Text(
pages[state.currentPage].description,
style: TextStyle(
color: Colors.white,
fontSize: 14.sp,
),
textAlign: TextAlign.center,
),
SizedBox(height: 24.h),
// Dots Indicator
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(
pages.length,
(index) => Container(
margin: const EdgeInsets.symmetric(
horizontal: 4.0,
),
width: 36.w,
height: 12.h,
decoration: BoxDecoration(
color: state.currentPage == index
? Color(0xFFF95F62)
: Color(0xFFF95F62).withOpacity(0.42),
borderRadius: BorderRadius.circular(12),
),
),
),
),
),
],
SizedBox(height: 24.h),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Color(0xFFF95F62),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16.r),
),
minimumSize: const Size(double.infinity, 52),
),
onPressed: () {
if (state.currentPage == pages.length - 1) {
Navigator.pushReplacementNamed(context, '/home');
} else {
_pageController.nextPage(
duration: const Duration(milliseconds: 400),
curve: Curves.easeInOut,
);
}
},
child: Text(
state.currentPage == pages.length - 1
? "Let's Get Started"
: 'Continue',
style: TextStyle(
color: Colors.white,
fontSize: 20.sp,
fontWeight: FontWeight.w600,
),
),
),
],
),
),
),
),
],
);
},
],
);
},
),
),
),
);

View File

@@ -36,28 +36,29 @@ class _DietarySelectionViewState extends State<DietarySelectionView> {
Text(
"👋 Hello! We'd love to know more about you. Do you follow any dietary preferences?",
style: TextStyle(
color: Color(0xFF101828),
fontSize: 24.sp,
color: const Color(0xFF101828),
fontSize: 20.sp,
fontWeight: FontWeight.w500,
),
textAlign: TextAlign.center,
),
SizedBox(height: 12.h),
SizedBox(height: 10.h),
CustomText(
text: "Select all that apply",
size: 14.sp,
size: 12.sp,
color: const Color(0xFF6A7282),
),
SizedBox(height: 38.h),
SizedBox(height: 32.h),
SizedBox(
height: 350.h,
height: 320.h,
child: BlocBuilder<AddItineraryDetailBloc, ItineraryDetailState>(
builder: (context, sate) {
return GridView.builder(
physics: NeverScrollableScrollPhysics(),
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
mainAxisSpacing: 12,
crossAxisSpacing: 16,
mainAxisSpacing: 10.h,
crossAxisSpacing: 14.w,
crossAxisCount: 2,
childAspectRatio: 1.7,
),
@@ -72,12 +73,15 @@ class _DietarySelectionViewState extends State<DietarySelectionView> {
);
},
child: Container(
width: 168.w,
width: 150.w,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(24),
borderRadius: BorderRadius.circular(20.r),
border: isSelected
? Border.all(color: Color(0xFFF95F62))
? Border.all(
color: const Color(0xFFF95F62),
width: 1.5.w,
)
: Border.all(color: Colors.transparent),
),
alignment: Alignment.center,
@@ -85,11 +89,15 @@ class _DietarySelectionViewState extends State<DietarySelectionView> {
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(item["icon"] ?? "", scale: 4),
SizedBox(height: 8),
Image.asset(
item["icon"] ?? "",
width: 40.w,
height: 40.h,
),
SizedBox(height: 6.h),
CustomText(
text: item["name"] ?? "",
size: 16.sp,
size: 14.sp,
weight: FontWeight.w500,
color: const Color(0xFF364153),
),
@@ -103,7 +111,7 @@ class _DietarySelectionViewState extends State<DietarySelectionView> {
),
),
SizedBox(height: 41.h),
SizedBox(height: 36.h),
CustomFilledButton(
onTap: () {
context.read<ItineraryStepNavigationBloc>().add(

View File

@@ -41,8 +41,7 @@ class MyApp extends StatelessWidget {
],
child: MaterialApp(
onGenerateRoute: _appRouter.onGenerateRoute,
// initialRoute: RouteConstants.intro,
home: LottieAnimationScreen(),
initialRoute: RouteConstants.splash,
debugShowCheckedModeBanner: false,
title: 'City Cards',
theme: ThemeData(

View File

@@ -0,0 +1,6 @@
class ApiUrls {
static const baseUrl = "https://devapi.citycards.betadelivery.com";
static const cityList = "$baseUrl/mobile/city_list";
}

View File

@@ -0,0 +1,192 @@
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
class NetworkApiService {
static final NetworkApiService _instance = NetworkApiService._internal();
late Dio _dio;
factory NetworkApiService() {
return _instance;
}
NetworkApiService._internal() {
_dio = Dio(
BaseOptions(
connectTimeout: const Duration(seconds: 30),
receiveTimeout: const Duration(seconds: 30),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
),
);
// Add interceptors
_dio.interceptors.add(
InterceptorsWrapper(
onRequest: (options, handler) {
// Add token if available
// String? token = "use token here from local shared preference";
// if (token != null) {
// options.headers['Authorization'] = 'Bearer $token';
// }
if (kDebugMode) {
print('REQUEST[${options.method}] => URL: ${options.uri}');
}
return handler.next(options);
},
onResponse: (response, handler) {
if (kDebugMode) {
print('RESPONSE[${response.statusCode}] => DATA: ${response.data}');
}
return handler.next(response);
},
onError: (error, handler) {
if (kDebugMode) {
print('ERROR[${error.response?.statusCode}] => MESSAGE: ${error.message}');
}
return handler.next(error);
},
),
);
// Add logging interceptor in debug mode
if (kDebugMode) {
_dio.interceptors.add(LogInterceptor(
request: true,
requestHeader: true,
requestBody: true,
responseHeader: false,
responseBody: true,
error: true,
));
}
}
// GET API Request
Future<Response> getApi({
required String url,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
}) async {
try {
final response = await _dio.get(
url,
queryParameters: queryParameters,
options: options,
cancelToken: cancelToken,
);
return response;
} on DioException catch (e) {
throw _handleError(e);
}
}
// POST API Request
Future<Response> postApi({
required String url,
dynamic data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
}) async {
try {
final response = await _dio.post(
url,
data: data,
queryParameters: queryParameters,
options: options,
cancelToken: cancelToken,
onSendProgress: onSendProgress,
);
return response;
} on DioException catch (e) {
throw _handleError(e);
}
}
// PUT API Request (Bonus)
Future<Response> putApi({
required String url,
dynamic data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
}) async {
try {
final response = await _dio.put(
url,
data: data,
queryParameters: queryParameters,
options: options,
cancelToken: cancelToken,
);
return response;
} on DioException catch (e) {
throw _handleError(e);
}
}
// DELETE API Request (Bonus)
Future<Response> deleteApi({
required String url,
dynamic data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
}) async {
try {
final response = await _dio.delete(
url,
data: data,
queryParameters: queryParameters,
options: options,
cancelToken: cancelToken,
);
return response;
} on DioException catch (e) {
throw _handleError(e);
}
}
// Error Handler
String _handleError(DioException error) {
String errorDescription = "";
switch (error.type) {
case DioExceptionType.connectionTimeout:
errorDescription = "Connection timeout. Please try again.";
break;
case DioExceptionType.sendTimeout:
errorDescription = "Send timeout. Please try again.";
break;
case DioExceptionType.receiveTimeout:
errorDescription = "Receive timeout. Please try again.";
break;
case DioExceptionType.badCertificate:
errorDescription = "Bad certificate.";
break;
case DioExceptionType.badResponse:
errorDescription = error.response?.data['message'] ??
"Received invalid status code: ${error.response?.statusCode}";
break;
case DioExceptionType.cancel:
errorDescription = "Request was cancelled.";
break;
case DioExceptionType.connectionError:
errorDescription = "No internet connection.";
break;
case DioExceptionType.unknown:
errorDescription = "Something went wrong. Please try again.";
break;
}
return errorDescription;
}
// Update headers (e.g., add token)
void updateHeaders(Map<String, dynamic> headers) {
_dio.options.headers.addAll(headers);
}
}

View File

@@ -7,6 +7,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../common_packages/common_app_texts.dart';
class SearchOffersWithListing extends StatelessWidget {
SearchOffersWithListing({super.key});
@@ -32,7 +34,7 @@ class SearchOffersWithListing extends StatelessWidget {
},
child: Icon(Icons.arrow_back)),
SizedBox(width: 8.w),
CustomText(text: "Offers with Flexi Card", size: 12.sp),
CustomText(text: "Offers with ${CommonAppText.selectiveCard} Card", size: 12.sp),
],
),
@@ -142,6 +144,8 @@ class SearchOffersWithListing extends StatelessWidget {
text: offer["description"] ?? "",
color: Colors.black.withOpacity(.6),
size: 12.sp,
maxLines: 3,
overflow: TextOverflow.ellipsis,
),
],
),

View File

@@ -0,0 +1,41 @@
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
import 'package:citycards_customer/intro_screens/views/intro_screen_view.dart';
class SplashScreen extends StatefulWidget {
const SplashScreen({super.key});
@override
State<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
@override
void initState() {
super.initState();
Future.delayed(const Duration(seconds: 4), () {
if (mounted) {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => IntroScreensView()),
);
}
});
}
@override
Widget build(BuildContext context) {
print('🎯 SplashScreen build called');
return Scaffold(
backgroundColor: const Color(0xFFF95F62), // Coral red background
body: Center(
child: Lottie.asset(
'assets/intro/animation.json', // Your Lottie file
fit: BoxFit.cover,
repeat: true,
),
),
);
}
}

View File

@@ -195,48 +195,55 @@
//
// @override
// bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
// // }
// import 'package:citycards_customer/core/route_constants.dart';
// import 'package:citycards_customer/intro_screens/views/intro_screen_view.dart';
// import 'package:flutter/material.dart';
// import 'package:flutter/services.dart';
// import 'package:lottie/lottie.dart';
//
// class SplashScreen extends StatefulWidget {
// const SplashScreen({super.key});
//
// @override
// State<SplashScreen> createState() => _SplashScreenState();
// }
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:lottie/lottie.dart';
class LottieAnimationScreen extends StatefulWidget {
const LottieAnimationScreen({super.key});
@override
State<LottieAnimationScreen> createState() => _LottieAnimationScreenState();
}
class _LottieAnimationScreenState extends State<LottieAnimationScreen> {
@override
void initState() {
super.initState();
// Delay for animation duration, then navigate to intro screens
Future.delayed(const Duration(seconds: 3), () {
Navigator.pushReplacementNamed(context, '/intro');
});
// Custom status bar color
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(
statusBarColor: Color(0xFFF95F62),
statusBarIconBrightness: Brightness.light,
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFFF95F62),
body: Center(
child: Lottie.asset(
'assets/intro/anim.json', // your animated Lottie file
fit: BoxFit.cover,
repeat: true,
),
),
);
}
}
//
// class _SplashScreenState extends State<SplashScreen> {
// @override
// void initState() {
// super.initState();
// timeCounter();
// }
//
// void timeCounter() async {
// try {
// Future.delayed(const Duration(seconds: 3), () {
// Navigator.pushReplacement(
// context,
// MaterialPageRoute(
// builder: (_) {
// return IntroScreensView();
// },
// ),
// );
// });
// } catch (e) {
// print('Error Occurs ${e.toString()}');
// }
// }
//
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// backgroundColor: const Color(0xFFF95F62),
// body: Center(
// child: Lottie.asset(
// 'assets/intro/anim.json', // your animated Lottie file
// fit: BoxFit.cover,
// repeat: true,
// ),
// ),
// );
// }
// }

View File

@@ -30,7 +30,7 @@ class YourItineraryView extends StatelessWidget {
children: [
Image.asset(
"assets/images/trump_house.png",
height: 155.h,
height: 165.h,
width: double.infinity,
fit: BoxFit.cover,
alignment: Alignment.topCenter,
@@ -45,12 +45,7 @@ class YourItineraryView extends StatelessWidget {
child: Column(
children: [
CommonAppBar(isWhiteLogo: true, isProfilePage: false, showDivider: true,),
SizedBox(height: 5.h),
Divider(
height: 0.4.h,
color: Colors.white.withOpacity(.3),
),
SizedBox(height: 26.h),
SizedBox(height: 10.h),
Row(
children: [
GestureDetector(
@@ -68,7 +63,7 @@ class YourItineraryView extends StatelessWidget {
"Melbourne Itinerary",
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w500,
fontWeight: FontWeight.w700,
color: Colors.white,
),
),

View File

@@ -129,6 +129,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.7.11"
dio:
dependency: "direct main"
description:
name: dio
sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9
url: "https://pub.dev"
source: hosted
version: "5.9.0"
dio_web_adapter:
dependency: transitive
description:
name: dio_web_adapter
sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
dylib:
dependency: transitive
description:
name: dylib
sha256: bf609b3eb6492a3309b3d1dbe8f83a4031de5535dd7686be33487051cc760bb0
url: "https://pub.dev"
source: hosted
version: "0.3.3"
equatable:
dependency: "direct main"
description:
@@ -206,6 +230,14 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_angle:
dependency: transitive
description:
name: flutter_angle
sha256: "344a6b5ba7fa4893799ba8a98ed1b164e0b92ce77cf98b6c0f276efe1032249e"
url: "https://pub.dev"
source: hosted
version: "0.3.8"
flutter_bloc:
dependency: "direct main"
description:
@@ -557,6 +589,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.1.1"
logger:
dependency: transitive
description:
name: logger
sha256: a7967e31b703831a893bbc3c3dd11db08126fe5f369b5c648a36f821979f5be3
url: "https://pub.dev"
source: hosted
version: "2.6.2"
lottie:
dependency: "direct main"
description:
@@ -585,10 +625,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
version: "1.16.0"
version: "1.17.0"
mime:
dependency: transitive
description:
@@ -605,6 +645,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.0"
opentype_dart:
dependency: transitive
description:
name: opentype_dart
sha256: "4bd96aeed494289a87e92bde20afe60f59648dcef253c0a7159b65ffa23899dc"
url: "https://pub.dev"
source: hosted
version: "0.0.1"
package_info_plus:
dependency: transitive
description:
@@ -878,10 +926,106 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
url: "https://pub.dev"
source: hosted
version: "0.7.6"
version: "0.7.7"
three_js:
dependency: "direct main"
description:
name: three_js
sha256: "76554d705ee0f7101d969773bc92fbd18d2e0f28ee87a9e41f7c0a86bd76f480"
url: "https://pub.dev"
source: hosted
version: "0.2.6"
three_js_advanced_loaders:
dependency: transitive
description:
name: three_js_advanced_loaders
sha256: "901ee356fba0ffe57547e448ee73aaa351b68a46608cf8f13c798b28980fbd38"
url: "https://pub.dev"
source: hosted
version: "0.2.4"
three_js_animations:
dependency: transitive
description:
name: three_js_animations
sha256: "7f7d708e96301e0fef1ab71ebaef280d5885c081f184e49c6956a22bd51ee444"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
three_js_controls:
dependency: transitive
description:
name: three_js_controls
sha256: "4cc52d53e3bf1cca0d469c5f200b10c5c96954663d551bdb6b0b4278a0dca148"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
three_js_core:
dependency: transitive
description:
name: three_js_core
sha256: "4aa78017f1562cd2c67b3146587eb8c6b75870ca030b0a5263d532d6660c31dd"
url: "https://pub.dev"
source: hosted
version: "0.2.6"
three_js_core_loaders:
dependency: transitive
description:
name: three_js_core_loaders
sha256: "85ca58d66b57b94acb5b4598e97ebd54a1679025f4eaf8cfa2dade4b561b2189"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
three_js_curves:
dependency: transitive
description:
name: three_js_curves
sha256: "9f11f2fa869dc6b1aa01219bd0587b768cc0dcbf0bde5bbb576c5fabcbb3b3c7"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
three_js_geometry:
dependency: transitive
description:
name: three_js_geometry
sha256: "11cbf2661b32fe90d7150c2dddd2846866de6500589e13eb9d682b017c19420a"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
three_js_math:
dependency: transitive
description:
name: three_js_math
sha256: "8687016308b8d6d027a8fb3982eedb7514bbc4cf21145da0116dbd801254aa50"
url: "https://pub.dev"
source: hosted
version: "0.2.5"
three_js_sensors:
dependency: transitive
description:
name: three_js_sensors
sha256: "40874a52c6e617762d324e8149356ccacf90aa65a8904f6e3520e4aba1bff447"
url: "https://pub.dev"
source: hosted
version: "0.1.2"
three_js_simple_loaders:
dependency: transitive
description:
name: three_js_simple_loaders
sha256: "3728e84dd74cf68fbf7b6260d5eda47afbcddc48dd7b127a56fef85d92b87c78"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
three_js_text:
dependency: transitive
description:
name: three_js_text
sha256: ba5f44e5da00b5f510a24308644da72c5d3b039542da3d1c13b08f7e28066d29
url: "https://pub.dev"
source: hosted
version: "0.2.0"
timezone:
dependency: transitive
description:
@@ -922,6 +1066,46 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.0"
video_player:
dependency: "direct main"
description:
name: video_player
sha256: "096bc28ce10d131be80dfb00c223024eb0fba301315a406728ab43dd99c45bdf"
url: "https://pub.dev"
source: hosted
version: "2.10.1"
video_player_android:
dependency: transitive
description:
name: video_player_android
sha256: cf768d02924b91e333e2bc1ff928528f57d686445874f383bafab12d0bdfc340
url: "https://pub.dev"
source: hosted
version: "2.8.17"
video_player_avfoundation:
dependency: transitive
description:
name: video_player_avfoundation
sha256: "03fc6d07dba2499588d30887329b399c1fe2d68ce4b7fcff0db79f44a2603f69"
url: "https://pub.dev"
source: hosted
version: "2.8.6"
video_player_platform_interface:
dependency: transitive
description:
name: video_player_platform_interface
sha256: "57c5d73173f76d801129d0531c2774052c5a7c11ccb962f1830630decd9f24ec"
url: "https://pub.dev"
source: hosted
version: "6.6.0"
video_player_web:
dependency: transitive
description:
name: video_player_web
sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
vm_service:
dependency: transitive
description:

View File

@@ -33,6 +33,7 @@ dependencies:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
three_js: ^0.2.6
google_fonts: ^6.3.2
flutter_bloc: ^9.1.1
cupertino_icons: ^1.0.8
@@ -45,11 +46,13 @@ dependencies:
geolocator: ^14.0.2
equatable: ^2.0.7
syncfusion_flutter_calendar: ^31.2.4
flutter_native_splash: ^2.4.7
shared_preferences: ^2.5.3
flutter_launcher_icons: ^0.14.4
flutter_glass_morphism: ^1.0.2
lottie: ^3.3.2
flutter_native_splash: ^2.4.7
video_player: ^2.10.1
dio: ^5.9.0
dev_dependencies:
flutter_test:
@@ -108,9 +111,9 @@ flutter:
# For details regarding fonts from package dependencies,
# see https://flutter.dev/to/font-from-package
flutter_native_splash:
color: "#F95F62" # Background color (your coral red)
image: assets/logo/logo_city_cards_white.png # Your splash logo
color: "#F95F62"
background_image: assets/logo/splash.png
android_12:
color: "#F95F62"
image: assets/logo/logo_city_cards_white.png
background_image: assets/logo/splash.png
web: false