2 Commits
Anuj ... raj

18 changed files with 382 additions and 240 deletions

View File

@@ -20,7 +20,5 @@
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1.0</string> <string>1.0</string>
<key>MinimumOSVersion</key>
<string>13.0</string>
</dict> </dict>
</plist> </plist>

View File

@@ -44,9 +44,9 @@ PODS:
- path_provider_foundation (0.0.1): - path_provider_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
- SDWebImage (5.21.7): - SDWebImage (5.21.3):
- SDWebImage/Core (= 5.21.7) - SDWebImage/Core (= 5.21.3)
- SDWebImage/Core (5.21.7) - SDWebImage/Core (5.21.3)
- shared_preferences_foundation (0.0.1): - shared_preferences_foundation (0.0.1):
- Flutter - Flutter
- FlutterMacOS - FlutterMacOS
@@ -93,7 +93,7 @@ SPEC CHECKSUMS:
image_picker_ios: 4f2f91b01abdb52842a8e277617df877e40f905b image_picker_ios: 4f2f91b01abdb52842a8e277617df877e40f905b
mobile_scanner: 77265f3dc8d580810e91849d4a0811a90467ed5e mobile_scanner: 77265f3dc8d580810e91849d4a0811a90467ed5e
path_provider_foundation: 0b743cbb62d8e47eab856f09262bb8c1ddcfe6ba path_provider_foundation: 0b743cbb62d8e47eab856f09262bb8c1ddcfe6ba
SDWebImage: e9fc87c1aab89a8ab1bbd74eba378c6f53be8abf SDWebImage: 16309af6d214ba3f77a7c6f6fdda888cb313a50a
shared_preferences_foundation: 5086985c1d43c5ba4d5e69a4e8083a389e2909e6 shared_preferences_foundation: 5086985c1d43c5ba4d5e69a4e8083a389e2909e6
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4

View File

