Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7249870aa9 | ||
|
|
7dbeef2f80 | ||
|
|
1ca940e5cf | ||
|
|
b54739953a | ||
|
|
323d730e2d | ||
|
|
f3c98df517 | ||
|
|
0ef09633e0 | ||
| 72aae68e2d |
@@ -21,7 +21,7 @@ android {
|
|||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
// 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.
|
// You can update the following values to match your application needs.
|
||||||
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
||||||
minSdk = flutter.minSdkVersion
|
minSdk = flutter.minSdkVersion
|
||||||
|
|||||||
@@ -1,21 +1,22 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:label="CityCard Customer"
|
|
||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:icon="@mipmap/launcher_icon">
|
android:icon="@mipmap/launcher_icon"
|
||||||
|
android:label="CityCard Customer">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
|
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
android:taskAffinity=""
|
android:taskAffinity=""
|
||||||
android:theme="@style/NormalTheme"
|
android:theme="@style/NormalTheme"
|
||||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
|
||||||
android:hardwareAccelerated="true"
|
|
||||||
android:windowSoftInputMode="adjustResize">
|
android:windowSoftInputMode="adjustResize">
|
||||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||||
the Android process has started. This theme is visible to the user
|
the Android process has started. This theme is visible to the user
|
||||||
@@ -23,11 +24,19 @@
|
|||||||
to determine the Window background behind the Flutter UI. -->
|
to determine the Window background behind the Flutter UI. -->
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="io.flutter.embedding.android.NormalTheme"
|
android:name="io.flutter.embedding.android.NormalTheme"
|
||||||
android:resource="@style/NormalTheme"
|
android:resource="@style/NormalTheme" />
|
||||||
/>
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="http" />
|
||||||
|
<data android:scheme="https" />
|
||||||
|
<data android:scheme="mailto" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<!-- Don't delete the meta-data below.
|
<!-- Don't delete the meta-data below.
|
||||||
@@ -43,8 +52,8 @@
|
|||||||
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
||||||
<queries>
|
<queries>
|
||||||
<intent>
|
<intent>
|
||||||
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
<action android:name="android.intent.action.PROCESS_TEXT" />
|
||||||
<data android:mimeType="text/plain"/>
|
<data android:mimeType="text/plain" />
|
||||||
</intent>
|
</intent>
|
||||||
</queries>
|
</queries>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<bitmap android:gravity="fill" android:src="@drawable/background"/>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
6
android/app/src/main/res/drawable/launch_background.xml
Normal file
6
android/app/src/main/res/drawable/launch_background.xml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item>
|
||||||
|
<bitmap android:gravity="fill" android:src="@drawable/background"/>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
BIN
assets/gif/itinenary_animation_for_citycards.mp4
Normal file
BIN
assets/gif/itinenary_animation_for_citycards.mp4
Normal file
Binary file not shown.
1
assets/intro/animm.json
Normal file
1
assets/intro/animm.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
assets/logo/logo_white_resized.png
Normal file
BIN
assets/logo/logo_white_resized.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 93 KiB |
BIN
assets/logo/logoframe.png
Normal file
BIN
assets/logo/logoframe.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
@@ -1,5 +1,5 @@
|
|||||||
# Uncomment this line to define a global platform for your project
|
# 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.
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|||||||
94
ios/Podfile.lock
Normal file
94
ios/Podfile.lock
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
PODS:
|
||||||
|
- Flutter (1.0.0)
|
||||||
|
- flutter_native_splash (2.4.3):
|
||||||
|
- Flutter
|
||||||
|
- 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
|
||||||
|
- share_plus (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- shared_preferences_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- url_launcher_ios (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- video_player_avfoundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
|
||||||
|
DEPENDENCIES:
|
||||||
|
- Flutter (from `Flutter`)
|
||||||
|
- 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`)
|
||||||
|
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||||
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||||
|
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||||
|
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
|
||||||
|
|
||||||
|
SPEC REPOS:
|
||||||
|
trunk:
|
||||||
|
- Google-Maps-iOS-Utils
|
||||||
|
- GoogleMaps
|
||||||
|
|
||||||
|
EXTERNAL SOURCES:
|
||||||
|
Flutter:
|
||||||
|
:path: Flutter
|
||||||
|
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"
|
||||||
|
share_plus:
|
||||||
|
:path: ".symlinks/plugins/share_plus/ios"
|
||||||
|
shared_preferences_foundation:
|
||||||
|
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||||
|
url_launcher_ios:
|
||||||
|
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||||
|
video_player_avfoundation:
|
||||||
|
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
|
||||||
|
|
||||||
|
SPEC CHECKSUMS:
|
||||||
|
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
||||||
|
flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf
|
||||||
|
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
|
||||||
|
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
||||||
|
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
|
||||||
|
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
|
||||||
|
video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: 1857a7cdb7dfafe45f2b0e9a9af44644190f7506
|
||||||
|
|
||||||
|
COCOAPODS: 1.16.2
|
||||||
@@ -7,10 +7,12 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* 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 */; };
|
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
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 */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
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>"; };
|
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; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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 */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@@ -62,6 +72,15 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
00C1AB7B0C8F1922F3F1AE65 /* Pods_Runner.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
CF8A29BE993C0C902CB143AF /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
81D638B66EB4658C8192CA0D /* Pods_RunnerTests.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -76,6 +95,28 @@
|
|||||||
path = RunnerTests;
|
path = RunnerTests;
|
||||||
sourceTree = "<group>";
|
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 */ = {
|
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -94,6 +135,8 @@
|
|||||||
97C146F01CF9000F007C117D /* Runner */,
|
97C146F01CF9000F007C117D /* Runner */,
|
||||||
97C146EF1CF9000F007C117D /* Products */,
|
97C146EF1CF9000F007C117D /* Products */,
|
||||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||||
|
6D4A73F1E55857ADBD000C6A /* Pods */,
|
||||||
|
5D45FB84C63476582408C414 /* Frameworks */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@@ -128,8 +171,10 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
BC66FA7BADCD3982DC87655E /* [CP] Check Pods Manifest.lock */,
|
||||||
331C807D294A63A400263BE5 /* Sources */,
|
331C807D294A63A400263BE5 /* Sources */,
|
||||||
331C807F294A63A400263BE5 /* Resources */,
|
331C807F294A63A400263BE5 /* Resources */,
|
||||||
|
CF8A29BE993C0C902CB143AF /* Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@@ -145,12 +190,15 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
3825EC0F330C0B58EA2A8981 /* [CP] Check Pods Manifest.lock */,
|
||||||
9740EEB61CF901F6004384FC /* Run Script */,
|
9740EEB61CF901F6004384FC /* Run Script */,
|
||||||
97C146EA1CF9000F007C117D /* Sources */,
|
97C146EA1CF9000F007C117D /* Sources */,
|
||||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||||
97C146EC1CF9000F007C117D /* Resources */,
|
97C146EC1CF9000F007C117D /* Resources */,
|
||||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||||
|
41FC0A605EBADE26C841287E /* [CP] Embed Pods Frameworks */,
|
||||||
|
D10E98BB568B7005161E1ABD /* [CP] Copy Pods Resources */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@@ -222,6 +270,28 @@
|
|||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase 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 */ = {
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
alwaysOutOfDate = 1;
|
alwaysOutOfDate = 1;
|
||||||
@@ -238,6 +308,23 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
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 */ = {
|
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
alwaysOutOfDate = 1;
|
alwaysOutOfDate = 1;
|
||||||
@@ -253,6 +340,45 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
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 */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
@@ -361,24 +487,35 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
DEVELOPMENT_TEAM = A89AY6VY4F;
|
DEVELOPMENT_TEAM = A89AY6VY4F;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = "CityCard Customer";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.citycardscustomer.citycardsCustomer;
|
PRODUCT_BUNDLE_IDENTIFIER = com.citycard.customer;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
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_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 1;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
};
|
};
|
||||||
name = Profile;
|
name = Profile;
|
||||||
};
|
};
|
||||||
331C8088294A63A400263BE5 /* Debug */ = {
|
331C8088294A63A400263BE5 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = E2E6DC2B6718F55E3BF165E7 /* Pods-RunnerTests.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@@ -396,6 +533,7 @@
|
|||||||
};
|
};
|
||||||
331C8089294A63A400263BE5 /* Release */ = {
|
331C8089294A63A400263BE5 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 626B072D1717B50A277DA3C7 /* Pods-RunnerTests.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@@ -411,6 +549,7 @@
|
|||||||
};
|
};
|
||||||
331C808A294A63A400263BE5 /* Profile */ = {
|
331C808A294A63A400263BE5 /* Profile */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = C1FCB3EF88270ED76DFA3FBD /* Pods-RunnerTests.profile.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@@ -475,7 +614,7 @@
|
|||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
};
|
};
|
||||||
@@ -526,6 +665,7 @@
|
|||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SUPPORTED_PLATFORMS = iphoneos;
|
SUPPORTED_PLATFORMS = iphoneos;
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
@@ -541,19 +681,29 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
DEVELOPMENT_TEAM = A89AY6VY4F;
|
DEVELOPMENT_TEAM = A89AY6VY4F;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = "CityCard Customer";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.citycardscustomer.citycardsCustomer;
|
PRODUCT_BUNDLE_IDENTIFIER = com.citycard.customer;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
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_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 1;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
@@ -564,18 +714,28 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
DEVELOPMENT_TEAM = A89AY6VY4F;
|
DEVELOPMENT_TEAM = A89AY6VY4F;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
INFOPLIST_KEY_CFBundleDisplayName = "CityCard Customer";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.citycardscustomer.citycardsCustomer;
|
PRODUCT_BUNDLE_IDENTIFIER = com.citycard.customer;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
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_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = 1;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
|
|||||||
3
ios/Runner.xcworkspace/contents.xcworkspacedata
generated
3
ios/Runner.xcworkspace/contents.xcworkspacedata
generated
@@ -4,4 +4,7 @@
|
|||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Runner.xcodeproj">
|
location = "group:Runner.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
|
<true/>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
<key>CFBundleDisplayName</key>
|
<key>CFBundleDisplayName</key>
|
||||||
@@ -17,17 +19,29 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
<string>1.0.0</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
<string>1</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<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>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>LaunchScreen</string>
|
<string>LaunchScreen</string>
|
||||||
<key>UIMainStoryboardFile</key>
|
<key>UIMainStoryboardFile</key>
|
||||||
<string>Main</string>
|
<string>Main</string>
|
||||||
|
<key>UIStatusBarHidden</key>
|
||||||
|
<false/>
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
<array>
|
<array>
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
@@ -41,11 +55,5 @@
|
|||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIStatusBarHidden</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -1,484 +0,0 @@
|
|||||||
import 'package:citycards_customer/attraction_details/share_bottomsheet.dart';
|
|
||||||
import 'package:citycards_customer/common_packages/app_bar.dart';
|
|
||||||
import 'package:citycards_customer/common_packages/custom_text.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
|
|
||||||
import '../core/route_constants.dart';
|
|
||||||
|
|
||||||
class AttractionDetailsView extends StatelessWidget {
|
|
||||||
const AttractionDetailsView({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
body: SafeArea(
|
|
||||||
child: SingleChildScrollView(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
|
|
||||||
Stack(
|
|
||||||
children: [
|
|
||||||
Image.asset(
|
|
||||||
'assets/images/koh_rong_samloem_banner.png',
|
|
||||||
height: 377.h,
|
|
||||||
width: double.infinity,
|
|
||||||
fit: BoxFit.cover,
|
|
||||||
),
|
|
||||||
Positioned(
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
right: 0,
|
|
||||||
child: SafeArea(
|
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.h),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
|
|
||||||
CommonAppBar(isWhiteLogo: true, isProfilePage: false, showDivider: true,),
|
|
||||||
|
|
||||||
SizedBox(height: 10.h),
|
|
||||||
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
GestureDetector(
|
|
||||||
onTap: () => Navigator.pop(context),
|
|
||||||
child: Icon(
|
|
||||||
Icons.arrow_back,
|
|
||||||
size: 24.sp,
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(width: 8.w),
|
|
||||||
Text(
|
|
||||||
"Koh Rong Samloem",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 14.sp,
|
|
||||||
fontWeight: FontWeight.w600,
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
Positioned(
|
|
||||||
bottom: 31.h,
|
|
||||||
left: 12.w,
|
|
||||||
child: Text(
|
|
||||||
"Koh Rong\nSamloem",
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.white,
|
|
||||||
fontSize: 44.sp,
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
height: 1.2,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
Positioned(
|
|
||||||
bottom: 31.h,
|
|
||||||
right: 17.w,
|
|
||||||
child: GestureDetector(
|
|
||||||
onTap: () {
|
|
||||||
showModalBottomSheet(
|
|
||||||
context: context,
|
|
||||||
isScrollControlled: true,
|
|
||||||
backgroundColor: Colors.transparent,
|
|
||||||
builder: (context) => const ShareBottomSheet(),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
height: 36.h,
|
|
||||||
width: 36.w,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadius.circular(20.r),
|
|
||||||
),
|
|
||||||
child: Center(
|
|
||||||
child: Icon(
|
|
||||||
Icons.share_sharp,
|
|
||||||
color: Colors.black,
|
|
||||||
size: 18.sp,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
|
|
||||||
// About Section
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 30.h),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
"About",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 18.sp,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 12.32.h),
|
|
||||||
Text(
|
|
||||||
"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...",
|
|
||||||
style: TextStyle(
|
|
||||||
color: Color(0xFF262626),
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
fontSize: 14.sp,
|
|
||||||
height: 1.5,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 41.h),
|
|
||||||
// Booking Section
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 16.w),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
"How to make a booking?",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 18.sp,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 16.h),
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.symmetric(
|
|
||||||
horizontal: 12.w,
|
|
||||||
vertical: 12.h,
|
|
||||||
),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
|
||||||
border: Border.all(color: Color(0xFFF95F62)),
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Icon(
|
|
||||||
Icons.call,
|
|
||||||
color: Color(0xFFF95F62),
|
|
||||||
size: 32.w,
|
|
||||||
),
|
|
||||||
SizedBox(width: 16.w),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
CustomText(
|
|
||||||
text: "Contact Number",
|
|
||||||
color: Colors.black.withOpacity(.6),
|
|
||||||
size: 12.sp,
|
|
||||||
weight: FontWeight.w500,
|
|
||||||
),
|
|
||||||
SizedBox(height: 6.h),
|
|
||||||
CustomText(
|
|
||||||
text: "+1012 3456 789",
|
|
||||||
color: Colors.black,
|
|
||||||
size: 14.sp,
|
|
||||||
weight: FontWeight.w600,
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 6.h),
|
|
||||||
CustomText(
|
|
||||||
text: "Tap to call",
|
|
||||||
color: Colors.black.withOpacity(.4),
|
|
||||||
size: 12.sp,
|
|
||||||
weight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 16.h),
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.symmetric(
|
|
||||||
horizontal: 12.w,
|
|
||||||
vertical: 12.h,
|
|
||||||
),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
|
||||||
border: Border.all(color: Color(0xFFF95F62)),
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Icon(
|
|
||||||
Icons.email_sharp,
|
|
||||||
color: Color(0xFFF95F62),
|
|
||||||
size: 32.w,
|
|
||||||
),
|
|
||||||
SizedBox(width: 16.w),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
CustomText(
|
|
||||||
text: "Email",
|
|
||||||
color: Colors.black.withOpacity(.6),
|
|
||||||
size: 12.sp,
|
|
||||||
weight: FontWeight.w500,
|
|
||||||
),
|
|
||||||
SizedBox(height: 6.h),
|
|
||||||
CustomText(
|
|
||||||
text: "CityCards24@gmail.com",
|
|
||||||
color: Colors.black,
|
|
||||||
size: 14.sp,
|
|
||||||
weight: FontWeight.w600,
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 6.h),
|
|
||||||
CustomText(
|
|
||||||
text: "Tap to email",
|
|
||||||
color: Colors.black.withOpacity(.4),
|
|
||||||
size: 12.sp,
|
|
||||||
weight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 16.h),
|
|
||||||
|
|
||||||
InkWell(
|
|
||||||
onTap: (){
|
|
||||||
Navigator.of(context).pushNamed(RouteConstants.makeBooking);
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
padding: EdgeInsets.symmetric(
|
|
||||||
horizontal: 24.w,
|
|
||||||
vertical: 18.h,
|
|
||||||
),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Color(0xFFF95F62),
|
|
||||||
borderRadius: BorderRadius.circular(10.r),
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
CustomText(
|
|
||||||
text: "Via CityCards",
|
|
||||||
size: 16.sp,
|
|
||||||
weight: FontWeight.w500,
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
SizedBox(height: 8.h),
|
|
||||||
CustomText(
|
|
||||||
text: "Create a booking via app",
|
|
||||||
size: 11.sp,
|
|
||||||
weight: FontWeight.w400,
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
Icon(
|
|
||||||
Icons.arrow_forward_ios_outlined,
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 30.h),
|
|
||||||
|
|
||||||
Divider(color: Colors.black.withOpacity(0.2)),
|
|
||||||
SizedBox(height: 30.h),
|
|
||||||
Text(
|
|
||||||
"What is included",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 24.sp,
|
|
||||||
fontWeight: FontWeight.w500,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 4.h),
|
|
||||||
|
|
||||||
Wrap(
|
|
||||||
runSpacing: 16.h,
|
|
||||||
spacing: 16.w,
|
|
||||||
children: [
|
|
||||||
includedBox(
|
|
||||||
"assets/icons/bus.png",
|
|
||||||
"Bus",
|
|
||||||
"Transportation",
|
|
||||||
),
|
|
||||||
includedBox(
|
|
||||||
"assets/icons/clock.png",
|
|
||||||
"2 day 1 night",
|
|
||||||
"Duration",
|
|
||||||
),
|
|
||||||
includedBox(
|
|
||||||
"assets/icons/bx_qr.png",
|
|
||||||
"TAC200812695",
|
|
||||||
"Product code",
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
SizedBox(height: 30.h),
|
|
||||||
|
|
||||||
Divider(color: Colors.black.withOpacity(0.2)),
|
|
||||||
SizedBox(height: 30.h),
|
|
||||||
Text(
|
|
||||||
"Exact Location",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 18.sp,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(height: 8.h),
|
|
||||||
|
|
||||||
CustomText(
|
|
||||||
text: "View the location on map",
|
|
||||||
size: 12.sp,
|
|
||||||
color: Colors.black.withOpacity(.6),
|
|
||||||
),
|
|
||||||
SizedBox(height: 17.h),
|
|
||||||
|
|
||||||
ClipRRect(
|
|
||||||
borderRadius: BorderRadius.circular(13.54.r),
|
|
||||||
child: Image.asset(
|
|
||||||
height: 178.7.h,
|
|
||||||
width: double.infinity,
|
|
||||||
"assets/images/attra_detail_map.png",
|
|
||||||
fit: BoxFit.cover,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 17.h),
|
|
||||||
|
|
||||||
CustomText(
|
|
||||||
text:
|
|
||||||
"Angkor Mails Hotel \nNR6, Krong Siem Reap Cambodia",
|
|
||||||
size: 12.sp,
|
|
||||||
color: Colors.black.withOpacity(0.6),
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 30.h),
|
|
||||||
|
|
||||||
Divider(color: Colors.black.withOpacity(0.2)),
|
|
||||||
SizedBox(height: 30.h),
|
|
||||||
Text(
|
|
||||||
"People frequently ask",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 18.sp,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 15.h),
|
|
||||||
|
|
||||||
faqBox(
|
|
||||||
"About this place",
|
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. A id diam nisl, non justo, in odio...",
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 15.h),
|
|
||||||
|
|
||||||
faqBox(
|
|
||||||
"Term and condition",
|
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. A id diam nisl, non justo, in odio...",
|
|
||||||
),
|
|
||||||
SizedBox(height: 15.h),
|
|
||||||
|
|
||||||
faqBox(
|
|
||||||
"Cancellation Policy",
|
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. A id diam nisl, non justo, in odio...",
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
SizedBox(height: 24.h),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget includedBox(String icon, String title, String disc) {
|
|
||||||
return Container(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.h),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Color(0xFFFFF5F5),
|
|
||||||
borderRadius: BorderRadius.circular(10.r),
|
|
||||||
border: Border.all(color: Color(0xFFFDCDCE)),
|
|
||||||
),
|
|
||||||
child: IntrinsicWidth(
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Image.asset(icon, scale: 4),
|
|
||||||
SizedBox(width: 16.w),
|
|
||||||
Column(
|
|
||||||
children: [
|
|
||||||
CustomText(
|
|
||||||
text: title,
|
|
||||||
size: 16.sp,
|
|
||||||
weight: FontWeight.w500,
|
|
||||||
color: Color(0xFF212121),
|
|
||||||
),
|
|
||||||
SizedBox(height: 4.h),
|
|
||||||
CustomText(
|
|
||||||
text: disc,
|
|
||||||
size: 11.sp,
|
|
||||||
weight: FontWeight.w400,
|
|
||||||
color: Color(0xFF666666),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget faqBox(String title, String desc) {
|
|
||||||
return Container(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 12.h),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Color(0xFFFFF5F5),
|
|
||||||
border: Border.all(color: Color(0xFFFDCDCE)),
|
|
||||||
borderRadius: BorderRadius.circular(10.r),
|
|
||||||
),
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
CustomText(
|
|
||||||
text: title,
|
|
||||||
size: 16.sp,
|
|
||||||
weight: FontWeight.w500,
|
|
||||||
color: Color(0xFF212121),
|
|
||||||
),
|
|
||||||
SizedBox(width: 20.w),
|
|
||||||
Icon(Icons.arrow_forward_ios_outlined, size: 18.sp),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
SizedBox(height: 9.h),
|
|
||||||
CustomText(text: desc, size: 11.sp, color: Color(0xFF7D7D7D)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
15
lib/attraction_details/bloc/attraction_details_bloc.dart
Normal file
15
lib/attraction_details/bloc/attraction_details_bloc.dart
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import 'package:citycards_customer/attraction_details/bloc/attraction_details_event.dart';
|
||||||
|
import 'package:citycards_customer/attraction_details/bloc/attraction_details_state.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
|
class AttractionDetailsBloc
|
||||||
|
extends Bloc<AttractionDetailsEvent, AttractionDetailsState> {
|
||||||
|
AttractionDetailsBloc() : super(AttractionDetailsState()) {
|
||||||
|
on<SetFlowFromPass>(_setFlowFromPass);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _setFlowFromPass(SetFlowFromPass event, Emitter<AttractionDetailsState> emit) {
|
||||||
|
print("Setting the flow from pass ${event.fromByPass}");
|
||||||
|
emit(state.copyWith(fromByPass: event.fromByPass));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
|
abstract class AttractionDetailsEvent {
|
||||||
|
}
|
||||||
|
|
||||||
|
class SetFlowFromPass extends AttractionDetailsEvent{
|
||||||
|
final bool fromByPass;
|
||||||
|
SetFlowFromPass(this.fromByPass);
|
||||||
|
}
|
||||||
14
lib/attraction_details/bloc/attraction_details_state.dart
Normal file
14
lib/attraction_details/bloc/attraction_details_state.dart
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
|
class AttractionDetailsState extends Equatable {
|
||||||
|
bool fromByPass;
|
||||||
|
|
||||||
|
AttractionDetailsState({this.fromByPass = false});
|
||||||
|
|
||||||
|
AttractionDetailsState copyWith({required bool fromByPass}) {
|
||||||
|
return AttractionDetailsState(fromByPass: fromByPass ?? this.fromByPass);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [fromByPass];
|
||||||
|
}
|
||||||
555
lib/attraction_details/view/attraction_details_view.dart
Normal file
555
lib/attraction_details/view/attraction_details_view.dart
Normal file
@@ -0,0 +1,555 @@
|
|||||||
|
import 'package:citycards_customer/attraction_details/bloc/attraction_details_bloc.dart';
|
||||||
|
import 'package:citycards_customer/attraction_details/bloc/attraction_details_state.dart';
|
||||||
|
import 'package:citycards_customer/attraction_details/view_model/attraction_details_view_model.dart';
|
||||||
|
import 'package:citycards_customer/attraction_details/widgets/share_bottomsheet.dart';
|
||||||
|
import 'package:citycards_customer/common_packages/app_bar.dart';
|
||||||
|
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 'package:share_plus/share_plus.dart';
|
||||||
|
import '../../core/route_constants.dart';
|
||||||
|
|
||||||
|
class AttractionDetailsView extends StatelessWidget {
|
||||||
|
AttractionDetailsView({super.key});
|
||||||
|
|
||||||
|
final AttractionDetailsViewModel viewModel = AttractionDetailsViewModel();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
body: SafeArea(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Stack(
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
'assets/images/koh_rong_samloem_banner.png',
|
||||||
|
height: 377.h,
|
||||||
|
width: double.infinity,
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
child: SafeArea(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 20.w,
|
||||||
|
vertical: 10.h,
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
CommonAppBar(
|
||||||
|
isWhiteLogo: true,
|
||||||
|
isProfilePage: false,
|
||||||
|
showDivider: true,
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 10.h),
|
||||||
|
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => Navigator.pop(context),
|
||||||
|
child: Icon(
|
||||||
|
Icons.arrow_back,
|
||||||
|
size: 24.sp,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 8.w),
|
||||||
|
Text(
|
||||||
|
"Koh Rong Samloem",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14.sp,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
Positioned(
|
||||||
|
bottom: 31.h,
|
||||||
|
left: 12.w,
|
||||||
|
child: Text(
|
||||||
|
"Koh Rong\nSamloem",
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontSize: 44.sp,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
height: 1.2,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
Positioned(
|
||||||
|
bottom: 31.h,
|
||||||
|
right: 17.w,
|
||||||
|
child: GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
Share.share(
|
||||||
|
'Check out my City Card app!',
|
||||||
|
subject: 'City Card App',
|
||||||
|
);
|
||||||
|
// showModalBottomSheet(
|
||||||
|
// context: context,
|
||||||
|
// isScrollControlled: true,
|
||||||
|
// backgroundColor: Colors.transparent,
|
||||||
|
// builder: (context) => const ShareBottomSheet(),
|
||||||
|
// );
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
height: 36.h,
|
||||||
|
width: 36.w,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(20.r),
|
||||||
|
),
|
||||||
|
child: Center(
|
||||||
|
child: Icon(
|
||||||
|
Icons.share_sharp,
|
||||||
|
color: Colors.black,
|
||||||
|
size: 18.sp,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
// About Section
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 30.h),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"About",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18.sp,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 12.32.h),
|
||||||
|
Text(
|
||||||
|
"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...",
|
||||||
|
style: TextStyle(
|
||||||
|
color: Color(0xFF262626),
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
fontSize: 14.sp,
|
||||||
|
height: 1.5,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 41.h),
|
||||||
|
// Booking Section
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 16.w),
|
||||||
|
child: BlocBuilder<AttractionDetailsBloc, AttractionDetailsState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
print("fajfasfasjfjas======= ${state.fromByPass}");
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
if (state.fromByPass)
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"How to make a booking?",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18.sp,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 16.h),
|
||||||
|
InkWell(
|
||||||
|
onTap: () => viewModel.makePhoneCall(
|
||||||
|
'+10123456789',
|
||||||
|
context,
|
||||||
|
),
|
||||||
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 12.w,
|
||||||
|
vertical: 12.h,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
|
border: Border.all(
|
||||||
|
color: Color(0xFFF95F62),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
Icons.call,
|
||||||
|
color: Color(0xFFF95F62),
|
||||||
|
size: 32.w,
|
||||||
|
),
|
||||||
|
SizedBox(width: 16.w),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
CustomText(
|
||||||
|
text: "Contact Number",
|
||||||
|
color: Colors.black.withOpacity(
|
||||||
|
.6,
|
||||||
|
),
|
||||||
|
size: 12.sp,
|
||||||
|
weight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
SizedBox(height: 6.h),
|
||||||
|
CustomText(
|
||||||
|
text: "+1012 3456 789",
|
||||||
|
color: Colors.black,
|
||||||
|
size: 14.sp,
|
||||||
|
weight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 6.h),
|
||||||
|
CustomText(
|
||||||
|
text: "Tap to call",
|
||||||
|
color: Colors.black.withOpacity(
|
||||||
|
.4,
|
||||||
|
),
|
||||||
|
size: 12.sp,
|
||||||
|
weight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 16.h),
|
||||||
|
InkWell(
|
||||||
|
onTap: () => viewModel.sendEmail(
|
||||||
|
'CityCards24@gmail.com',
|
||||||
|
context,
|
||||||
|
),
|
||||||
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 12.w,
|
||||||
|
vertical: 12.h,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
|
border: Border.all(
|
||||||
|
color: Color(0xFFF95F62),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
Icons.email_sharp,
|
||||||
|
color: Color(0xFFF95F62),
|
||||||
|
size: 32.w,
|
||||||
|
),
|
||||||
|
SizedBox(width: 16.w),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
CustomText(
|
||||||
|
text: "Email",
|
||||||
|
color: Colors.black.withOpacity(
|
||||||
|
.6,
|
||||||
|
),
|
||||||
|
size: 12.sp,
|
||||||
|
weight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
SizedBox(height: 6.h),
|
||||||
|
CustomText(
|
||||||
|
text: "CityCards24@gmail.com",
|
||||||
|
color: Colors.black,
|
||||||
|
size: 14.sp,
|
||||||
|
weight: FontWeight.w600,
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 6.h),
|
||||||
|
CustomText(
|
||||||
|
text: "Tap to email",
|
||||||
|
color: Colors.black.withOpacity(
|
||||||
|
.4,
|
||||||
|
),
|
||||||
|
size: 12.sp,
|
||||||
|
weight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 16.h),
|
||||||
|
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
Navigator.of(
|
||||||
|
context,
|
||||||
|
).pushNamed(RouteConstants.makeBooking);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 24.w,
|
||||||
|
vertical: 18.h,
|
||||||
|
),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Color(0xFFF95F62),
|
||||||
|
borderRadius: BorderRadius.circular(10.r),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
CustomText(
|
||||||
|
text: "Via CityCards",
|
||||||
|
size: 16.sp,
|
||||||
|
weight: FontWeight.w500,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
SizedBox(height: 8.h),
|
||||||
|
CustomText(
|
||||||
|
text:
|
||||||
|
"Create a booking via app",
|
||||||
|
size: 11.sp,
|
||||||
|
weight: FontWeight.w400,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
Icon(
|
||||||
|
Icons.arrow_forward_ios_outlined,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 30.h),
|
||||||
|
|
||||||
|
Divider(color: Colors.black.withOpacity(0.2)),
|
||||||
|
SizedBox(height: 30.h),
|
||||||
|
Text(
|
||||||
|
"What is included",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 24.sp,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 4.h),
|
||||||
|
|
||||||
|
Wrap(
|
||||||
|
runSpacing: 16.h,
|
||||||
|
spacing: 16.w,
|
||||||
|
children: [
|
||||||
|
includedBox(
|
||||||
|
"assets/icons/bus.png",
|
||||||
|
"Bus",
|
||||||
|
"Transportation",
|
||||||
|
),
|
||||||
|
includedBox(
|
||||||
|
"assets/icons/clock.png",
|
||||||
|
"2 day 1 night",
|
||||||
|
"Duration",
|
||||||
|
),
|
||||||
|
includedBox(
|
||||||
|
"assets/icons/bx_qr.png",
|
||||||
|
"TAC200812695",
|
||||||
|
"Product code",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 30.h),
|
||||||
|
|
||||||
|
Divider(color: Colors.black.withOpacity(0.2)),
|
||||||
|
SizedBox(height: 30.h),
|
||||||
|
Text(
|
||||||
|
"Exact Location",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18.sp,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 8.h),
|
||||||
|
|
||||||
|
CustomText(
|
||||||
|
text: "View the location on map",
|
||||||
|
size: 12.sp,
|
||||||
|
color: Colors.black.withOpacity(.6),
|
||||||
|
),
|
||||||
|
SizedBox(height: 17.h),
|
||||||
|
|
||||||
|
ClipRRect(
|
||||||
|
borderRadius: BorderRadius.circular(13.54.r),
|
||||||
|
child: Image.asset(
|
||||||
|
height: 178.7.h,
|
||||||
|
width: double.infinity,
|
||||||
|
"assets/images/attra_detail_map.png",
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 17.h),
|
||||||
|
|
||||||
|
CustomText(
|
||||||
|
text:
|
||||||
|
"Angkor Mails Hotel \nNR6, Krong Siem Reap Cambodia",
|
||||||
|
size: 12.sp,
|
||||||
|
color: Colors.black.withOpacity(0.6),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 30.h),
|
||||||
|
|
||||||
|
Divider(color: Colors.black.withOpacity(0.2)),
|
||||||
|
SizedBox(height: 30.h),
|
||||||
|
Text(
|
||||||
|
"People frequently ask",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18.sp,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 15.h),
|
||||||
|
|
||||||
|
faqBox(
|
||||||
|
"About this place",
|
||||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. A id diam nisl, non justo, in odio...",
|
||||||
|
() {},
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 15.h),
|
||||||
|
|
||||||
|
faqBox(
|
||||||
|
"Term and condition",
|
||||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. A id diam nisl, non justo, in odio...",
|
||||||
|
() {
|
||||||
|
Navigator.pushNamed(
|
||||||
|
context,
|
||||||
|
RouteConstants.termsAndCondition,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
SizedBox(height: 15.h),
|
||||||
|
|
||||||
|
faqBox(
|
||||||
|
"Cancellation Policy",
|
||||||
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. A id diam nisl, non justo, in odio...",
|
||||||
|
() {},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 24.h),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget includedBox(String icon, String title, String disc) {
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.h),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Color(0xFFFFF5F5),
|
||||||
|
borderRadius: BorderRadius.circular(10.r),
|
||||||
|
border: Border.all(color: Color(0xFFFDCDCE)),
|
||||||
|
),
|
||||||
|
child: IntrinsicWidth(
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Image.asset(icon, scale: 4),
|
||||||
|
SizedBox(width: 16.w),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
CustomText(
|
||||||
|
text: title,
|
||||||
|
size: 16.sp,
|
||||||
|
weight: FontWeight.w500,
|
||||||
|
color: Color(0xFF212121),
|
||||||
|
),
|
||||||
|
SizedBox(height: 4.h),
|
||||||
|
CustomText(
|
||||||
|
text: disc,
|
||||||
|
size: 11.sp,
|
||||||
|
weight: FontWeight.w400,
|
||||||
|
color: Color(0xFF666666),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget faqBox(String title, String desc, Function() onTap) {
|
||||||
|
return GestureDetector(
|
||||||
|
onTap: onTap,
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 12.h),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Color(0xFFFFF5F5),
|
||||||
|
border: Border.all(color: Color(0xFFFDCDCE)),
|
||||||
|
borderRadius: BorderRadius.circular(10.r),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
CustomText(
|
||||||
|
text: title,
|
||||||
|
size: 16.sp,
|
||||||
|
weight: FontWeight.w500,
|
||||||
|
color: Color(0xFF212121),
|
||||||
|
),
|
||||||
|
SizedBox(width: 20.w),
|
||||||
|
Icon(Icons.arrow_forward_ios_outlined, size: 18.sp),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
SizedBox(height: 9.h),
|
||||||
|
CustomText(text: desc, size: 11.sp, color: Color(0xFF7D7D7D)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class AttractionDetailsViewModel {
|
||||||
|
// 📞 Call method
|
||||||
|
Future<void> makePhoneCall(String phoneNumber, BuildContext context) async {
|
||||||
|
final Uri url = Uri(scheme: 'tel', path: phoneNumber);
|
||||||
|
if (await canLaunchUrl(url)) {
|
||||||
|
await launchUrl(url);
|
||||||
|
} else {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(content: Text('Could not launch $phoneNumber')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 📧 Email method
|
||||||
|
Future<void> sendEmail(String emailAddress, BuildContext context) async {
|
||||||
|
final Uri url = Uri(
|
||||||
|
scheme: 'mailto',
|
||||||
|
path: emailAddress,
|
||||||
|
query: 'subject=Hello City Cards&body=Hi there,',
|
||||||
|
);
|
||||||
|
|
||||||
|
if (await canLaunchUrl(url)) {
|
||||||
|
await launchUrl(url);
|
||||||
|
} else {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(content: Text('Could not launch mail app')),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
|
import 'package:citycards_customer/attraction_details/bloc/attraction_details_bloc.dart';
|
||||||
import 'package:citycards_customer/common_packages/app_bar.dart';
|
import 'package:citycards_customer/common_packages/app_bar.dart';
|
||||||
import 'package:citycards_customer/common_packages/back_widget.dart';
|
import 'package:citycards_customer/common_packages/back_widget.dart';
|
||||||
|
import 'package:citycards_customer/core/route_constants.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import '../../attraction_details/bloc/attraction_details_event.dart';
|
||||||
import '../../common_packages/custom_search_field.dart';
|
import '../../common_packages/custom_search_field.dart';
|
||||||
import '../blocs/attractions_bloc.dart';
|
import '../blocs/attractions_bloc.dart';
|
||||||
import '../repository/attractions_repository.dart';
|
import '../repository/attractions_repository.dart';
|
||||||
@@ -15,19 +18,27 @@ class AttractionsPage extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BlocProvider(
|
return MultiBlocProvider(
|
||||||
|
providers: [
|
||||||
|
BlocProvider(
|
||||||
create: (_) {
|
create: (_) {
|
||||||
final bloc = AttractionsBloc(AttractionsRepository());
|
final bloc = AttractionsBloc(AttractionsRepository());
|
||||||
|
|
||||||
// 🔥 Trigger event based on source
|
// 🔥 Trigger event based on source
|
||||||
if (source == "home") {
|
if (source == "home") {
|
||||||
bloc.add(LoadAttractions());
|
bloc.add(LoadAttractions());
|
||||||
} else if (source == "qrPass") {
|
} else {
|
||||||
|
print("QR Passss -=------------------");
|
||||||
|
context.read<AttractionDetailsBloc>().add(SetFlowFromPass(true));
|
||||||
bloc.add(LoadMyPassAttraction());
|
bloc.add(LoadMyPassAttraction());
|
||||||
}
|
}
|
||||||
|
|
||||||
return bloc;
|
return bloc;
|
||||||
},
|
},
|
||||||
|
),
|
||||||
|
BlocProvider(create: (_) => AttractionDetailsBloc(),
|
||||||
|
|
||||||
|
)
|
||||||
|
],
|
||||||
child: BlocBuilder<AttractionsBloc, AttractionsState>(
|
child: BlocBuilder<AttractionsBloc, AttractionsState>(
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
final bloc = context.read<AttractionsBloc>();
|
final bloc = context.read<AttractionsBloc>();
|
||||||
|
|||||||
@@ -11,7 +11,12 @@ class AttractionCard extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return InkWell(
|
return InkWell(
|
||||||
onTap: (){
|
onTap: (){
|
||||||
Navigator.of(context).pushNamed(RouteConstants.attractionDetails);
|
print("the value of from page this pushed ${ModalRoute.of(context)?.settings.arguments}");
|
||||||
|
Navigator.pushNamed(
|
||||||
|
context,
|
||||||
|
RouteConstants.attractionDetails,
|
||||||
|
arguments: ModalRoute.of(context)?.settings.arguments, // FORWARD
|
||||||
|
);
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
|
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ class PassCardView extends StatelessWidget {
|
|||||||
border: Border.all(color:( themeColor ?? Color(0xFFF95FAF)).withOpacity(0.24)),
|
border: Border.all(color:( themeColor ?? Color(0xFFF95FAF)).withOpacity(0.24)),
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
),
|
),
|
||||||
child: Expanded(
|
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
@@ -159,7 +158,6 @@ class PassCardView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
63
lib/checkout/bloc/email_verify_bloc.dart
Normal file
63
lib/checkout/bloc/email_verify_bloc.dart
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
|
/// EVENTS
|
||||||
|
abstract class EmailVerify {}
|
||||||
|
|
||||||
|
class SetEmailEvent extends EmailVerify {
|
||||||
|
final String email;
|
||||||
|
SetEmailEvent(this.email);
|
||||||
|
}
|
||||||
|
|
||||||
|
class CheckOtpFilled extends EmailVerify {
|
||||||
|
final bool isOtpFilled;
|
||||||
|
CheckOtpFilled(this.isOtpFilled);
|
||||||
|
}
|
||||||
|
|
||||||
|
class CheckIsLoggedIn extends EmailVerify{}
|
||||||
|
|
||||||
|
/// STATE
|
||||||
|
class EmailVerifyState {
|
||||||
|
final String email;
|
||||||
|
final bool isOtpFilled;
|
||||||
|
final bool loggedIn;
|
||||||
|
|
||||||
|
EmailVerifyState({
|
||||||
|
required this.email,
|
||||||
|
required this.isOtpFilled,
|
||||||
|
required this.loggedIn
|
||||||
|
});
|
||||||
|
|
||||||
|
EmailVerifyState copyWith({
|
||||||
|
String? email,
|
||||||
|
bool? isOtpFilled,
|
||||||
|
bool? loggedIn
|
||||||
|
}) {
|
||||||
|
return EmailVerifyState(
|
||||||
|
email: email ?? this.email,
|
||||||
|
isOtpFilled: isOtpFilled ?? this.isOtpFilled,
|
||||||
|
loggedIn: loggedIn ?? this.loggedIn
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// BLOC
|
||||||
|
class EmailVerifyBloc extends Bloc<EmailVerify, EmailVerifyState> {
|
||||||
|
EmailVerifyBloc()
|
||||||
|
: super(EmailVerifyState(email: "", isOtpFilled: false,
|
||||||
|
loggedIn: false
|
||||||
|
)) {
|
||||||
|
|
||||||
|
on<SetEmailEvent>((event, emit) {
|
||||||
|
emit(state.copyWith(email: event.email));
|
||||||
|
});
|
||||||
|
|
||||||
|
on<CheckOtpFilled>((event, emit) {
|
||||||
|
emit(state.copyWith(isOtpFilled: event.isOtpFilled));
|
||||||
|
});
|
||||||
|
|
||||||
|
on<CheckIsLoggedIn>((event,emit){
|
||||||
|
emit(state.copyWith(loggedIn: true));
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
15
lib/checkout/repository/auth_local_repository.dart
Normal file
15
lib/checkout/repository/auth_local_repository.dart
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
class LocalAuth {
|
||||||
|
Future<void> setloggedIn(bool islogged)async{
|
||||||
|
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||||
|
prefs.setBool('islogged', islogged);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<bool> getloggedIn()async{
|
||||||
|
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||||
|
return prefs.getBool('islogged') ?? false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import 'package:citycards_customer/checkout/bloc/email_verify_bloc.dart';
|
||||||
|
import 'package:citycards_customer/checkout/repository/auth_local_repository.dart';
|
||||||
import 'package:citycards_customer/checkout/widget/all_coupons_bottomsheet.dart';
|
import 'package:citycards_customer/checkout/widget/all_coupons_bottomsheet.dart';
|
||||||
import 'package:citycards_customer/checkout/widget/login_email_bottomsheet.dart';
|
import 'package:citycards_customer/checkout/widget/login_email_bottomsheet.dart';
|
||||||
import 'package:citycards_customer/common_packages/app_bar.dart';
|
import 'package:citycards_customer/common_packages/app_bar.dart';
|
||||||
@@ -5,6 +7,7 @@ import 'package:citycards_customer/common_packages/custom_filled_button.dart';
|
|||||||
import 'package:citycards_customer/common_packages/custom_text.dart';
|
import 'package:citycards_customer/common_packages/custom_text.dart';
|
||||||
import 'package:citycards_customer/common_packages/custom_dashed_line.dart';
|
import 'package:citycards_customer/common_packages/custom_dashed_line.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
class CheckoutView extends StatelessWidget {
|
class CheckoutView extends StatelessWidget {
|
||||||
@@ -12,7 +15,9 @@ class CheckoutView extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return BlocProvider(
|
||||||
|
create: (context) => EmailVerifyBloc(),
|
||||||
|
child: Scaffold(
|
||||||
resizeToAvoidBottomInset: true,
|
resizeToAvoidBottomInset: true,
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
@@ -43,7 +48,9 @@ class CheckoutView extends StatelessWidget {
|
|||||||
Container(
|
Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
border: Border.all(color: Color(0xFFF95FAF).withOpacity(0.2)),
|
border: Border.all(
|
||||||
|
color: Color(0xFFF95FAF).withOpacity(0.2),
|
||||||
|
),
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
),
|
),
|
||||||
child: Expanded(
|
child: Expanded(
|
||||||
@@ -140,7 +147,10 @@ class CheckoutView extends StatelessWidget {
|
|||||||
SizedBox(height: 5.h),
|
SizedBox(height: 5.h),
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Image.asset("assets/icons/kid.png", scale: 4),
|
Image.asset(
|
||||||
|
"assets/icons/kid.png",
|
||||||
|
scale: 4,
|
||||||
|
),
|
||||||
SizedBox(width: 4.w),
|
SizedBox(width: 4.w),
|
||||||
CustomText(
|
CustomText(
|
||||||
text: "3 Kids",
|
text: "3 Kids",
|
||||||
@@ -206,7 +216,10 @@ class CheckoutView extends StatelessWidget {
|
|||||||
|
|
||||||
SizedBox(height: 15.h),
|
SizedBox(height: 15.h),
|
||||||
Container(
|
Container(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 12.h),
|
padding: EdgeInsets.symmetric(
|
||||||
|
horizontal: 12.w,
|
||||||
|
vertical: 12.h,
|
||||||
|
),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Color(0xFFFFF5F5),
|
color: Color(0xFFFFF5F5),
|
||||||
borderRadius: BorderRadius.circular(8.r),
|
borderRadius: BorderRadius.circular(8.r),
|
||||||
@@ -343,8 +356,15 @@ class CheckoutView extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
CustomFilledButton(
|
FutureBuilder(
|
||||||
onTap: () {
|
future: LocalAuth().getloggedIn(),
|
||||||
|
builder: (context, snap) {
|
||||||
|
final isLoggedIn = snap.data ?? false;
|
||||||
|
return BlocBuilder<EmailVerifyBloc, EmailVerifyState>(
|
||||||
|
builder: (context, state){
|
||||||
|
return CustomFilledButton(
|
||||||
|
onTap: () async {
|
||||||
|
final rootContext = context;
|
||||||
showModalBottomSheet(
|
showModalBottomSheet(
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
context: context,
|
context: context,
|
||||||
@@ -354,17 +374,27 @@ class CheckoutView extends StatelessWidget {
|
|||||||
top: Radius.circular(12.r),
|
top: Radius.circular(12.r),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
builder: (_) => const LoginEmailBottomsheet(),
|
builder: (_) => BlocProvider(
|
||||||
|
create: (rootContext) => EmailVerifyBloc(),
|
||||||
|
child: LoginEmailBottomsheet(
|
||||||
|
rootContext: rootContext,
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
label: "Login to Checkout",
|
label: isLoggedIn || state.loggedIn ? "Proceed to Checkouts" :"Login to Checkout",
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
SizedBox(height: 25.h),
|
SizedBox(height: 25.h),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,35 @@
|
|||||||
|
import 'package:citycards_customer/checkout/bloc/email_verify_bloc.dart';
|
||||||
import 'package:citycards_customer/checkout/widget/verify_otp_bottomsheet.dart';
|
import 'package:citycards_customer/checkout/widget/verify_otp_bottomsheet.dart';
|
||||||
import 'package:citycards_customer/common_packages/custom_filled_button.dart';
|
import 'package:citycards_customer/common_packages/custom_filled_button.dart';
|
||||||
import 'package:citycards_customer/common_packages/custom_text.dart';
|
import 'package:citycards_customer/common_packages/custom_text.dart';
|
||||||
import 'package:citycards_customer/core/route_constants.dart';
|
import 'package:citycards_customer/core/route_constants.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
class LoginEmailBottomsheet extends StatelessWidget {
|
class LoginEmailBottomsheet extends StatefulWidget {
|
||||||
const LoginEmailBottomsheet({super.key});
|
final BuildContext rootContext;
|
||||||
|
LoginEmailBottomsheet({super.key, required this.rootContext});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<LoginEmailBottomsheet> createState() => _LoginEmailBottomsheetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LoginEmailBottomsheetState extends State<LoginEmailBottomsheet> {
|
||||||
|
TextEditingController emailController = TextEditingController();
|
||||||
|
String? emailError;
|
||||||
|
|
||||||
|
bool emailValidate() {
|
||||||
|
final emailRegex = RegExp(r'^[\w\.-]+@[\w\.-]+\.\w+$');
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
emailError = !emailRegex.hasMatch(emailController.text.trim())
|
||||||
|
? "Invalid email format"
|
||||||
|
: null;
|
||||||
|
});
|
||||||
|
|
||||||
|
return emailError == null;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -25,7 +48,11 @@ class LoginEmailBottomsheet extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
Image.asset("assets/logo/logo_city_cards_orange.png", scale: 4),
|
Image.asset("assets/logo/logo_city_cards_orange.png", scale: 4),
|
||||||
SizedBox(height: 8.h),
|
SizedBox(height: 8.h),
|
||||||
CustomText(text: "Get Started", size: 18.sp, weight: FontWeight.w500),
|
CustomText(
|
||||||
|
text: "Get Started",
|
||||||
|
size: 18.sp,
|
||||||
|
weight: FontWeight.w500,
|
||||||
|
),
|
||||||
SizedBox(height: 42.h),
|
SizedBox(height: 42.h),
|
||||||
CustomText(
|
CustomText(
|
||||||
text: "Enter your email to begin your CityCards journey",
|
text: "Enter your email to begin your CityCards journey",
|
||||||
@@ -35,19 +62,49 @@ class LoginEmailBottomsheet extends StatelessWidget {
|
|||||||
SizedBox(height: 12.h),
|
SizedBox(height: 12.h),
|
||||||
|
|
||||||
TextField(
|
TextField(
|
||||||
|
controller: emailController,
|
||||||
|
onChanged: (val) {
|
||||||
|
final bloc = context.read<EmailVerifyBloc>();
|
||||||
|
setState(() => emailValidate());
|
||||||
|
bloc.add(SetEmailEvent(val));
|
||||||
|
},
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
|
errorText: emailError,
|
||||||
filled: true,
|
filled: true,
|
||||||
contentPadding: EdgeInsets.symmetric(vertical: 6.h),
|
contentPadding: EdgeInsets.symmetric(vertical: 6.h),
|
||||||
fillColor: const Color(0xFFFFF5F5),
|
fillColor: const Color(0xFFFFF5F5),
|
||||||
enabledBorder: OutlineInputBorder(
|
enabledBorder: OutlineInputBorder(
|
||||||
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
|
borderSide: BorderSide(
|
||||||
|
color: const Color(0xFFBB474A),
|
||||||
|
width: 0.4.w,
|
||||||
|
),
|
||||||
|
borderRadius: BorderRadius.circular(8.sp),
|
||||||
|
),
|
||||||
|
errorBorder: OutlineInputBorder(
|
||||||
|
borderSide: BorderSide(
|
||||||
|
color: const Color(0xFFBB474A),
|
||||||
|
width: 0.4.w,
|
||||||
|
),
|
||||||
|
borderRadius: BorderRadius.circular(8.sp),
|
||||||
|
),
|
||||||
|
focusedErrorBorder: OutlineInputBorder(
|
||||||
|
borderSide: BorderSide(
|
||||||
|
color: const Color(0xFFBB474A),
|
||||||
|
width: 0.4.w,
|
||||||
|
),
|
||||||
borderRadius: BorderRadius.circular(8.sp),
|
borderRadius: BorderRadius.circular(8.sp),
|
||||||
),
|
),
|
||||||
focusedBorder: OutlineInputBorder(
|
focusedBorder: OutlineInputBorder(
|
||||||
borderSide: BorderSide(color: const Color(0xFFBB474A), width: 0.4.w),
|
borderSide: BorderSide(
|
||||||
|
color: const Color(0xFFBB474A),
|
||||||
|
width: 0.4.w,
|
||||||
|
),
|
||||||
borderRadius: BorderRadius.circular(8.sp),
|
borderRadius: BorderRadius.circular(8.sp),
|
||||||
),
|
),
|
||||||
prefixIcon: const Icon(Icons.email_outlined, color: Color(0xFFF95F62)),
|
prefixIcon: const Icon(
|
||||||
|
Icons.email_outlined,
|
||||||
|
color: Color(0xFFF95F62),
|
||||||
|
),
|
||||||
hintText: "john.doe@gmail.com",
|
hintText: "john.doe@gmail.com",
|
||||||
hintStyle: TextStyle(
|
hintStyle: TextStyle(
|
||||||
color: const Color(0xFF000000).withOpacity(0.6),
|
color: const Color(0xFF000000).withOpacity(0.6),
|
||||||
@@ -59,6 +116,7 @@ class LoginEmailBottomsheet extends StatelessWidget {
|
|||||||
SizedBox(height: 38.h),
|
SizedBox(height: 38.h),
|
||||||
CustomFilledButton(
|
CustomFilledButton(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
if (emailValidate()) {
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
showModalBottomSheet(
|
showModalBottomSheet(
|
||||||
context: context,
|
context: context,
|
||||||
@@ -69,8 +127,12 @@ class LoginEmailBottomsheet extends StatelessWidget {
|
|||||||
top: Radius.circular(12.r),
|
top: Radius.circular(12.r),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
builder: (_) => VerifyOtpBottomsheet(),
|
builder: (_) => BlocProvider(
|
||||||
|
create: (rootcontext) => EmailVerifyBloc(),
|
||||||
|
child: VerifyOtpBottomsheet(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
label: "Continue",
|
label: "Continue",
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
@@ -78,7 +140,7 @@ class LoginEmailBottomsheet extends StatelessWidget {
|
|||||||
|
|
||||||
SizedBox(height: 20.h),
|
SizedBox(height: 20.h),
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: (){
|
onTap: () {
|
||||||
Navigator.of(context).pushNamed(RouteConstants.createAcct);
|
Navigator.of(context).pushNamed(RouteConstants.createAcct);
|
||||||
},
|
},
|
||||||
child: Text.rich(
|
child: Text.rich(
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
|
import 'package:citycards_customer/checkout/bloc/email_verify_bloc.dart';
|
||||||
|
import 'package:citycards_customer/checkout/repository/auth_local_repository.dart';
|
||||||
import 'package:citycards_customer/common_packages/custom_filled_button.dart';
|
import 'package:citycards_customer/common_packages/custom_filled_button.dart';
|
||||||
import 'package:citycards_customer/common_packages/custom_text.dart';
|
import 'package:citycards_customer/common_packages/custom_text.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_otp_text_field/flutter_otp_text_field.dart';
|
import 'package:flutter_otp_text_field/flutter_otp_text_field.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
@@ -25,25 +28,32 @@ class VerifyOtpBottomsheet extends StatelessWidget {
|
|||||||
mainAxisSize: MainAxisSize.min, // shrink to fit content
|
mainAxisSize: MainAxisSize.min, // shrink to fit content
|
||||||
children: [
|
children: [
|
||||||
Image.asset("assets/logo/logo_city_cards_orange.png", scale: 4),
|
Image.asset("assets/logo/logo_city_cards_orange.png", scale: 4),
|
||||||
|
|
||||||
SizedBox(height: 8.h),
|
SizedBox(height: 8.h),
|
||||||
|
|
||||||
CustomText(
|
CustomText(
|
||||||
text: "Verify your phone",
|
text: "Verify your phone",
|
||||||
size: 18.sp,
|
size: 18.sp,
|
||||||
weight: FontWeight.w500,
|
weight: FontWeight.w500,
|
||||||
),
|
),
|
||||||
|
|
||||||
SizedBox(height: 42.h),
|
SizedBox(height: 42.h),
|
||||||
Text.rich(
|
|
||||||
|
BlocBuilder<EmailVerifyBloc, EmailVerifyState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
return Text.rich(
|
||||||
TextSpan(
|
TextSpan(
|
||||||
children: [
|
children: [
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: "Enter the verification code sent to your email id",
|
text:
|
||||||
|
"Enter the verification code sent to your email id: ",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 14.sp,
|
fontSize: 14.sp,
|
||||||
color: Colors.black.withOpacity(0.6),
|
color: Colors.black.withOpacity(0.6),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextSpan(
|
TextSpan(
|
||||||
text: " frank7824@mail.com",
|
text: " ${state.email}",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 14.sp,
|
fontSize: 14.sp,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
@@ -52,10 +62,16 @@ class VerifyOtpBottomsheet extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
|
|
||||||
SizedBox(height: 15.h),
|
SizedBox(height: 15.h),
|
||||||
|
|
||||||
OtpTextField(
|
BlocBuilder<EmailVerifyBloc, EmailVerifyState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
final bloc = (context).read<EmailVerifyBloc>();
|
||||||
|
return OtpTextField(
|
||||||
numberOfFields: 6,
|
numberOfFields: 6,
|
||||||
borderWidth: 0.4.w,
|
borderWidth: 0.4.w,
|
||||||
fieldWidth: 48.w,
|
fieldWidth: 48.w,
|
||||||
@@ -72,17 +88,28 @@ class VerifyOtpBottomsheet extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
onCodeChanged: (code) {},
|
onCodeChanged: (code) {},
|
||||||
onSubmit: (code) {
|
onSubmit: (code) {
|
||||||
|
bloc.add(CheckOtpFilled(true));
|
||||||
debugPrint("OTP entered: $code");
|
debugPrint("OTP entered: $code");
|
||||||
},
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
|
|
||||||
SizedBox(height: 42.h),
|
SizedBox(height: 42.h),
|
||||||
CustomFilledButton(
|
BlocBuilder<EmailVerifyBloc, EmailVerifyState>(
|
||||||
onTap: () {
|
builder: (context, state) {
|
||||||
|
return CustomFilledButton(
|
||||||
|
onTap: () async {
|
||||||
|
if (state.isOtpFilled) {
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
|
await LocalAuth().setloggedIn(true);
|
||||||
|
context.read<EmailVerifyBloc>().add(CheckIsLoggedIn());
|
||||||
|
}
|
||||||
},
|
},
|
||||||
label: "Continue",
|
label: "Continue",
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
|
);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
|
|
||||||
SizedBox(height: 20.h),
|
SizedBox(height: 20.h),
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'package:citycards_customer/Profile/profile_page_view.dart';
|
import 'package:citycards_customer/Profile/profile_page_view.dart';
|
||||||
import 'package:citycards_customer/add_details/add_details_view.dart';
|
import 'package:citycards_customer/add_details/add_details_view.dart';
|
||||||
import 'package:citycards_customer/attraction_details/attraction_details_view.dart';
|
import 'package:citycards_customer/attraction_details/view/attraction_details_view.dart';
|
||||||
import 'package:citycards_customer/buy_a_pass/view/buy_pass_view.dart';
|
import 'package:citycards_customer/buy_a_pass/view/buy_pass_view.dart';
|
||||||
import 'package:citycards_customer/checkout/view/checkout_view.dart';
|
import 'package:citycards_customer/checkout/view/checkout_view.dart';
|
||||||
import 'package:citycards_customer/common_bloc/language_selection_bloc.dart';
|
import 'package:citycards_customer/common_bloc/language_selection_bloc.dart';
|
||||||
@@ -18,6 +18,7 @@ import 'package:citycards_customer/itinerary_creation/views/itinerary_creation_v
|
|||||||
import 'package:citycards_customer/itinerary_creation/views/magic_itinerary_empty_view.dart';
|
import 'package:citycards_customer/itinerary_creation/views/magic_itinerary_empty_view.dart';
|
||||||
import 'package:citycards_customer/itinerary_creation/views/magic_itinerary_filled_view.dart';
|
import 'package:citycards_customer/itinerary_creation/views/magic_itinerary_filled_view.dart';
|
||||||
import 'package:citycards_customer/offer_pass_detail/offer_pass_detail_view.dart';
|
import 'package:citycards_customer/offer_pass_detail/offer_pass_detail_view.dart';
|
||||||
|
import 'package:citycards_customer/postcard/views/postcard_creation_page_view.dart';
|
||||||
import 'package:citycards_customer/privacy/privacy_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/bloc/search_offers_listing_bloc.dart';
|
||||||
import 'package:citycards_customer/search_offers/view/search_offers_with_listing.dart';
|
import 'package:citycards_customer/search_offers/view/search_offers_with_listing.dart';
|
||||||
@@ -231,6 +232,12 @@ class AppRouter {
|
|||||||
return RegisteredUserHomePage();
|
return RegisteredUserHomePage();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
case RouteConstants.postCardCreationPage:
|
||||||
|
return MaterialPageRoute(builder: (_){
|
||||||
|
return PostcardCreationPage();
|
||||||
|
});
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
builder: (_) =>
|
builder: (_) =>
|
||||||
|
|||||||
@@ -5,11 +5,12 @@ import 'package:citycards_customer/postcard/views/add_filter_step_page_view.dart
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
|
||||||
import '../attraction_details/attraction_details_view.dart';
|
import '../attraction_details/view/attraction_details_view.dart';
|
||||||
import '../attractions/views/attractions_page_view.dart';
|
import '../attractions/views/attractions_page_view.dart';
|
||||||
import '../buy_a_pass/view/buy_pass_view.dart';
|
import '../buy_a_pass/view/buy_pass_view.dart';
|
||||||
import '../checkout/view/checkout_view.dart';
|
import '../checkout/view/checkout_view.dart';
|
||||||
import '../create_account/create_account_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_detail_bloc.dart';
|
||||||
import '../itinerary_creation/bloc/itinerary_steps_selection_bloc.dart';
|
import '../itinerary_creation/bloc/itinerary_steps_selection_bloc.dart';
|
||||||
import '../itinerary_creation/views/itinerary_creation_view.dart';
|
import '../itinerary_creation/views/itinerary_creation_view.dart';
|
||||||
@@ -39,7 +40,12 @@ Widget buildOffstageNavigator(
|
|||||||
case '/':
|
case '/':
|
||||||
return MaterialPageRoute(builder: (_) => child);
|
return MaterialPageRoute(builder: (_) => child);
|
||||||
|
|
||||||
// 🔹 Attractions Page
|
case RouteConstants.intro:
|
||||||
|
return MaterialPageRoute(builder: (_){
|
||||||
|
return IntroScreensView();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 🔹 Attractions PageF
|
||||||
case RouteConstants.attractionsPage:
|
case RouteConstants.attractionsPage:
|
||||||
final args = settings.arguments as String;
|
final args = settings.arguments as String;
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
@@ -87,7 +93,7 @@ Widget buildOffstageNavigator(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// 🔹 Upload Photo Page (start of postcard creation flow)
|
// 🔹 Upload Photo Page (start of postcard creation flow)
|
||||||
case RouteConstants.uploadPhotoPage:
|
case RouteConstants.postCardCreationPage:
|
||||||
return MaterialPageRoute(
|
return MaterialPageRoute(
|
||||||
builder: (_) => BlocProvider(
|
builder: (_) => BlocProvider(
|
||||||
create: (_) => PostcardCreationBloc(),
|
create: (_) => PostcardCreationBloc(),
|
||||||
|
|||||||
@@ -56,4 +56,5 @@ class RouteConstants {
|
|||||||
static const String qrPage = '/qrPage';
|
static const String qrPage = '/qrPage';
|
||||||
static const String makeBooking = '/makeBooking';
|
static const String makeBooking = '/makeBooking';
|
||||||
static const String bookingSuccessful = '/bookingSuccessful';
|
static const String bookingSuccessful = '/bookingSuccessful';
|
||||||
|
static const String postCardCreationPage = '/postCardCreationPage';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
import 'package:citycards_customer/home/widgets/e_sim_offer_section.dart';
|
import 'package:citycards_customer/home/widgets/e_sim_offer_section.dart';
|
||||||
import 'package:citycards_customer/home/widgets/hotel_offers_section.dart';
|
import 'package:citycards_customer/home/widgets/hotel_offers_section.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
|
|
||||||
|
import '../../common_bloc/bottom_navigation_bloc.dart';
|
||||||
import '../../common_packages/app_bar.dart';
|
import '../../common_packages/app_bar.dart';
|
||||||
import '../../core/route_constants.dart';
|
import '../../core/route_constants.dart';
|
||||||
import '../widgets/attractions_list.dart';
|
import '../widgets/attractions_list.dart';
|
||||||
import '../widgets/get_your_pass_card.dart';
|
import '../widgets/get_your_pass_card.dart';
|
||||||
import '../widgets/gradient_container_bg.dart';
|
import '../widgets/gradient_container_bg.dart';
|
||||||
import '../widgets/journey_cards_listview.dart';
|
import '../widgets/itineary_animation.dart';
|
||||||
import '../widgets/pass_card_list.dart';
|
import '../widgets/pass_card_list.dart';
|
||||||
|
|
||||||
class RegisteredUserHomePage extends StatefulWidget {
|
class RegisteredUserHomePage extends StatefulWidget {
|
||||||
@@ -51,7 +53,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Image.asset(
|
||||||
"assets/images/chicago.png",
|
"assets/images/chicago.png",
|
||||||
height: 300,
|
height: 300.h,
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
),
|
),
|
||||||
@@ -69,7 +71,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
isProfilePage: false,
|
isProfilePage: false,
|
||||||
showDivider: false,
|
showDivider: false,
|
||||||
),
|
),
|
||||||
SizedBox(height: 70.h),
|
SizedBox(height: 60.h),
|
||||||
Text(
|
Text(
|
||||||
"Melbourne",
|
"Melbourne",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
@@ -78,7 +80,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
fontSize: 44,
|
fontSize: 44,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 4),
|
SizedBox(height: 4.h),
|
||||||
Text(
|
Text(
|
||||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
|
||||||
"Cras posuere, nisl id dictum consequat, elit enim tincidunt magna...",
|
"Cras posuere, nisl id dictum consequat, elit enim tincidunt magna...",
|
||||||
@@ -88,7 +90,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
fontWeight: FontWeight.w400,
|
fontWeight: FontWeight.w400,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
SizedBox(height: 12.h),
|
||||||
|
|
||||||
// Category tags
|
// Category tags
|
||||||
Wrap(
|
Wrap(
|
||||||
@@ -101,7 +103,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
const SizedBox(height: 40),
|
SizedBox(height: 60.h),
|
||||||
|
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
@@ -152,9 +154,53 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
InwardCurvedContainer(
|
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(),
|
ESimOfferSection(),
|
||||||
HotelOffersSection(),
|
HotelOffersSection(),
|
||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
@@ -167,7 +213,9 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
children: [
|
children: [
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.of(context).pushNamed(RouteConstants.searchOffer);
|
Navigator.of(
|
||||||
|
context,
|
||||||
|
).pushNamed(RouteConstants.searchOffer);
|
||||||
},
|
},
|
||||||
child: _buildFeatureCard(
|
child: _buildFeatureCard(
|
||||||
image: "assets/images/claim_offers_bg.jpg",
|
image: "assets/images/claim_offers_bg.jpg",
|
||||||
@@ -199,7 +247,7 @@ class _RegisteredUserHomePageState extends State<RegisteredUserHomePage> {
|
|||||||
return Container(
|
return Container(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
|
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Color(0xffF95F62),
|
color: Color(0xffFFFFFF).withOpacity(0.29),
|
||||||
borderRadius: BorderRadius.circular(20),
|
borderRadius: BorderRadius.circular(20),
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class _AttractionsListViewState extends State<AttractionsListView> {
|
|||||||
child: ListView.builder(
|
child: ListView.builder(
|
||||||
controller: _scrollController,
|
controller: _scrollController,
|
||||||
scrollDirection: Axis.horizontal,
|
scrollDirection: Axis.horizontal,
|
||||||
padding: const EdgeInsets.only(left: 16),
|
padding: const EdgeInsets.only(right: 16),
|
||||||
itemCount: widget.attractions.length,
|
itemCount: widget.attractions.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final item = widget.attractions[index];
|
final item = widget.attractions[index];
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class ESimOfferSection extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
|
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 0),
|
||||||
padding: const EdgeInsets.all(10),
|
padding: const EdgeInsets.all(10),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(20),
|
borderRadius: BorderRadius.circular(20),
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
class InwardCurvedContainer extends StatelessWidget {
|
class InwardCurvedContainer extends StatelessWidget {
|
||||||
final Widget child;
|
final Widget child;
|
||||||
@@ -10,14 +11,14 @@ class InwardCurvedContainer extends StatelessWidget {
|
|||||||
clipper: InwardAndBottomConvexClipper(),
|
clipper: InwardAndBottomConvexClipper(),
|
||||||
child: Container(
|
child: Container(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
height: 700,
|
height: 450.h,
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
gradient: LinearGradient(
|
gradient: LinearGradient(
|
||||||
begin: Alignment.topLeft,
|
begin: Alignment.topLeft,
|
||||||
end: Alignment.bottomRight,
|
end: Alignment.bottomRight,
|
||||||
colors: [
|
colors: [
|
||||||
Color(0xFFFFF5F5),
|
Color(0xFFFFF5F5),
|
||||||
Color(0xFFFDCDCE),
|
Color(0xFFFEF5F8),
|
||||||
Color(0xFFFFF5F5),
|
Color(0xFFFFF5F5),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
44
lib/home/widgets/itineary_animation.dart
Normal file
44
lib/home/widgets/itineary_animation.dart
Normal 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(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
|
import 'attraction_details/bloc/attraction_details_bloc.dart';
|
||||||
import 'core/app_router.dart';
|
import 'core/app_router.dart';
|
||||||
import 'my_pass/blocs/my_pass_bloc.dart';
|
import 'my_pass/blocs/my_pass_bloc.dart';
|
||||||
|
|
||||||
@@ -38,6 +39,9 @@ class MyApp extends StatelessWidget {
|
|||||||
BlocProvider<MyPassBloc>(
|
BlocProvider<MyPassBloc>(
|
||||||
create: (_) => MyPassBloc()..add(LoadMyPasses()),
|
create: (_) => MyPassBloc()..add(LoadMyPasses()),
|
||||||
),
|
),
|
||||||
|
BlocProvider<AttractionDetailsBloc>(
|
||||||
|
create: (_) => AttractionDetailsBloc(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
child: MaterialApp(
|
child: MaterialApp(
|
||||||
onGenerateRoute: _appRouter.onGenerateRoute,
|
onGenerateRoute: _appRouter.onGenerateRoute,
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import 'package:citycards_customer/attraction_details/share_bottomsheet.dart';
|
import 'package:citycards_customer/attraction_details/widgets/share_bottomsheet.dart';
|
||||||
import 'package:citycards_customer/common_packages/app_bar.dart';
|
import 'package:citycards_customer/common_packages/app_bar.dart';
|
||||||
import 'package:citycards_customer/common_packages/custom_bullet_points.dart';
|
import 'package:citycards_customer/common_packages/custom_bullet_points.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:share_plus/share_plus.dart';
|
||||||
|
|
||||||
class OfferPassDetailView extends StatelessWidget {
|
class OfferPassDetailView extends StatelessWidget {
|
||||||
const OfferPassDetailView({super.key});
|
const OfferPassDetailView({super.key});
|
||||||
@@ -91,12 +92,16 @@ class OfferPassDetailView extends StatelessWidget {
|
|||||||
right: 17.w,
|
right: 17.w,
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
showModalBottomSheet(
|
Share.share(
|
||||||
context: context,
|
'Check out my City Card app!',
|
||||||
isScrollControlled: true,
|
subject: 'City Card App',
|
||||||
backgroundColor: Colors.transparent,
|
|
||||||
builder: (context) => const ShareBottomSheet(),
|
|
||||||
);
|
);
|
||||||
|
// showModalBottomSheet(
|
||||||
|
// context: context,
|
||||||
|
// isScrollControlled: true,
|
||||||
|
// backgroundColor: Colors.transparent,
|
||||||
|
// builder: (context) => const ShareBottomSheet(),
|
||||||
|
// );
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 36.h,
|
height: 36.h,
|
||||||
|
|||||||
@@ -18,9 +18,7 @@ class PostcardCreationPage extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BlocProvider(
|
return BlocBuilder<PostcardCreationBloc, PostcardCreationState>(
|
||||||
create: (_) => PostcardCreationBloc(),
|
|
||||||
child: BlocBuilder<PostcardCreationBloc, PostcardCreationState>(
|
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
Widget stepWidget;
|
Widget stepWidget;
|
||||||
switch (state.currentStep) {
|
switch (state.currentStep) {
|
||||||
@@ -50,6 +48,7 @@ class PostcardCreationPage extends StatelessWidget {
|
|||||||
break;
|
break;
|
||||||
case PostcardStep.myOrderPostcardPreview:
|
case PostcardStep.myOrderPostcardPreview:
|
||||||
stepWidget = const OrderPostcardPreviewPageView();
|
stepWidget = const OrderPostcardPreviewPageView();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
@@ -57,7 +56,6 @@ class PostcardCreationPage extends StatelessWidget {
|
|||||||
body: SafeArea(child: stepWidget),
|
body: SafeArea(child: stepWidget),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ class PostcardPage extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.of(context).pushNamed(RouteConstants.uploadPhotoPage);
|
Navigator.of(context).pushNamed(RouteConstants.postCardCreationPage);
|
||||||
},
|
},
|
||||||
child: Text(
|
child: Text(
|
||||||
"Lets Create",
|
"Lets Create",
|
||||||
|
|||||||
@@ -8,13 +8,71 @@ import '../blocs/postcard_creation_bloc.dart';
|
|||||||
import '../blocs/postcard_creation_events.dart';
|
import '../blocs/postcard_creation_events.dart';
|
||||||
import '../blocs/postcard_creation_state.dart';
|
import '../blocs/postcard_creation_state.dart';
|
||||||
|
|
||||||
class PostcardPurchaseFormPageView extends StatelessWidget {
|
class PostcardPurchaseFormPageView extends StatefulWidget {
|
||||||
const PostcardPurchaseFormPageView({super.key});
|
const PostcardPurchaseFormPageView({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<PostcardPurchaseFormPageView> createState() =>
|
||||||
|
_PostcardPurchaseFormPageViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PostcardPurchaseFormPageViewState
|
||||||
|
extends State<PostcardPurchaseFormPageView> {
|
||||||
|
|
||||||
|
/// Controllers
|
||||||
|
final titleCtrl = TextEditingController();
|
||||||
|
final fullNameCtrl = TextEditingController();
|
||||||
|
final emailCtrl = TextEditingController();
|
||||||
|
final phoneCtrl = TextEditingController();
|
||||||
|
final cityCtrl = TextEditingController();
|
||||||
|
final zipCtrl = TextEditingController();
|
||||||
|
|
||||||
|
String? country;
|
||||||
|
String? stateName;
|
||||||
|
|
||||||
|
/// Error messages
|
||||||
|
String? titleError;
|
||||||
|
String? fullNameError;
|
||||||
|
String? emailError;
|
||||||
|
String? phoneError;
|
||||||
|
String? cityError;
|
||||||
|
String? countryError;
|
||||||
|
String? stateError;
|
||||||
|
String? zipError;
|
||||||
|
|
||||||
|
bool validate() {
|
||||||
|
final emailRegex = RegExp(r'^[\w\.-]+@[\w\.-]+\.\w+$');
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
titleError = titleCtrl.text.isEmpty ? "Required" : null;
|
||||||
|
fullNameError = fullNameCtrl.text.isEmpty ? "Required" : null;
|
||||||
|
emailError = !emailRegex.hasMatch(emailCtrl.text.trim())
|
||||||
|
? "Invalid email format"
|
||||||
|
: null;
|
||||||
|
|
||||||
|
phoneError = phoneCtrl.text.length < 10 ? "Invalid phone" : null;
|
||||||
|
cityError = cityCtrl.text.isEmpty ? "Required" : null;
|
||||||
|
countryError = country == null ? "Required" : null;
|
||||||
|
stateError = stateName == null ? "Required" : null;
|
||||||
|
zipError = zipCtrl.text.length < 4 ? "Invalid zip" : null;
|
||||||
|
});
|
||||||
|
|
||||||
|
return titleError == null &&
|
||||||
|
fullNameError == null &&
|
||||||
|
emailError == null &&
|
||||||
|
phoneError == null &&
|
||||||
|
cityError == null &&
|
||||||
|
countryError == null &&
|
||||||
|
stateError == null &&
|
||||||
|
zipError == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BlocBuilder<PostcardCreationBloc, PostcardCreationState>(
|
return BlocBuilder<PostcardCreationBloc, PostcardCreationState>(
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
|
|
||||||
final bloc = context.read<PostcardCreationBloc>();
|
final bloc = context.read<PostcardCreationBloc>();
|
||||||
|
|
||||||
return SafeArea(
|
return SafeArea(
|
||||||
@@ -23,8 +81,7 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
CommonAppBar(isWhiteLogo: false, isProfilePage: false, showDivider: true,),
|
CommonAppBar(isWhiteLogo: false, isProfilePage: false, showDivider: true),
|
||||||
|
|
||||||
// Order ID
|
// Order ID
|
||||||
Text(
|
Text(
|
||||||
"#78895436",
|
"#78895436",
|
||||||
@@ -36,7 +93,7 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
|
|
||||||
// Postcard image + title
|
// Title
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
ClipRRect(
|
ClipRRect(
|
||||||
@@ -58,11 +115,19 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(width: 16),
|
const SizedBox(width: 16),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: TextField(
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
TextField(
|
||||||
|
controller: titleCtrl,
|
||||||
|
onChanged: (_) {
|
||||||
|
setState(() => titleError = null);
|
||||||
|
},
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: "Add title",
|
hintText: "Add title",
|
||||||
hintStyle: GoogleFonts.poppins(
|
hintStyle: GoogleFonts.poppins(
|
||||||
color: const Color(0xff999999), fontSize: 14.sp),
|
color: const Color(0xff999999),
|
||||||
|
fontSize: 14.sp),
|
||||||
enabledBorder: const UnderlineInputBorder(
|
enabledBorder: const UnderlineInputBorder(
|
||||||
borderSide:
|
borderSide:
|
||||||
BorderSide(color: Color(0xffFDCDCE), width: 1),
|
BorderSide(color: Color(0xffFDCDCE), width: 1),
|
||||||
@@ -73,9 +138,15 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
style: GoogleFonts.poppins(fontSize: 14.sp),
|
style: GoogleFonts.poppins(fontSize: 14.sp),
|
||||||
onChanged: (val) {
|
),
|
||||||
// You can dispatch event here: bloc.add(UpdateTitle(val));
|
if (titleError != null)
|
||||||
},
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 4),
|
||||||
|
child: Text(titleError!,
|
||||||
|
style: const TextStyle(
|
||||||
|
color: Colors.red, fontSize: 12)),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -83,7 +154,7 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
|
|
||||||
const SizedBox(height: 28),
|
const SizedBox(height: 28),
|
||||||
|
|
||||||
// Personal details section
|
// Personal details
|
||||||
Text(
|
Text(
|
||||||
"Add personal details",
|
"Add personal details",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
@@ -97,21 +168,45 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
_buildInputField(
|
_buildInputField(
|
||||||
label: "Full Name",
|
label: "Full Name",
|
||||||
hint: "Lorem Ipsum",
|
hint: "Lorem Ipsum",
|
||||||
|
controller: fullNameCtrl,
|
||||||
|
errorText: fullNameError,
|
||||||
|
onChanged: (_) {
|
||||||
|
setState(() => fullNameError = null);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
|
|
||||||
_buildInputField(
|
_buildInputField(
|
||||||
label: "Email ID",
|
label: "Email ID",
|
||||||
hint: "Lorem@gmail.com",
|
hint: "Lorem@gmail.com",
|
||||||
icon: Icons.email_outlined,
|
icon: Icons.email_outlined,
|
||||||
|
controller: emailCtrl,
|
||||||
|
errorText: emailError,
|
||||||
|
type: TextInputType.emailAddress,
|
||||||
|
onChanged: (_) {
|
||||||
|
setState(() => emailError = null);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
|
|
||||||
_buildInputField(
|
_buildInputField(
|
||||||
label: "Phone number",
|
label: "Phone number",
|
||||||
hint: "+91 9999 999 999",
|
hint: "+91 9999 999 999",
|
||||||
icon: Icons.phone_outlined,
|
icon: Icons.phone_outlined,
|
||||||
|
controller: phoneCtrl,
|
||||||
|
errorText: phoneError,
|
||||||
|
onChanged: (value) {
|
||||||
|
if (value.length > 10) {
|
||||||
|
phoneCtrl.text = value.substring(0, 10);
|
||||||
|
phoneCtrl.selection = TextSelection.fromPosition(
|
||||||
|
TextPosition(offset: phoneCtrl.text.length),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
setState(() => phoneError = null);
|
||||||
|
},
|
||||||
|
type: TextInputType.number
|
||||||
),
|
),
|
||||||
|
|
||||||
const SizedBox(height: 28),
|
const SizedBox(height: 28),
|
||||||
|
|
||||||
// Address details section
|
|
||||||
Text(
|
Text(
|
||||||
"Add address details",
|
"Add address details",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
@@ -122,10 +217,51 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
_buildInputField(label: "City", hint: "Lorem Ipsum"),
|
_buildInputField(
|
||||||
_buildDropdownField(label: "Country", hint: "Lorem Ipsum"),
|
label: "City",
|
||||||
_buildDropdownField(label: "State", hint: "Lorem Ipsum"),
|
hint: "Lorem Ipsum",
|
||||||
_buildInputField(label: "Zip Code", hint: "000000"),
|
controller: cityCtrl,
|
||||||
|
errorText: cityError,
|
||||||
|
onChanged: (_) {
|
||||||
|
setState(() => cityError = null);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
|
_buildDropdownField(
|
||||||
|
label: "Country",
|
||||||
|
hint: "Lorem Ipsum",
|
||||||
|
value: country,
|
||||||
|
errorText: countryError,
|
||||||
|
onChanged: (val) {
|
||||||
|
setState(() {
|
||||||
|
country = val;
|
||||||
|
countryError = null;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
|
_buildDropdownField(
|
||||||
|
label: "State",
|
||||||
|
hint: "Lorem Ipsum",
|
||||||
|
value: stateName,
|
||||||
|
errorText: stateError,
|
||||||
|
onChanged: (val) {
|
||||||
|
setState(() {
|
||||||
|
stateName = val;
|
||||||
|
stateError = null;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
|
_buildInputField(
|
||||||
|
label: "Zip Code",
|
||||||
|
hint: "000000",
|
||||||
|
controller: zipCtrl,
|
||||||
|
errorText: zipError,
|
||||||
|
onChanged: (_) {
|
||||||
|
setState(() => zipError = null);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
|
||||||
const SizedBox(height: 30),
|
const SizedBox(height: 30),
|
||||||
|
|
||||||
@@ -134,7 +270,9 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
|
if (validate()) {
|
||||||
bloc.add(GoToNextStep());
|
bloc.add(GoToNextStep());
|
||||||
|
}
|
||||||
},
|
},
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
backgroundColor: const Color(0xffF95F62),
|
backgroundColor: const Color(0xffF95F62),
|
||||||
@@ -161,36 +299,39 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 🔹 Reusable text field widget
|
/// TEXT FIELD (NO UI CHANGES)
|
||||||
Widget _buildInputField({
|
Widget _buildInputField({
|
||||||
required String label,
|
required String label,
|
||||||
required String hint,
|
required String hint,
|
||||||
|
required TextEditingController controller,
|
||||||
|
required Function(String) onChanged,
|
||||||
|
String? errorText,
|
||||||
IconData? icon,
|
IconData? icon,
|
||||||
|
TextInputType? type
|
||||||
}) {
|
}) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(bottom: 18),
|
padding: const EdgeInsets.only(bottom: 18),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(label,
|
||||||
label,
|
|
||||||
style: GoogleFonts.poppins(
|
style: GoogleFonts.poppins(
|
||||||
fontSize: 13.sp,
|
fontSize: 13.sp,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
color: const Color(0xff1A1A1A),
|
color: const Color(0xff1A1A1A))),
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 6),
|
const SizedBox(height: 6),
|
||||||
TextField(
|
TextField(
|
||||||
|
controller: controller,
|
||||||
|
onChanged: onChanged,
|
||||||
|
keyboardType: type,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: hint,
|
hintText: hint,
|
||||||
hintStyle: GoogleFonts.poppins(
|
hintStyle: GoogleFonts.poppins(
|
||||||
color: const Color(0xff999999),
|
color: const Color(0xff999999),
|
||||||
fontSize: 14.sp,
|
fontSize: 14.sp,
|
||||||
),
|
),
|
||||||
suffixIcon: icon != null
|
suffixIcon:
|
||||||
? Icon(icon, color: Colors.black, size: 20)
|
icon != null ? Icon(icon, color: Colors.black, size: 20) : null,
|
||||||
: null,
|
|
||||||
contentPadding:
|
contentPadding:
|
||||||
const EdgeInsets.symmetric(vertical: 14, horizontal: 12),
|
const EdgeInsets.symmetric(vertical: 14, horizontal: 12),
|
||||||
enabledBorder: OutlineInputBorder(
|
enabledBorder: OutlineInputBorder(
|
||||||
@@ -203,32 +344,38 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (errorText != null)
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 4),
|
||||||
|
child: Text(errorText!,
|
||||||
|
style: const TextStyle(color: Colors.red, fontSize: 12)),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 🔹 Dropdown input
|
/// DROPDOWN FIELD (NO UI CHANGES)
|
||||||
Widget _buildDropdownField({
|
Widget _buildDropdownField({
|
||||||
required String label,
|
required String label,
|
||||||
required String hint,
|
required String hint,
|
||||||
|
required String? value,
|
||||||
|
required Function(String?) onChanged,
|
||||||
|
String? errorText,
|
||||||
}) {
|
}) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(bottom: 18),
|
padding: const EdgeInsets.only(bottom: 18),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(label,
|
||||||
label,
|
|
||||||
style: GoogleFonts.poppins(
|
style: GoogleFonts.poppins(
|
||||||
fontSize: 13.sp,
|
fontSize: 13.sp,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
color: const Color(0xff1A1A1A),
|
color: const Color(0xff1A1A1A))),
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 6),
|
const SizedBox(height: 6),
|
||||||
DropdownButtonFormField<String>(
|
DropdownButtonFormField<String>(
|
||||||
value: null,
|
value: value,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
contentPadding:
|
contentPadding:
|
||||||
const EdgeInsets.symmetric(vertical: 14, horizontal: 12),
|
const EdgeInsets.symmetric(vertical: 14, horizontal: 12),
|
||||||
@@ -253,7 +400,13 @@ class PostcardPurchaseFormPageView extends StatelessWidget {
|
|||||||
items: const [
|
items: const [
|
||||||
DropdownMenuItem(value: "Lorem Ipsum", child: Text("Lorem Ipsum")),
|
DropdownMenuItem(value: "Lorem Ipsum", child: Text("Lorem Ipsum")),
|
||||||
],
|
],
|
||||||
onChanged: (val) {},
|
onChanged: onChanged,
|
||||||
|
),
|
||||||
|
if (errorText != null)
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 4),
|
||||||
|
child: Text(errorText!,
|
||||||
|
style: const TextStyle(color: Colors.red, fontSize: 12)),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -5,36 +5,171 @@ import 'package:google_fonts/google_fonts.dart';
|
|||||||
class MessageCardWidget extends StatelessWidget {
|
class MessageCardWidget extends StatelessWidget {
|
||||||
final String message;
|
final String message;
|
||||||
final String? selectedFont;
|
final String? selectedFont;
|
||||||
const MessageCardWidget({super.key, required this.message, this.selectedFont});
|
MessageCardWidget({super.key, required this.message, this.selectedFont});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Stack(
|
return Container(
|
||||||
alignment: Alignment.center,
|
constraints: BoxConstraints(minHeight: 227.h),
|
||||||
children: [
|
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8.h),
|
||||||
Image.asset(
|
decoration: BoxDecoration(
|
||||||
'assets/images/postcard_bg.png',
|
borderRadius: BorderRadius.circular(5.r),
|
||||||
width: double.infinity,
|
gradient: const LinearGradient(
|
||||||
fit: BoxFit.contain,
|
colors: [
|
||||||
|
Color(0xFFF5E9D7), // top-left shade
|
||||||
|
Color(0xFFE7D3B8), // bottom-right shade
|
||||||
|
],
|
||||||
|
begin: Alignment.topLeft,
|
||||||
|
end: Alignment.bottomRight,
|
||||||
|
),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Color(0xFFA08264).withOpacity(0.15),
|
||||||
|
blurRadius: 6,
|
||||||
|
spreadRadius: 0,
|
||||||
|
offset: Offset(-0.5, -0.5),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
foregroundDecoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(5.r),
|
||||||
|
gradient: RadialGradient(
|
||||||
|
center: const Alignment(-0.6, -0.6),
|
||||||
|
radius: 1.2,
|
||||||
|
colors: [Color(0xFFBEA078).withOpacity(0.15), Colors.transparent],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
Positioned(
|
// ---------- IMPORTANT: IntrinsicHeight ensures children get bounded height ----------
|
||||||
right: 10,
|
child: IntrinsicHeight(
|
||||||
top: 50,
|
child: Row(
|
||||||
child: SizedBox(
|
crossAxisAlignment: CrossAxisAlignment.stretch, // stretch so children fill height
|
||||||
width: 150.w,
|
children: [
|
||||||
child: Text(message,
|
// ---------------- LEFT SECTION ---------------- //
|
||||||
textAlign: TextAlign.left,
|
Expanded(
|
||||||
style: TextStyle(
|
child: Column(
|
||||||
fontFamily: selectedFont ??
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
GoogleFonts.poppins().fontFamily,
|
// SpaceBetween ensures top content stays top and CityCards.co stays bottom
|
||||||
color: Colors.black,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
fontSize: 10,
|
children: [
|
||||||
|
// Top group
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
"assets/logo/logo_city_cards.png",
|
||||||
|
height: 22.h,
|
||||||
),
|
),
|
||||||
|
SizedBox(height: 4.h),
|
||||||
|
|
||||||
|
Text(
|
||||||
|
"POSTCARD",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 6.sp,
|
||||||
|
letterSpacing: 0.93,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
color: Color(0xFF000000).withOpacity(0.4),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 7.h),
|
||||||
|
|
||||||
|
Text(
|
||||||
|
"MESSAGE PREVIEW",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 5.sp,
|
||||||
|
letterSpacing: 0.93,
|
||||||
|
color: Color(0xFF000000).withOpacity(0.6),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(height: 4.h),
|
||||||
|
|
||||||
|
Text(
|
||||||
|
message,
|
||||||
|
style: TextStyle(
|
||||||
|
fontFamily: selectedFont,
|
||||||
|
fontSize: 12.sp,
|
||||||
|
height: 1.6,
|
||||||
|
color: Color(0xFF0A0D13).withOpacity(0.8),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
// Bottom text — will stay at the bottom of the left column
|
||||||
|
Text(
|
||||||
|
"CityCards.co",
|
||||||
|
style: TextStyle(fontSize: 12.sp, color: Color(0xFFF95F62)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// ---------------- DIVIDER (middle) ---------------- //
|
||||||
|
Container(
|
||||||
|
width: 3.86.w,
|
||||||
|
height: double.infinity, // will match IntrinsicHeight-bounded Row height
|
||||||
|
margin: EdgeInsets.only(right: 10.w,top:24.h,bottom: 24.h),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
gradient: LinearGradient(
|
||||||
|
colors: [
|
||||||
|
Color(0xFF000000).withOpacity(0),
|
||||||
|
Color(0xFF65543F).withOpacity(0.4),
|
||||||
|
Color(0xFF65543F).withOpacity(0.6),
|
||||||
|
Color(0xFF65543F).withOpacity(0.8),
|
||||||
|
Color(0xFF65543F).withOpacity(0.6),
|
||||||
|
Color(0xFF65543F).withOpacity(0.4),
|
||||||
|
Color(0xFF000000).withOpacity(0),
|
||||||
|
],
|
||||||
|
begin: Alignment.topCenter,
|
||||||
|
end: Alignment.bottomCenter,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// ---------------- RIGHT SECTION ---------------- //
|
||||||
|
Align(
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.all(7),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(4.r),
|
||||||
|
border: Border.all(
|
||||||
|
color: Color(0xFF000000).withOpacity(0.12),
|
||||||
|
width: 1,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"ADDRESS",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 5.sp,
|
||||||
|
fontWeight: FontWeight.w500,
|
||||||
|
letterSpacing: 0.93,
|
||||||
|
color: Color(0xFF000000).withOpacity(0.6),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
Text(
|
||||||
|
"121 Saint Denis Street,\n"
|
||||||
|
"Louisiana,\n"
|
||||||
|
"United States of America",
|
||||||
|
style: TextStyle(
|
||||||
|
fontFamily: selectedFont,
|
||||||
|
fontSize: 8.sp,
|
||||||
|
height: 1.7.h,
|
||||||
|
),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,22 +16,13 @@ class PostCardPreviewWidget extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return SizedBox(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
height: 230.h,
|
height: 227.h,
|
||||||
padding: const EdgeInsets.all(10),
|
child: ClipRRect(
|
||||||
decoration: BoxDecoration(
|
borderRadius: BorderRadius.circular(6.r),
|
||||||
gradient: LinearGradient(colors: [
|
child: Image.file(File(imagePath), fit: BoxFit.cover)),
|
||||||
Color(0xffE2D6C2),
|
|
||||||
Color(0xffFFF5E6),
|
|
||||||
Color(0xffFFF5E6),
|
|
||||||
]),
|
|
||||||
border: Border.all(
|
|
||||||
color: Color(0xff000000).withOpacity(0.12),
|
|
||||||
),
|
|
||||||
borderRadius: BorderRadius.circular(12),
|
|
||||||
),
|
|
||||||
child: Image.file(File(imagePath), fit: BoxFit.cover),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class _SplashScreenState extends State<SplashScreen> {
|
|||||||
backgroundColor: const Color(0xFFF95F62), // Coral red background
|
backgroundColor: const Color(0xFFF95F62), // Coral red background
|
||||||
body: Center(
|
body: Center(
|
||||||
child: Lottie.asset(
|
child: Lottie.asset(
|
||||||
'assets/intro/animation.json', // Your Lottie file
|
'assets/intro/animm.json', // Your Lottie file
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
repeat: true,
|
repeat: true,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class YourItineraryView extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Image.asset(
|
||||||
"assets/images/trump_house.png",
|
"assets/images/trump_house.png",
|
||||||
height: 155.h,
|
height: 165.h,
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
alignment: Alignment.topCenter,
|
alignment: Alignment.topCenter,
|
||||||
@@ -45,12 +45,7 @@ class YourItineraryView extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
CommonAppBar(isWhiteLogo: true, isProfilePage: false, showDivider: true,),
|
CommonAppBar(isWhiteLogo: true, isProfilePage: false, showDivider: true,),
|
||||||
SizedBox(height: 5.h),
|
SizedBox(height: 10.h),
|
||||||
Divider(
|
|
||||||
height: 0.4.h,
|
|
||||||
color: Colors.white.withOpacity(.3),
|
|
||||||
),
|
|
||||||
SizedBox(height: 26.h),
|
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
@@ -68,7 +63,7 @@ class YourItineraryView extends StatelessWidget {
|
|||||||
"Melbourne Itinerary",
|
"Melbourne Itinerary",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16.sp,
|
fontSize: 16.sp,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w700,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
120
pubspec.lock
120
pubspec.lock
@@ -725,6 +725,22 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.0"
|
||||||
|
share_plus:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: share_plus
|
||||||
|
sha256: "14c8860d4de93d3a7e53af51bff479598c4e999605290756bbbe45cf65b37840"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "12.0.1"
|
||||||
|
share_plus_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: share_plus_platform_interface
|
||||||
|
sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.1.0"
|
||||||
shared_preferences:
|
shared_preferences:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -906,6 +922,70 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.2"
|
version: "2.2.2"
|
||||||
|
url_launcher:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: url_launcher
|
||||||
|
sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.3.2"
|
||||||
|
url_launcher_android:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_android
|
||||||
|
sha256: "5c8b6c2d89a78f5a1cca70a73d9d5f86c701b36b42f9c9dac7bad592113c28e9"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.3.24"
|
||||||
|
url_launcher_ios:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_ios
|
||||||
|
sha256: "6b63f1441e4f653ae799166a72b50b1767321ecc263a57aadf825a7a2a5477d9"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.3.5"
|
||||||
|
url_launcher_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_linux
|
||||||
|
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.2.1"
|
||||||
|
url_launcher_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_macos
|
||||||
|
sha256: "8262208506252a3ed4ff5c0dc1e973d2c0e0ef337d0a074d35634da5d44397c9"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.2.4"
|
||||||
|
url_launcher_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_platform_interface
|
||||||
|
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.3.2"
|
||||||
|
url_launcher_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_web
|
||||||
|
sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.4.1"
|
||||||
|
url_launcher_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: url_launcher_windows
|
||||||
|
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "3.1.4"
|
||||||
uuid:
|
uuid:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -922,6 +1002,46 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.0"
|
version: "2.2.0"
|
||||||
|
video_player:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: video_player
|
||||||
|
sha256: "0d55b1f1a31e5ad4c4967bfaa8ade0240b07d20ee4af1dfef5f531056512961a"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.10.0"
|
||||||
|
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: "19ed1162a7a5520e7d7791e0b7b73ba03161b6a69428b82e4689e435b325432d"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.8.5"
|
||||||
|
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:
|
vm_service:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -48,8 +48,11 @@ dependencies:
|
|||||||
shared_preferences: ^2.5.3
|
shared_preferences: ^2.5.3
|
||||||
flutter_launcher_icons: ^0.14.4
|
flutter_launcher_icons: ^0.14.4
|
||||||
flutter_glass_morphism: ^1.0.2
|
flutter_glass_morphism: ^1.0.2
|
||||||
|
video_player: ^2.10.0
|
||||||
lottie: ^3.3.2
|
lottie: ^3.3.2
|
||||||
flutter_native_splash: ^2.4.7
|
flutter_native_splash: ^2.4.7
|
||||||
|
url_launcher: ^6.3.2
|
||||||
|
share_plus: ^12.0.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|||||||
Reference in New Issue
Block a user