@@ -7,15 +7,15 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
009FE00002023B474E5F615B /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FA2E6EEBA24D1D13B1A266F /* Pods_RunnerTests.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 */; };
51A3A2EFDD1A9C3AB6FB3F96 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B39779CF6FD29100AC0BBA8 /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
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 */; };
C614FCF7A5E78A8C45529D67 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D71A217BE5380EA07CDDF04C /* Pods_Runner.framework */; }; D34028E81F5AB1F75E7B16A0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B7CF29D3E86AAE462952D5AC /* Pods_RunnerTests.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@@ -44,27 +44,27 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
217D5EE4ED45A9C2C2A1FF6F /* 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>"; }; 3278C65BE817D790CE9D31EA /* 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>"; };
292C94FD8F5EB223FCA0D626 /* 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>"; };
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>"; };
3CC52E203513A2D23DB2B2A9 /* 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>"; };
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>"; };
76E3A205AB57DF923EC46FF4 /* 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>"; };
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>"; };
7FA2E6EEBA24D1D13B1A266F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7B39779CF6FD29100AC0BBA8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
84810DBB84C302273D0A3837 /* 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>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
9773B881A4736A93B26DA98C /* 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>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
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>"; };
CCCCA868F0AAA56876A031CC /* 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>"; }; B12CD22763ED0AABDBFA3843 /* 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>"; };
D71A217BE5380EA07CDDF04C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B7CF29D3E86AAE462952D5AC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
E7B1106E9B82E5EC66ECA142 /* 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>"; }; EDBD399D358E57BBA6222C89 /* 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>"; };
F69591C933A2B991CBE337B8 /* 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>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@@ -72,7 +72,7 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
C614FCF7A5E78A8C45529D67 /* Pods_Runner.framework in Frameworks */, 51A3A2EFDD1A9C3AB6FB3F96 /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -80,22 +80,13 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
009FE00002023B474E5F615B /* Pods_RunnerTests.framework in Frameworks */, D34028E81F5AB1F75E7B16A0 /* Pods_RunnerTests.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
0553143CD598C0802B181E65 /* Frameworks */ = {
isa = PBXGroup;
children = (
D71A217BE5380EA07CDDF04C /* Pods_Runner.framework */,
7FA2E6EEBA24D1D13B1A266F /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
331C8082294A63A400263BE5 /* RunnerTests */ = { 331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -104,6 +95,15 @@
path = RunnerTests; path = RunnerTests;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
77EB6C32365D74ADFB415023 /* Frameworks */ = {
isa = PBXGroup;
children = (
7B39779CF6FD29100AC0BBA8 /* Pods_Runner.framework */,
B7CF29D3E86AAE462952D5AC /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = { 9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -123,7 +123,7 @@
97C146EF1CF9000F007C117D /* Products */, 97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */, 331C8082294A63A400263BE5 /* RunnerTests */,
CCC359E15820CA586901458F /* Pods */, CCC359E15820CA586901458F /* Pods */,
0553143CD598C0802B181E65 /* Frameworks */, 77EB6C32365D74ADFB415023 /* Frameworks */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@@ -154,12 +154,12 @@
CCC359E15820CA586901458F /* Pods */ = { CCC359E15820CA586901458F /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3CC52E203513A2D23DB2B2A9 /* Pods-Runner.debug.xcconfig */, EDBD399D358E57BBA6222C89 /* Pods-Runner.debug.xcconfig */,
CCCCA868F0AAA56876A031CC /* Pods-Runner.release.xcconfig */, 3278C65BE817D790CE9D31EA /* Pods-Runner.release.xcconfig */,
F69591C933A2B991CBE337B8 /* Pods-Runner.profile.xcconfig */, 76E3A205AB57DF923EC46FF4 /* Pods-Runner.profile.xcconfig */,
292C94FD8F5EB223FCA0D626 /* Pods-RunnerTests.debug.xcconfig */, B12CD22763ED0AABDBFA3843 /* Pods-RunnerTests.debug.xcconfig */,
217D5EE4ED45A9C2C2A1FF6F /* Pods-RunnerTests.release.xcconfig */, 84810DBB84C302273D0A3837 /* Pods-RunnerTests.release.xcconfig */,
E7B1106E9B82E5EC66ECA142 /* Pods-RunnerTests.profile.xcconfig */, 9773B881A4736A93B26DA98C /* Pods-RunnerTests.profile.xcconfig */,
); );
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -171,7 +171,7 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = ( buildPhases = (
DC6A2DB978D937ADCCE2D3B6 /* [CP] Check Pods Manifest.lock */, 5CBD8E8486B121262DE7BE14 /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */, 331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */, 331C807F294A63A400263BE5 /* Resources */,
B8A03EAB2471301E5C3F51A6 /* Frameworks */, B8A03EAB2471301E5C3F51A6 /* Frameworks */,
@@ -190,14 +190,14 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = ( buildPhases = (
6DEDEB6BFA32059CBDD6C101 /* [CP] Check Pods Manifest.lock */, F103013AD18A5ACBE4D990DF /* [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 */,
B659A5D7849A68A8EF0E95E0 /* [CP] Embed Pods Frameworks */, 3CFF0FC1A483D0467DD94BE3 /* [CP] Embed Pods Frameworks */,
); );
buildRules = ( buildRules = (
); );
@@ -285,7 +285,24 @@
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";
}; };
6DEDEB6BFA32059CBDD6C101 /* [CP] Check Pods Manifest.lock */ = { 3CFF0FC1A483D0467DD94BE3 /* [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;
};
5CBD8E8486B121262DE7BE14 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@@ -300,7 +317,7 @@
outputFileListPaths = ( outputFileListPaths = (
); );
outputPaths = ( outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
@@ -322,24 +339,7 @@
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";
}; };
B659A5D7849A68A8EF0E95E0 /* [CP] Embed Pods Frameworks */ = { F103013AD18A5ACBE4D990DF /* [CP] Check Pods Manifest.lock */ = {
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;
};
DC6A2DB978D937ADCCE2D3B6 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@@ -354,7 +354,7 @@
outputFileListPaths = ( outputFileListPaths = (
); );
outputPaths = ( outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
@@ -497,7 +497,7 @@
}; };
331C8088294A63A400263BE5 /* Debug */ = { 331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 292C94FD8F5EB223FCA0D626 /* Pods-RunnerTests.debug.xcconfig */; baseConfigurationReference = B12CD22763ED0AABDBFA3843 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@@ -515,7 +515,7 @@
}; };
331C8089294A63A400263BE5 /* Release */ = { 331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = 217D5EE4ED45A9C2C2A1FF6F /* Pods-RunnerTests.release.xcconfig */; baseConfigurationReference = 84810DBB84C302273D0A3837 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
@@ -531,7 +531,7 @@
}; };
331C808A294A63A400263BE5 /* Profile */ = { 331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = E7B1106E9B82E5EC66ECA142 /* Pods-RunnerTests.profile.xcconfig */; baseConfigurationReference = 9773B881A4736A93B26DA98C /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = { buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1610" LastUpgradeVersion = "1510"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@@ -2,12 +2,15 @@ import Flutter
import UIKit import UIKit
@main @main
@objc class AppDelegate: FlutterAppDelegate { @objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {
override func application( override func application(
_ application: UIApplication, _ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool { ) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions) return super.application(application, didFinishLaunchingWithOptions: launchOptions)
} }
func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {
GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)
}
} }

View File

@@ -1,48 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-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>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Citycards Partner Flutter</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>citycards_partner_flutter</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs photos access to get QR code from photo library</string>
<key>UIApplicationSceneManifest</key>
<dict> <dict>
<key>CADisableMinimumFrameDurationOnPhone</key> <key>UIApplicationSupportsMultipleScenes</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Citycards Partner Flutter</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>citycards_partner_flutter</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs photos access to get QR code from photo library</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen.storyboard</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneClassName</key>
<string>UIWindowScene</string>
<key>UISceneConfigurationName</key>
<string>flutter</string>
<key>UISceneDelegateClassName</key>
<string>FlutterSceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict> </dict>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen.storyboard</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist> </plist>

View File

@@ -18,6 +18,7 @@ class LoginBloc extends Bloc<LoginEvent, LoginState> {
on<LoginRememberMeToggled>(_onRememberMeToggled); on<LoginRememberMeToggled>(_onRememberMeToggled);
on<LoginEmailErrorToggled>(_onEmailErrorToggled); on<LoginEmailErrorToggled>(_onEmailErrorToggled);
on<LoginPasswordErrorToggled>(_onPasswordErrorToggled); on<LoginPasswordErrorToggled>(_onPasswordErrorToggled);
on<LoginReset>(_onReset);
} }
// ================= LOGIN SUBMITTED ================= // ================= LOGIN SUBMITTED =================
@@ -87,4 +88,11 @@ class LoginBloc extends Bloc<LoginEvent, LoginState> {
) { ) {
emit(state.copyWith(showPasswordError: event.show)); emit(state.copyWith(showPasswordError: event.show));
} }
void _onReset(
LoginReset event,
Emitter<LoginState> emit,
) {
emit(const LoginState());
}
} }

View File

@@ -42,6 +42,10 @@ class LoginEmailErrorToggled extends LoginEvent {
List<Object?> get props => [show]; List<Object?> get props => [show];
} }
class LoginReset extends LoginEvent {
const LoginReset();
}
class LoginPasswordErrorToggled extends LoginEvent { class LoginPasswordErrorToggled extends LoginEvent {
final bool show; final bool show;
const LoginPasswordErrorToggled(this.show); const LoginPasswordErrorToggled(this.show);

View File

@@ -62,6 +62,29 @@ class _ForgotPasswordPageState extends State<ForgotPasswordPage> {
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
child: Scaffold( child: Scaffold(
backgroundColor: AppColors.backgroundWhite, backgroundColor: AppColors.backgroundWhite,
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
leadingWidth: 70.w,
leading: Padding(
padding: EdgeInsets.only(left: 24.w, top: 8.h, bottom: 8.h),
child: InkWell(
onTap: () => Navigator.pop(context),
borderRadius: BorderRadius.circular(50),
child: Container(
decoration: const BoxDecoration(
color: AppColors.primaryRed,
shape: BoxShape.circle,
),
child: Icon(
Icons.arrow_back_ios_new,
color: Colors.white,
size: 18.sp,
),
),
),
),
),
body: BlocConsumer<ForgotPasswordBloc, ForgotPasswordState>( body: BlocConsumer<ForgotPasswordBloc, ForgotPasswordState>(
listener: (context, state) { listener: (context, state) {
if (state.status == ForgotPasswordStatus.success) { if (state.status == ForgotPasswordStatus.success) {
@@ -97,7 +120,7 @@ class _ForgotPasswordPageState extends State<ForgotPasswordPage> {
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
children: [ children: [
SizedBox(height: 40.h), SizedBox(height: 10.h),
// ===== LOGO SECTION ===== // ===== LOGO SECTION =====
Center( Center(
child: Column( child: Column(

View File

@@ -22,6 +22,12 @@ class _LoginPageState extends State<LoginPage> {
final _emailFocusNode = FocusNode(); final _emailFocusNode = FocusNode();
final _passwordFocusNode = FocusNode(); final _passwordFocusNode = FocusNode();
@override
void initState() {
super.initState();
context.read<LoginBloc>().add(const LoginReset());
}
@override @override
void dispose() { void dispose() {
_emailController.dispose(); _emailController.dispose();
@@ -32,9 +38,7 @@ class _LoginPageState extends State<LoginPage> {
} }
bool _isEmailValid(String email) { bool _isEmailValid(String email) {
return RegExp( return RegExp(r'^[\w-\.]+@([\w-]+\.)+[a-zA-Z]{2,4}$').hasMatch(email);
r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$')
.hasMatch(email);
} }
void _onLoginPressed(BuildContext context) { void _onLoginPressed(BuildContext context) {

View File

@@ -1,6 +1,6 @@
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_otp_text_field/flutter_otp_text_field.dart'; import 'package:pinput/pinput.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 '../../constants/app_assets.dart'; import '../../constants/app_assets.dart';
@@ -21,7 +21,30 @@ class OtpVerificationPage extends StatelessWidget {
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
child: Scaffold( child: Scaffold(
backgroundColor: AppColors.backgroundWhite, backgroundColor: AppColors.backgroundWhite,
body: BlocConsumer<VerifyOtpBloc, VerifyOtpState>( appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
leadingWidth: 70.w,
leading: Padding(
padding: EdgeInsets.only(left: 24.w, top: 8.h, bottom: 8.h),
child: InkWell(
onTap: () => Navigator.pop(context),
borderRadius: BorderRadius.circular(50),
child: Container(
decoration: const BoxDecoration(
color: AppColors.primaryRed,
shape: BoxShape.circle,
),
child: Icon(
Icons.arrow_back_ios_new,
color: Colors.white,
size: 18.sp,
),
),
),
),
),
body: BlocListener<VerifyOtpBloc, VerifyOtpState>(
listener: (context, state) { listener: (context, state) {
if (state.status == VerifyOtpStatus.success) { if (state.status == VerifyOtpStatus.success) {
Navigator.pushReplacementNamed( Navigator.pushReplacementNamed(
@@ -39,122 +62,149 @@ class OtpVerificationPage extends StatelessWidget {
); );
} }
}, },
builder: (context, state) { child: SafeArea(
final isLoading = state.status == VerifyOtpStatus.loading; child: Padding(
padding: EdgeInsets.symmetric(horizontal: 24.w),
return SafeArea( child: Column(
child: Padding( children: [
padding: EdgeInsets.symmetric(horizontal: 24.w), Expanded(
child: Column( child: SingleChildScrollView(
children: [ child: Column(
Expanded( children: [
child: SingleChildScrollView( SizedBox(height: 10.h),
child: Column( // ===== LOGO SECTION =====
children: [ Center(
SizedBox(height: 40.h), child: Column(
// ===== LOGO SECTION ===== children: [
Center( Image.asset(
child: Column( AppAssets.appIcon,
children: [ height: 60.h,
Image.asset( ),
AppAssets.appIcon, SizedBox(height: 8.h),
height: 60.h, Text(
"Partner's App",
style: GoogleFonts.poppins(
color: AppColors.primaryRed,
fontSize: 20.sp,
fontWeight: FontWeight.w500,
), ),
SizedBox(height: 8.h), ),
Text( ],
"Partner's App",
style: GoogleFonts.poppins(
color: AppColors.primaryRed,
fontSize: 20.sp,
fontWeight: FontWeight.w500,
),
),
],
),
), ),
SizedBox(height: 60.h), ),
SizedBox(height: 60.h),
// ===== HEADER TEXT ===== // ===== HEADER TEXT =====
Text( Text(
"Verify OTP", "Verify OTP",
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: GoogleFonts.poppins( style: GoogleFonts.poppins(
color: AppColors.black, color: AppColors.black,
fontSize: 24.sp, fontSize: 24.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
),
), ),
SizedBox(height: 12.h), ),
Text( SizedBox(height: 12.h),
"We've sent an OTP to your registered email. Please enter it below.", Text(
textAlign: TextAlign.center, "We've sent an OTP to your registered email. Please enter it below.",
style: GoogleFonts.poppins( textAlign: TextAlign.center,
color: AppColors.textGrey, style: GoogleFonts.poppins(
fontSize: 16.sp, color: AppColors.textGrey,
height: 1.4, fontSize: 16.sp,
), height: 1.4,
), ),
SizedBox(height: 48.h), ),
SizedBox(height: 48.h),
// ===== OTP INPUT FIELDS ===== // ===== OTP INPUT FIELDS =====
OtpTextField( Pinput(
numberOfFields: 6, length: 6,
borderColor: AppColors.borderGrey, defaultPinTheme: PinTheme(
focusedBorderColor: AppColors.primaryRed, width: 48.w,
showFieldAsBox: true, height: 52.h,
fieldWidth: 45.w,
borderRadius: BorderRadius.circular(12.r),
enabledBorderColor: AppColors.borderGrey,
cursorColor: AppColors.primaryRed,
textStyle: GoogleFonts.poppins( textStyle: GoogleFonts.poppins(
fontSize: 18.sp, fontSize: 18.sp,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: AppColors.black, color: AppColors.black,
), ),
onCodeChanged: (String code) { decoration: BoxDecoration(
context.read<VerifyOtpBloc>().add( borderRadius: BorderRadius.circular(12.r),
OtpChanged(otp: code), border: Border.all(color: AppColors.borderGrey),
); ),
},
onSubmit: (String verificationCode) {
if (isLoading) return;
context.read<VerifyOtpBloc>().add(
OtpChanged(otp: verificationCode),
);
context.read<VerifyOtpBloc>().add(
VerifyOtpSubmitted(
emailAddress: email,
otp: verificationCode,
),
);
},
), ),
], focusedPinTheme: PinTheme(
), width: 48.w,
), height: 52.h,
), textStyle: GoogleFonts.poppins(
fontSize: 18.sp,
// ===== VERIFY BUTTON ===== fontWeight: FontWeight.w600,
CustomButton( color: AppColors.black,
text: "Verify", ),
isLoading: isLoading, decoration: BoxDecoration(
onPressed: state.otp.length == 6 && !isLoading borderRadius: BorderRadius.circular(12.r),
? () { border: Border.all(color: AppColors.primaryRed),
),
),
submittedPinTheme: PinTheme(
width: 48.w,
height: 52.h,
textStyle: GoogleFonts.poppins(
fontSize: 18.sp,
fontWeight: FontWeight.w600,
color: AppColors.black,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.r),
border: Border.all(color: AppColors.borderGrey),
),
),
onChanged: (String code) {
context.read<VerifyOtpBloc>().add(
OtpChanged(otp: code),
);
},
onCompleted: (String verificationCode) {
context.read<VerifyOtpBloc>().add( context.read<VerifyOtpBloc>().add(
VerifyOtpSubmitted( VerifyOtpSubmitted(
emailAddress: email, emailAddress: email,
otp: state.otp, otp: verificationCode,
), ),
); );
} },
: null, ),
],
),
), ),
SizedBox(height: 24.h), ),
],
), // ===== VERIFY BUTTON =====
BlocBuilder<VerifyOtpBloc, VerifyOtpState>(
buildWhen: (previous, current) =>
previous.otp.length != current.otp.length ||
previous.status != current.status,
builder: (context, state) {
final isLoading = state.status == VerifyOtpStatus.loading;
return CustomButton(
text: "Verify",
isLoading: isLoading,
onPressed: state.otp.length == 6 && !isLoading
? () {
context.read<VerifyOtpBloc>().add(
VerifyOtpSubmitted(
emailAddress: email,
otp: state.otp,
),
);
}
: null,
);
},
),
SizedBox(height: 24.h),
],
), ),
); ),
}, ),
), ),
), ),
); );

View File

@@ -70,6 +70,29 @@ class _ResetPasswordPageState extends State<ResetPasswordPage> {
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
child: Scaffold( child: Scaffold(
backgroundColor: AppColors.backgroundWhite, backgroundColor: AppColors.backgroundWhite,
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
leadingWidth: 70.w,
leading: Padding(
padding: EdgeInsets.only(left: 24.w, top: 8.h, bottom: 8.h),
child: InkWell(
onTap: () => Navigator.pop(context),
borderRadius: BorderRadius.circular(50),
child: Container(
decoration: const BoxDecoration(
color: AppColors.primaryRed,
shape: BoxShape.circle,
),
child: Icon(
Icons.arrow_back_ios_new,
color: Colors.white,
size: 18.sp,
),
),
),
),
),
body: BlocConsumer<ResetPasswordBloc, ResetPasswordState>( body: BlocConsumer<ResetPasswordBloc, ResetPasswordState>(
listener: (context, state) { listener: (context, state) {
if (state.status == ResetPasswordStatus.success) { if (state.status == ResetPasswordStatus.success) {
@@ -105,7 +128,7 @@ class _ResetPasswordPageState extends State<ResetPasswordPage> {
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
children: [ children: [
SizedBox(height: 40.h), SizedBox(height: 10.h),
// ===== LOGO SECTION ===== // ===== LOGO SECTION =====
Center( Center(
child: Column( child: Column(

View File

@@ -1,8 +1,8 @@
class ApiUrls { class ApiUrls {
// static const baseUrl = "https://devapi.citycards.betadelivery.com"; // Normal API // static const baseUrl = "https://devapi.citycards.betadelivery.com"; // Normal API
static const baseUrl = "https://testingapi.citycards.betadelivery.com"; // Test API // static const baseUrl = "https://testingapi.citycards.betadelivery.com"; // Test API
// static const baseUrl = "https://uatapi.citycard.betadelivery.com"; // Production Lvl API static const baseUrl = "https://uatapi.citycard.betadelivery.com"; // Production Lvl API
static const refreshToken = "$baseUrl/partner/auth/refresh"; static const refreshToken = "$baseUrl/partner/auth/refresh";

View File

@@ -7,6 +7,7 @@ import '../blocs/profile/profile_bloc.dart';
import '../blocs/profile/profile_event.dart'; import '../blocs/profile/profile_event.dart';
import '../blocs/profile/profile_state.dart'; import '../blocs/profile/profile_state.dart';
import '../models/profile_model.dart'; // Import UserDetails model import '../models/profile_model.dart'; // Import UserDetails model
import '../../login/blocs/login/login_bloc.dart';
class ProfileScreen extends StatelessWidget { class ProfileScreen extends StatelessWidget {
const ProfileScreen({super.key}); const ProfileScreen({super.key});
@@ -192,6 +193,7 @@ class ProfileScreen extends StatelessWidget {
child: ElevatedButton( child: ElevatedButton(
onPressed: () { onPressed: () {
LocalPreference.clearAllExceptOnBoarding(); LocalPreference.clearAllExceptOnBoarding();
context.read<LoginBloc>().add(const LoginReset());
Navigator.pushNamedAndRemoveUntil( Navigator.pushNamedAndRemoveUntil(
context, context,
AppRouter.login, AppRouter.login,

View File

@@ -21,6 +21,7 @@ class SubmitQrCodeBloc
SubmitQrCodeEventTriggered event, SubmitQrCodeEventTriggered event,
Emitter<SubmitQrCodeState> emit, Emitter<SubmitQrCodeState> emit,
) async { ) async {
if (state is SubmitQrCodeLoading) return;
if (event.qrCode.trim().isEmpty) { if (event.qrCode.trim().isEmpty) {
emit(const SubmitQrCodeFailure( emit(const SubmitQrCodeFailure(
errorMessage: 'QR code cannot be empty')); errorMessage: 'QR code cannot be empty'));

View File

@@ -24,6 +24,7 @@ class _QrScanScreenState extends State<QrScanScreen>
late MobileScannerController _cameraController; late MobileScannerController _cameraController;
final ValueNotifier<bool> _isTorchOn = ValueNotifier(false); final ValueNotifier<bool> _isTorchOn = ValueNotifier(false);
bool _cameraAvailable = true; bool _cameraAvailable = true;
bool _isScanProcessing = false;
final sheetContentKey = GlobalKey(); final sheetContentKey = GlobalKey();
final ValueNotifier<double> sheetExtent = ValueNotifier(0.5); final ValueNotifier<double> sheetExtent = ValueNotifier(0.5);
@@ -85,6 +86,7 @@ class _QrScanScreenState extends State<QrScanScreen>
if (!mounted || !_cameraAvailable) return; if (!mounted || !_cameraAvailable) return;
try { try {
_isScanProcessing = false; // Reset flag when camera starts
if (!_cameraController.value.isStarting) { if (!_cameraController.value.isStarting) {
await _cameraController.start(); await _cameraController.start();
} }
@@ -179,22 +181,25 @@ class _QrScanScreenState extends State<QrScanScreen>
/// 📷 QR Scanner /// 📷 QR Scanner
MobileScanner( MobileScanner(
controller: _cameraController, controller: _cameraController,
fit: BoxFit.cover, fit: BoxFit.cover,
onDetect: (capture) { onDetect: (capture) {
final barcode = if (_isScanProcessing) return;
capture.barcodes.first.rawValue ?? '';
if (barcode.isNotEmpty && final barcode =
state is! SubmitQrCodeLoading && capture.barcodes.first.rawValue ?? '';
state is SubmitQrCodeInitial) { if (barcode.isNotEmpty &&
final extractedCode = _extractQrCode(barcode); state is! SubmitQrCodeLoading &&
_cameraController.stop(); state is SubmitQrCodeInitial) {
context.read<SubmitQrCodeBloc>().add( _isScanProcessing = true;
SubmitQrCodeEventTriggered( final extractedCode = _extractQrCode(barcode);
qrCode: extractedCode)); _cameraController.stop();
} context.read<SubmitQrCodeBloc>().add(
}, SubmitQrCodeEventTriggered(
), qrCode: extractedCode));
}
},
),
/// 🔲 Scanner Frame /// 🔲 Scanner Frame
if (_cameraAvailable) if (_cameraAvailable)

View File

@@ -197,10 +197,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: file_picker name: file_picker
sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343" sha256: f2d9f173c2c14635cc0e9b14c143c49ef30b4934e8d1d274d6206fcb0086a06f
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.3.10" version: "10.3.3"
file_selector_linux: file_selector_linux:
dependency: transitive dependency: transitive
description: description:
@@ -270,14 +270,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.7" version: "2.4.7"
flutter_otp_text_field:
dependency: "direct main"
description:
name: flutter_otp_text_field
sha256: e7e589dc51cde120d63da6db55f3cef618f5d013d12adba76137ca1a51ce1390
url: "https://pub.dev"
source: hosted
version: "1.5.1+1"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
dependency: transitive dependency: transitive
description: description:
@@ -568,6 +560,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.0.1" version: "7.0.1"
pinput:
dependency: "direct main"
description:
name: pinput
sha256: "4c3f1b84768b47a56a1abdaca551bd7cef4ac673b882209039ecdf803a5d6e68"
url: "https://pub.dev"
source: hosted
version: "6.0.2"
platform: platform:
dependency: transitive dependency: transitive
description: description:
@@ -737,10 +737,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "19a78f63e83d3a61f00826d09bc2f60e191bf3504183c001262be6ac75589fb8" sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.8" version: "0.7.9"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:

View File

@@ -37,7 +37,6 @@ dependencies:
cupertino_icons: ^1.0.8 cupertino_icons: ^1.0.8
google_fonts: ^6.3.2 google_fonts: ^6.3.2
flutter_bloc: ^9.1.1 flutter_bloc: ^9.1.1
flutter_otp_text_field: ^1.5.1+1
intl: ^0.20.2 intl: ^0.20.2
table_calendar: ^3.2.0 table_calendar: ^3.2.0
file_picker: ^10.3.3 file_picker: ^10.3.3
@@ -52,6 +51,7 @@ dependencies:
dio_cookie_manager: ^3.4.0 dio_cookie_manager: ^3.4.0
cookie_jar: ^4.0.9 cookie_jar: ^4.0.9
image_picker: ^1.2.1 image_picker: ^1.2.1
pinput: ^6.0.2
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: