From 8dca2c3d026d76e922ba73f630d672eccac96c12 Mon Sep 17 00:00:00 2001 From: Adam Carbone Date: Wed, 17 Apr 2024 19:50:50 -0400 Subject: [PATCH 1/5] Removing all of the project generated code... this will all be added when the new project is created in the IDE, I want this repo to only contain the base code and settings to start the project. --- android/.gitignore | 13 - android/app/build.gradle | 67 -- android/app/src/debug/AndroidManifest.xml | 7 - android/app/src/main/AndroidManifest.xml | 33 - .../MainActivity.kt | 6 - .../res/drawable-v21/launch_background.xml | 12 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values-night/styles.xml | 18 - android/app/src/main/res/values/styles.xml | 18 - android/app/src/profile/AndroidManifest.xml | 7 - android/build.gradle | 31 - android/gradle.properties | 3 - .../gradle/wrapper/gradle-wrapper.properties | 5 - android/settings.gradle | 20 - ios/.gitignore | 34 - ios/Flutter/AppFrameworkInfo.plist | 26 - ios/Flutter/Debug.xcconfig | 2 - ios/Flutter/Release.xcconfig | 2 - ios/Podfile | 63 -- ios/Podfile.lock | 154 ---- ios/Runner.xcodeproj/project.pbxproj | 577 ------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 87 -- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - ios/Runner/AppDelegate.swift | 13 - .../AppIcon.appiconset/Contents.json | 122 --- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 - ios/Runner/Base.lproj/Main.storyboard | 26 - ios/Runner/Info.plist | 51 -- ios/Runner/Runner-Bridging-Header.h | 1 - macos/.gitignore | 7 - macos/Flutter/Flutter-Debug.xcconfig | 2 - macos/Flutter/Flutter-Release.xcconfig | 2 - macos/Flutter/GeneratedPluginRegistrant.swift | 20 - macos/Podfile | 64 -- macos/Podfile.lock | 138 --- macos/Runner.xcodeproj/project.pbxproj | 819 ------------------ .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 98 --- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - macos/Runner/AppDelegate.swift | 9 - .../AppIcon.appiconset/Contents.json | 68 -- .../AppIcon.appiconset/app_icon_1024.png | Bin 102994 -> 0 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 5680 -> 0 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 520 -> 0 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 14142 -> 0 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 1066 -> 0 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 36406 -> 0 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 2218 -> 0 bytes macos/Runner/Base.lproj/MainMenu.xib | 343 -------- macos/Runner/Configs/AppInfo.xcconfig | 14 - macos/Runner/Configs/Debug.xcconfig | 2 - macos/Runner/Configs/Release.xcconfig | 2 - macos/Runner/Configs/Warnings.xcconfig | 13 - macos/Runner/DebugProfile.entitlements | 16 - macos/Runner/Info.plist | 32 - macos/Runner/MainFlutterWindow.swift | 15 - macos/Runner/Release.entitlements | 12 - macos/RunnerTests/RunnerTests.swift | 12 - web/favicon.png | Bin 917 -> 0 bytes web/icons/Icon-192.png | Bin 5292 -> 0 bytes web/icons/Icon-512.png | Bin 8252 -> 0 bytes web/icons/Icon-maskable-192.png | Bin 5594 -> 0 bytes web/icons/Icon-maskable-512.png | Bin 20998 -> 0 bytes web/index.html | 58 -- web/manifest.json | 35 - 96 files changed, 3331 deletions(-) delete mode 100644 android/.gitignore delete mode 100644 android/app/build.gradle delete mode 100644 android/app/src/debug/AndroidManifest.xml delete mode 100644 android/app/src/main/AndroidManifest.xml delete mode 100644 android/app/src/main/kotlin/com/example/starter_architecture_flutter_firebase/MainActivity.kt delete mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml delete mode 100644 android/app/src/main/res/drawable/launch_background.xml delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/values-night/styles.xml delete mode 100644 android/app/src/main/res/values/styles.xml delete mode 100644 android/app/src/profile/AndroidManifest.xml delete mode 100644 android/build.gradle delete mode 100644 android/gradle.properties delete mode 100644 android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 android/settings.gradle delete mode 100644 ios/.gitignore delete mode 100644 ios/Flutter/AppFrameworkInfo.plist delete mode 100644 ios/Flutter/Debug.xcconfig delete mode 100644 ios/Flutter/Release.xcconfig delete mode 100644 ios/Podfile delete mode 100644 ios/Podfile.lock delete mode 100644 ios/Runner.xcodeproj/project.pbxproj delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 ios/Runner/AppDelegate.swift delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 ios/Runner/Base.lproj/Main.storyboard delete mode 100644 ios/Runner/Info.plist delete mode 100644 ios/Runner/Runner-Bridging-Header.h delete mode 100644 macos/.gitignore delete mode 100644 macos/Flutter/Flutter-Debug.xcconfig delete mode 100644 macos/Flutter/Flutter-Release.xcconfig delete mode 100644 macos/Flutter/GeneratedPluginRegistrant.swift delete mode 100644 macos/Podfile delete mode 100644 macos/Podfile.lock delete mode 100644 macos/Runner.xcodeproj/project.pbxproj delete mode 100644 macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 macos/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 macos/Runner/AppDelegate.swift delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png delete mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png delete mode 100644 macos/Runner/Base.lproj/MainMenu.xib delete mode 100644 macos/Runner/Configs/AppInfo.xcconfig delete mode 100644 macos/Runner/Configs/Debug.xcconfig delete mode 100644 macos/Runner/Configs/Release.xcconfig delete mode 100644 macos/Runner/Configs/Warnings.xcconfig delete mode 100644 macos/Runner/DebugProfile.entitlements delete mode 100644 macos/Runner/Info.plist delete mode 100644 macos/Runner/MainFlutterWindow.swift delete mode 100644 macos/Runner/Release.entitlements delete mode 100644 macos/RunnerTests/RunnerTests.swift delete mode 100644 web/favicon.png delete mode 100644 web/icons/Icon-192.png delete mode 100644 web/icons/Icon-512.png delete mode 100644 web/icons/Icon-maskable-192.png delete mode 100644 web/icons/Icon-maskable-512.png delete mode 100644 web/index.html delete mode 100644 web/manifest.json diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index 6f568019..00000000 --- a/android/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties -**/*.keystore -**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index 2c6b23e4..00000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,67 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - id "dev.flutter.flutter-gradle-plugin" -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -android { - namespace "com.example.starter_architecture_flutter_firebase" - compileSdkVersion flutter.compileSdkVersion - ndkVersion flutter.ndkVersion - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = '1.8' - } - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.starter_architecture_flutter_firebase" - // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger() - targetSdkVersion localProperties.getProperty('flutter.targetSdkVersion').toInteger() - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies {} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 399f6981..00000000 --- a/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index be681d49..00000000 --- a/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - diff --git a/android/app/src/main/kotlin/com/example/starter_architecture_flutter_firebase/MainActivity.kt b/android/app/src/main/kotlin/com/example/starter_architecture_flutter_firebase/MainActivity.kt deleted file mode 100644 index 057eaaf7..00000000 --- a/android/app/src/main/kotlin/com/example/starter_architecture_flutter_firebase/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.starter_architecture_flutter_firebase - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() { -} diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index f74085f3..00000000 --- a/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f8..00000000 --- a/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 06952be7..00000000 --- a/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml deleted file mode 100644 index cb1ef880..00000000 --- a/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 399f6981..00000000 --- a/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index f7eb7f63..00000000 --- a/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/android/gradle.properties b/android/gradle.properties deleted file mode 100644 index 94adc3a3..00000000 --- a/android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 3c472b99..00000000 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index 55c4ca8b..00000000 --- a/android/settings.gradle +++ /dev/null @@ -1,20 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - } - settings.ext.flutterSdkPath = flutterSdkPath() - - includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") - - plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false - } -} - -include ":app" - -apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/ios/.gitignore b/ios/.gitignore deleted file mode 100644 index 7a7f9873..00000000 --- a/ios/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -**/dgph -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/ephemeral/ -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 9625e105..00000000 --- a/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 11.0 - - diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig deleted file mode 100644 index ec97fc6f..00000000 --- a/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig deleted file mode 100644 index c4855bfe..00000000 --- a/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile deleted file mode 100644 index 1271d919..00000000 --- a/ios/Podfile +++ /dev/null @@ -1,63 +0,0 @@ -# Uncomment this line to define a global platform for your project -platform :ios, '11.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '10.18.0' - use_frameworks! - use_modular_headers! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) -end - -post_install do |installer| - # Ensure pods also use the minimum deployment target set above - # https://stackoverflow.com/a/64385584/436422 - puts 'Determining pod project minimum deployment target' - - pods_project = installer.pods_project - deployment_target_key = 'IPHONEOS_DEPLOYMENT_TARGET' - deployment_targets = pods_project.build_configurations.map{ |config| config.build_settings[deployment_target_key] } - minimum_deployment_target = deployment_targets.min_by{ |version| Gem::Version.new(version) } - - puts 'Minimal deployment target is ' + minimum_deployment_target - puts 'Setting each pod deployment target to ' + minimum_deployment_target - - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - target.build_configurations.each do |config| - #config.build_settings['ENABLE_BITCODE'] = 'NO' - config.build_settings[deployment_target_key] = minimum_deployment_target - # https://stackoverflow.com/a/77142190 - xcconfig_path = config.base_configuration_reference.real_path - xcconfig = File.read(xcconfig_path) - xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR") - File.open(xcconfig_path, "w") { |file| file << xcconfig_mod } - end - end -end diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index 03e6925f..00000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,154 +0,0 @@ -PODS: - - cloud_firestore (4.14.0): - - Firebase/Firestore (= 10.18.0) - - firebase_core - - Flutter - - nanopb (< 2.30910.0, >= 2.30908.0) - - desktop_webview_auth (0.0.1): - - Flutter - - Firebase/Auth (10.18.0): - - Firebase/CoreOnly - - FirebaseAuth (~> 10.18.0) - - Firebase/CoreOnly (10.18.0): - - FirebaseCore (= 10.18.0) - - Firebase/DynamicLinks (10.18.0): - - Firebase/CoreOnly - - FirebaseDynamicLinks (~> 10.18.0) - - Firebase/Firestore (10.18.0): - - Firebase/CoreOnly - - FirebaseFirestore (~> 10.18.0) - - firebase_auth (4.16.0): - - Firebase/Auth (= 10.18.0) - - firebase_core - - Flutter - - firebase_core (2.24.2): - - Firebase/CoreOnly (= 10.18.0) - - Flutter - - firebase_dynamic_links (5.4.8): - - Firebase/DynamicLinks (= 10.18.0) - - firebase_core - - Flutter - - FirebaseAppCheckInterop (10.19.0) - - FirebaseAuth (10.18.0): - - FirebaseAppCheckInterop (~> 10.17) - - FirebaseCore (~> 10.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/Environment (~> 7.8) - - GTMSessionFetcher/Core (< 4.0, >= 2.1) - - RecaptchaInterop (~> 100.0) - - FirebaseCore (10.18.0): - - FirebaseCoreInternal (~> 10.0) - - GoogleUtilities/Environment (~> 7.12) - - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreInternal (10.19.0): - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseDynamicLinks (10.18.0): - - FirebaseCore (~> 10.0) - - FirebaseFirestore (10.18.0): - - FirebaseFirestore/AutodetectLeveldb (= 10.18.0) - - FirebaseFirestore/AutodetectLeveldb (10.18.0): - - FirebaseFirestore/Base - - FirebaseFirestore/WithLeveldb - - FirebaseFirestore/Base (10.18.0) - - FirebaseFirestore/WithLeveldb (10.18.0): - - FirebaseFirestore/Base - - Flutter (1.0.0) - - GoogleUtilities/AppDelegateSwizzler (7.12.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (7.12.0): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.12.0): - - GoogleUtilities/Environment - - GoogleUtilities/Network (7.12.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.12.0)" - - GoogleUtilities/Reachability (7.12.0): - - GoogleUtilities/Logger - - GTMSessionFetcher/Core (3.2.0) - - nanopb (2.30909.1): - - nanopb/decode (= 2.30909.1) - - nanopb/encode (= 2.30909.1) - - nanopb/decode (2.30909.1) - - nanopb/encode (2.30909.1) - - PromisesObjC (2.3.1) - - RecaptchaInterop (100.0.0) - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - -DEPENDENCIES: - - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) - - desktop_webview_auth (from `.symlinks/plugins/desktop_webview_auth/ios`) - - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_dynamic_links (from `.symlinks/plugins/firebase_dynamic_links/ios`) - - FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `10.18.0`) - - Flutter (from `Flutter`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseAppCheckInterop - - FirebaseAuth - - FirebaseCore - - FirebaseCoreInternal - - FirebaseDynamicLinks - - GoogleUtilities - - GTMSessionFetcher - - nanopb - - PromisesObjC - - RecaptchaInterop - -EXTERNAL SOURCES: - cloud_firestore: - :path: ".symlinks/plugins/cloud_firestore/ios" - desktop_webview_auth: - :path: ".symlinks/plugins/desktop_webview_auth/ios" - firebase_auth: - :path: ".symlinks/plugins/firebase_auth/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_dynamic_links: - :path: ".symlinks/plugins/firebase_dynamic_links/ios" - FirebaseFirestore: - :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git - :tag: 10.18.0 - Flutter: - :path: Flutter - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - -CHECKOUT OPTIONS: - FirebaseFirestore: - :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git - :tag: 10.18.0 - -SPEC CHECKSUMS: - cloud_firestore: 73eece22ce25a0565238c283ee9990f1618d8063 - desktop_webview_auth: d645139460ef203d50bd0cdb33356785dd939cce - Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 - firebase_auth: 8e9ec02991ca4659111cc671c84d0c010b6bfb26 - firebase_core: 0af4a2b24f62071f9bf283691c0ee41556dcb3f5 - firebase_dynamic_links: b626a11f5eb02033981ae377377c3f297eb4c1b0 - FirebaseAppCheckInterop: 37884781f3e16a1ba47e7ec80a1e805f987788e3 - FirebaseAuth: 12314b438fa76048540c8fb86d6cfc9e08595176 - FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f - FirebaseCoreInternal: b444828ea7cfd594fca83046b95db98a2be4f290 - FirebaseDynamicLinks: c37307441c53838d66a9650dabca9e0459502527 - FirebaseFirestore: 584e3f563142f63d20e9ec9c505370d674d44eba - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 - GTMSessionFetcher: 41b9ef0b4c08a6db4b7eb51a21ae5183ec99a2c8 - nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 - PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 - shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 - -PODFILE CHECKSUM: 960305be9bb7690791069373e00dd3df7a0aae70 - -COCOAPODS: 1.14.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 0f6ca4ee..00000000 --- a/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,577 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - FDFBBE3698D6DEE111B2295A /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE5E729672CE82DA371BE171 /* Pods_Runner.framework */; }; - FEBDC9609C680EC02937034B /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = D4DF1EAB0E660ABB5816D63F /* GoogleService-Info.plist */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4717B7480637AA09CAEB3FC0 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 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 = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B1282A8CCA46FCB860DC6348 /* 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 = ""; }; - BE5E729672CE82DA371BE171 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D1CF56C09A84454F93ABC256 /* 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 = ""; }; - D4DF1EAB0E660ABB5816D63F /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - FDFBBE3698D6DEE111B2295A /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - D4DF1EAB0E660ABB5816D63F /* GoogleService-Info.plist */, - F90C4DD405ACFD15095CAEB7 /* Pods */, - BB5370A4696621AC47A50471 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; - BB5370A4696621AC47A50471 /* Frameworks */ = { - isa = PBXGroup; - children = ( - BE5E729672CE82DA371BE171 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - F90C4DD405ACFD15095CAEB7 /* Pods */ = { - isa = PBXGroup; - children = ( - B1282A8CCA46FCB860DC6348 /* Pods-Runner.debug.xcconfig */, - 4717B7480637AA09CAEB3FC0 /* Pods-Runner.release.xcconfig */, - D1CF56C09A84454F93ABC256 /* Pods-Runner.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 703CB65CA5A94374E71D4B9A /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 48CDBEA72553743FA74C2372 /* [CP] Embed Pods Frameworks */, - 3FB93D246001D3A79E3BB749 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1430; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - FEBDC9609C680EC02937034B /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 3FB93D246001D3A79E3BB749 /* [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; - }; - 48CDBEA72553743FA74C2372 /* [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; - }; - 703CB65CA5A94374E71D4B9A /* [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; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = M54ZVB688G; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.starterArchitectureFlutterFirebase; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = M54ZVB688G; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.starterArchitectureFlutterFirebase; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = M54ZVB688G; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.starterArchitectureFlutterFirebase; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a6..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index a6b826db..00000000 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14..00000000 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift deleted file mode 100644 index 70693e4a..00000000 --- a/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import UIKit -import Flutter - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab..00000000 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4725e9b0ddb1deab583e5b5102493aa332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10932 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 zcmds$`#;kQ7{|XelZftyR5~xW7?MLxS4^|Hw3&P7^y)@A9Fj{Xm1~_CIV^XZ%SLBn zA;!r`GqGHg=7>xrB{?psZQs88ZaedDoagm^KF{a*>G|dJWRSe^I$DNW008I^+;Kjt z>9p3GNR^I;v>5_`+91i(*G;u5|L+Bu6M=(afLjtkya#yZ175|z$pU~>2#^Z_pCZ7o z1c6UNcv2B3?; zX%qdxCXQpdKRz=#b*q0P%b&o)5ZrNZt7$fiETSK_VaY=mb4GK`#~0K#~9^ zcY!`#Af+4h?UMR-gMKOmpuYeN5P*RKF!(tb`)oe0j2BH1l?=>y#S5pMqkx6i{*=V9JF%>N8`ewGhRE(|WohnD59R^$_36{4>S zDFlPC5|k?;SPsDo87!B{6*7eqmMdU|QZ84>6)Kd9wNfh90=y=TFQay-0__>=<4pk& zYDjgIhL-jQ9o>z32K)BgAH+HxamL{ZL~ozu)Qqe@a`FpH=oQRA8=L-m-1dam(Ix2V z?du;LdMO+ooBelr^_y4{|44tmgH^2hSzPFd;U^!1p>6d|o)(-01z{i&Kj@)z-yfWQ)V#3Uo!_U}q3u`(fOs`_f^ueFii1xBNUB z6MecwJN$CqV&vhc+)b(p4NzGGEgwWNs z@*lUV6LaduZH)4_g!cE<2G6#+hJrWd5(|p1Z;YJ7ifVHv+n49btR}dq?HHDjl{m$T z!jLZcGkb&XS2OG~u%&R$(X+Z`CWec%QKt>NGYvd5g20)PU(dOn^7%@6kQb}C(%=vr z{?RP(z~C9DPnL{q^@pVw@|Vx~@3v!9dCaBtbh2EdtoNHm4kGxp>i#ct)7p|$QJs+U z-a3qtcPvhihub?wnJqEt>zC@)2suY?%-96cYCm$Q8R%-8$PZYsx3~QOLMDf(piXMm zB=<63yQk1AdOz#-qsEDX>>c)EES%$owHKue;?B3)8aRd}m~_)>SL3h2(9X;|+2#7X z+#2)NpD%qJvCQ0a-uzZLmz*ms+l*N}w)3LRQ*6>|Ub-fyptY(keUxw+)jfwF5K{L9 z|Cl_w=`!l_o><384d&?)$6Nh(GAm=4p_;{qVn#hI8lqewW7~wUlyBM-4Z|)cZr?Rh z=xZ&Ol>4(CU85ea(CZ^aO@2N18K>ftl8>2MqetAR53_JA>Fal`^)1Y--Am~UDa4th zKfCYpcXky$XSFDWBMIl(q=Mxj$iMBX=|j9P)^fDmF(5(5$|?Cx}DKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q z?YG}tx;sY@GzMmsY`7r$P+F_YLz)(e}% zyakqFB<6|x9R#TdoP{R$>o7y(-`$$p0NxJ6?2B8tH)4^yF(WhqGZlM3=9Ibs$%U1w zWzcss*_c0=v_+^bfb`kBFsI`d;ElwiU%frgRB%qBjn@!0U2zZehBn|{%uNIKBA7n= zzE`nnwTP85{g;8AkYxA68>#muXa!G>xH22D1I*SiD~7C?7Za+9y7j1SHiuSkKK*^O zsZ==KO(Ua#?YUpXl{ViynyT#Hzk=}5X$e04O@fsMQjb}EMuPWFO0e&8(2N(29$@Vd zn1h8Yd>6z(*p^E{c(L0Lg=wVdupg!z@WG;E0k|4a%s7Up5C0c)55XVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~tSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Y zu$JOl0b83zu$JMvy<#oH^Wl>aWL*?aDwnS0iEAwC?DK@aT)GHRLhnz2WCvf3Ba;o=aY7 z2{Asu5MEjGOY4O#Ggz@@J;q*0`kd2n8I3BeNuMmYZf{}pg=jTdTCrIIYuW~luKecn z+E-pHY%ohj@uS0%^ z&(OxwPFPD$+#~`H?fMvi9geVLci(`K?Kj|w{rZ9JgthFHV+=6vMbK~0)Ea<&WY-NC zy-PnZft_k2tfeQ*SuC=nUj4H%SQ&Y$gbH4#2sT0cU0SdFs=*W*4hKGpuR1{)mV;Qf5pw4? zfiQgy0w3fC*w&Bj#{&=7033qFR*<*61B4f9K%CQvxEn&bsWJ{&winp;FP!KBj=(P6 z4Z_n4L7cS;ao2)ax?Tm|I1pH|uLpDSRVghkA_UtFFuZ0b2#>!8;>-_0ELjQSD-DRd z4im;599VHDZYtnWZGAB25W-e(2VrzEh|etsv2YoP#VbIZ{aFkwPrzJ#JvCvA*mXS& z`}Q^v9(W4GiSs}#s7BaN!WA2bniM$0J(#;MR>uIJ^uvgD3GS^%*ikdW6-!VFUU?JV zZc2)4cMsX@j z5HQ^e3BUzOdm}yC-xA%SY``k$rbfk z;CHqifhU*jfGM@DkYCecD9vl*qr58l6x<8URB=&%{!Cu3RO*MrKZ4VO}V6R0a zZw3Eg^0iKWM1dcTYZ0>N899=r6?+adUiBKPciJw}L$=1f4cs^bio&cr9baLF>6#BM z(F}EXe-`F=f_@`A7+Q&|QaZ??Txp_dB#lg!NH=t3$G8&06MFhwR=Iu*Im0s_b2B@| znW>X}sy~m#EW)&6E&!*0%}8UAS)wjt+A(io#wGI@Z2S+Ms1Cxl%YVE800007ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b..00000000 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7..00000000 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516..00000000 --- a/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist deleted file mode 100644 index c38cd242..00000000 --- a/ios/Runner/Info.plist +++ /dev/null @@ -1,51 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Starter Architecture Flutter Firebase - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - starter_architecture_flutter_firebase - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - - - diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 308a2a56..00000000 --- a/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1 +0,0 @@ -#import "GeneratedPluginRegistrant.h" diff --git a/macos/.gitignore b/macos/.gitignore deleted file mode 100644 index 746adbb6..00000000 --- a/macos/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# Flutter-related -**/Flutter/ephemeral/ -**/Pods/ - -# Xcode-related -**/dgph -**/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig deleted file mode 100644 index 4b81f9b2..00000000 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig deleted file mode 100644 index 5caa9d15..00000000 --- a/macos/Flutter/Flutter-Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift deleted file mode 100644 index 18ff6ea9..00000000 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// Generated file. Do not edit. -// - -import FlutterMacOS -import Foundation - -import cloud_firestore -import desktop_webview_auth -import firebase_auth -import firebase_core -import shared_preferences_foundation - -func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) - DesktopWebviewAuthPlugin.register(with: registry.registrar(forPlugin: "DesktopWebviewAuthPlugin")) - FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) - FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) - SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) -} diff --git a/macos/Podfile b/macos/Podfile deleted file mode 100644 index bf4565c5..00000000 --- a/macos/Podfile +++ /dev/null @@ -1,64 +0,0 @@ -platform :osx, '10.14' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_macos_podfile_setup - -target 'Runner' do - pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '10.18.0' - use_frameworks! - use_modular_headers! - - flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - # Ensure pods also use the minimum deployment target set above - # https://stackoverflow.com/a/64385584/436422 - puts 'Determining pod project minimum deployment target' - - pods_project = installer.pods_project - deployment_target_key = 'MACOSX_DEPLOYMENT_TARGET' - deployment_targets = pods_project.build_configurations.map{ |config| config.build_settings[deployment_target_key] } - minimum_deployment_target = deployment_targets.min_by{ |version| Gem::Version.new(version) } - - puts 'Minimal deployment target is ' + minimum_deployment_target - puts 'Setting each pod deployment target to ' + minimum_deployment_target - - installer.pods_project.targets.each do |target| - flutter_additional_macos_build_settings(target) - target.build_configurations.each do |config| - config.build_settings[deployment_target_key] = minimum_deployment_target - # https://stackoverflow.com/a/77142190 - xcconfig_path = config.base_configuration_reference.real_path - xcconfig = File.read(xcconfig_path) - xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR") - File.open(xcconfig_path, "w") { |file| file << xcconfig_mod } - end - end -end \ No newline at end of file diff --git a/macos/Podfile.lock b/macos/Podfile.lock deleted file mode 100644 index 5cb8829f..00000000 --- a/macos/Podfile.lock +++ /dev/null @@ -1,138 +0,0 @@ -PODS: - - cloud_firestore (4.14.0): - - Firebase/CoreOnly (~> 10.18.0) - - Firebase/Firestore (~> 10.18.0) - - firebase_core - - FlutterMacOS - - nanopb (< 2.30910.0, >= 2.30908.0) - - desktop_webview_auth (0.0.1): - - FlutterMacOS - - Firebase/Auth (10.18.0): - - Firebase/CoreOnly - - FirebaseAuth (~> 10.18.0) - - Firebase/CoreOnly (10.18.0): - - FirebaseCore (= 10.18.0) - - Firebase/Firestore (10.18.0): - - Firebase/CoreOnly - - FirebaseFirestore (~> 10.18.0) - - firebase_auth (4.16.0): - - Firebase/Auth (~> 10.18.0) - - Firebase/CoreOnly (~> 10.18.0) - - firebase_core - - FlutterMacOS - - firebase_core (2.24.2): - - Firebase/CoreOnly (~> 10.18.0) - - FlutterMacOS - - FirebaseAppCheckInterop (10.19.0) - - FirebaseAuth (10.18.0): - - FirebaseAppCheckInterop (~> 10.17) - - FirebaseCore (~> 10.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/Environment (~> 7.8) - - GTMSessionFetcher/Core (< 4.0, >= 2.1) - - RecaptchaInterop (~> 100.0) - - FirebaseCore (10.18.0): - - FirebaseCoreInternal (~> 10.0) - - GoogleUtilities/Environment (~> 7.12) - - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreInternal (10.19.0): - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseFirestore (10.18.0): - - FirebaseFirestore/AutodetectLeveldb (= 10.18.0) - - FirebaseFirestore/AutodetectLeveldb (10.18.0): - - FirebaseFirestore/Base - - FirebaseFirestore/WithLeveldb - - FirebaseFirestore/Base (10.18.0) - - FirebaseFirestore/WithLeveldb (10.18.0): - - FirebaseFirestore/Base - - FlutterMacOS (1.0.0) - - GoogleUtilities/AppDelegateSwizzler (7.12.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (7.12.0): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.12.0): - - GoogleUtilities/Environment - - GoogleUtilities/Network (7.12.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.12.0)" - - GoogleUtilities/Reachability (7.12.0): - - GoogleUtilities/Logger - - GTMSessionFetcher/Core (3.2.0) - - nanopb (2.30909.1): - - nanopb/decode (= 2.30909.1) - - nanopb/encode (= 2.30909.1) - - nanopb/decode (2.30909.1) - - nanopb/encode (2.30909.1) - - PromisesObjC (2.3.1) - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - -DEPENDENCIES: - - cloud_firestore (from `Flutter/ephemeral/.symlinks/plugins/cloud_firestore/macos`) - - desktop_webview_auth (from `Flutter/ephemeral/.symlinks/plugins/desktop_webview_auth/macos`) - - firebase_auth (from `Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos`) - - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) - - FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `10.18.0`) - - FlutterMacOS (from `Flutter/ephemeral`) - - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseAppCheckInterop - - FirebaseAuth - - FirebaseCore - - FirebaseCoreInternal - - GoogleUtilities - - GTMSessionFetcher - - nanopb - - PromisesObjC - -EXTERNAL SOURCES: - cloud_firestore: - :path: Flutter/ephemeral/.symlinks/plugins/cloud_firestore/macos - desktop_webview_auth: - :path: Flutter/ephemeral/.symlinks/plugins/desktop_webview_auth/macos - firebase_auth: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos - firebase_core: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos - FirebaseFirestore: - :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git - :tag: 10.18.0 - FlutterMacOS: - :path: Flutter/ephemeral - shared_preferences_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin - -CHECKOUT OPTIONS: - FirebaseFirestore: - :git: https://github.com/invertase/firestore-ios-sdk-frameworks.git - :tag: 10.18.0 - -SPEC CHECKSUMS: - cloud_firestore: c24b3cd9294b9e8a94fe8d03b34c5b3339f40204 - desktop_webview_auth: 9bba53a29c9bc6a4ff621fd0ebfbb18856c4dada - Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 - firebase_auth: 1d5713117a5a961e90b0bfd7766a7ec89c5a709f - firebase_core: a74ee8b3ab5f91ae6b73f4913eaca996c24458b6 - FirebaseAppCheckInterop: 37884781f3e16a1ba47e7ec80a1e805f987788e3 - FirebaseAuth: 12314b438fa76048540c8fb86d6cfc9e08595176 - FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f - FirebaseCoreInternal: b444828ea7cfd594fca83046b95db98a2be4f290 - FirebaseFirestore: 584e3f563142f63d20e9ec9c505370d674d44eba - FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 - GTMSessionFetcher: 41b9ef0b4c08a6db4b7eb51a21ae5183ec99a2c8 - nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 - PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 - -PODFILE CHECKSUM: ed25aa82c3d6dc904e5983ebb48866441998f773 - -COCOAPODS: 1.14.2 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 08af7ab6..00000000 --- a/macos/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,819 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXAggregateTarget section */ - 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; - buildPhases = ( - 33CC111E2044C6BF0003C045 /* ShellScript */, - ); - dependencies = ( - ); - name = "Flutter Assemble"; - productName = FLX; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 10B2BDCC19F5F8A769C75A69 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 956870BF59AE6EB524719E6F /* Pods_RunnerTests.framework */; }; - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 37AAE182D15FE04DBAC96973 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = EBC24CA94494A14C4790F8A7 /* GoogleService-Info.plist */; }; - 38A1088FCCD61196A9C6821F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B2FB2F95AEC928FDCDDC1F43 /* Pods_Runner.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC10EC2044A3C60003C045; - remoteInfo = Runner; - }; - 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC111A2044C6BA0003C045; - remoteInfo = FLX; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 33CC110E2044A8840003C045 /* Bundle Framework */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Bundle Framework"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* starter_architecture_flutter_firebase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = starter_architecture_flutter_firebase.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; - 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; - 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; - 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; - 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; - 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 4C2B59A97789E53D8DF5C8A0 /* 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 = ""; }; - 69CA1056711F241B75F50D1D /* 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 = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 7F84554EA89430C57B119361 /* 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 = ""; }; - 956870BF59AE6EB524719E6F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 956F465479A0D8247B273A1C /* 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 = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - B2FB2F95AEC928FDCDDC1F43 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BB5BDC00C993F90A2D1ED899 /* 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 = ""; }; - EBC24CA94494A14C4790F8A7 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; - F5D850A714A1FDE3B89655C2 /* 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 = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 331C80D2294CF70F00263BE5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 10B2BDCC19F5F8A769C75A69 /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EA2044A3C60003C045 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 38A1088FCCD61196A9C6821F /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C80D6294CF71000263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C80D7294CF71000263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 33BA886A226E78AF003329D5 /* Configs */ = { - isa = PBXGroup; - children = ( - 33E5194F232828860026EE4D /* AppInfo.xcconfig */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, - ); - path = Configs; - sourceTree = ""; - }; - 33CC10E42044A3C60003C045 = { - isa = PBXGroup; - children = ( - 33FAB671232836740065AC1E /* Runner */, - 33CEB47122A05771004F2AC0 /* Flutter */, - 331C80D6294CF71000263BE5 /* RunnerTests */, - 33CC10EE2044A3C60003C045 /* Products */, - D73912EC22F37F3D000D13A0 /* Frameworks */, - EBC24CA94494A14C4790F8A7 /* GoogleService-Info.plist */, - 582EA25906B0232CA7A84F0B /* Pods */, - ); - sourceTree = ""; - }; - 33CC10EE2044A3C60003C045 /* Products */ = { - isa = PBXGroup; - children = ( - 33CC10ED2044A3C60003C045 /* starter_architecture_flutter_firebase.app */, - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 33CC11242044D66E0003C045 /* Resources */ = { - isa = PBXGroup; - children = ( - 33CC10F22044A3C60003C045 /* Assets.xcassets */, - 33CC10F42044A3C60003C045 /* MainMenu.xib */, - 33CC10F72044A3C60003C045 /* Info.plist */, - ); - name = Resources; - path = ..; - sourceTree = ""; - }; - 33CEB47122A05771004F2AC0 /* Flutter */ = { - isa = PBXGroup; - children = ( - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, - ); - path = Flutter; - sourceTree = ""; - }; - 33FAB671232836740065AC1E /* Runner */ = { - isa = PBXGroup; - children = ( - 33CC10F02044A3C60003C045 /* AppDelegate.swift */, - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, - 33E51913231747F40026EE4D /* DebugProfile.entitlements */, - 33E51914231749380026EE4D /* Release.entitlements */, - 33CC11242044D66E0003C045 /* Resources */, - 33BA886A226E78AF003329D5 /* Configs */, - ); - path = Runner; - sourceTree = ""; - }; - 582EA25906B0232CA7A84F0B /* Pods */ = { - isa = PBXGroup; - children = ( - 69CA1056711F241B75F50D1D /* Pods-Runner.debug.xcconfig */, - BB5BDC00C993F90A2D1ED899 /* Pods-Runner.release.xcconfig */, - 7F84554EA89430C57B119361 /* Pods-Runner.profile.xcconfig */, - 4C2B59A97789E53D8DF5C8A0 /* Pods-RunnerTests.debug.xcconfig */, - F5D850A714A1FDE3B89655C2 /* Pods-RunnerTests.release.xcconfig */, - 956F465479A0D8247B273A1C /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; - D73912EC22F37F3D000D13A0 /* Frameworks */ = { - isa = PBXGroup; - children = ( - B2FB2F95AEC928FDCDDC1F43 /* Pods_Runner.framework */, - 956870BF59AE6EB524719E6F /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C80D4294CF70F00263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - B533C9439FDEA908B8868EF9 /* [CP] Check Pods Manifest.lock */, - 331C80D1294CF70F00263BE5 /* Sources */, - 331C80D2294CF70F00263BE5 /* Frameworks */, - 331C80D3294CF70F00263BE5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 331C80DA294CF71000263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 33CC10EC2044A3C60003C045 /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 91BFEA4BD51282DBBB9B7C63 /* [CP] Check Pods Manifest.lock */, - 33CC10E92044A3C60003C045 /* Sources */, - 33CC10EA2044A3C60003C045 /* Frameworks */, - 33CC10EB2044A3C60003C045 /* Resources */, - 33CC110E2044A8840003C045 /* Bundle Framework */, - 3399D490228B24CF009A79C7 /* ShellScript */, - A4E333A9A67E77DE18241AE2 /* [CP] Embed Pods Frameworks */, - 6E15F62152ED82F836F21AEA /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - 33CC11202044C79F0003C045 /* PBXTargetDependency */, - ); - name = Runner; - productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* starter_architecture_flutter_firebase.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 33CC10E52044A3C60003C045 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1430; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C80D4294CF70F00263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 33CC10EC2044A3C60003C045; - }; - 33CC10EC2044A3C60003C045 = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.Sandbox = { - enabled = 1; - }; - }; - }; - 33CC111A2044C6BA0003C045 = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 33CC10E42044A3C60003C045; - productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 33CC10EC2044A3C60003C045 /* Runner */, - 331C80D4294CF70F00263BE5 /* RunnerTests */, - 33CC111A2044C6BA0003C045 /* Flutter Assemble */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C80D3294CF70F00263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EB2044A3C60003C045 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, - 37AAE182D15FE04DBAC96973 /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; - }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, - ); - inputPaths = ( - Flutter/ephemeral/tripwire, - ); - outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; - }; - 6E15F62152ED82F836F21AEA /* [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; - }; - 91BFEA4BD51282DBBB9B7C63 /* [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; - }; - A4E333A9A67E77DE18241AE2 /* [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; - }; - B533C9439FDEA908B8868EF9 /* [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; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C80D1294CF70F00263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10E92044A3C60003C045 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC10EC2044A3C60003C045 /* Runner */; - targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; - }; - 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; - targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 33CC10F52044A3C60003C045 /* Base */, - ); - name = MainMenu.xib; - path = Runner; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 331C80DB294CF71000263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4C2B59A97789E53D8DF5C8A0 /* Pods-RunnerTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.starterArchitectureFlutterFirebase.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/starter_architecture_flutter_firebase.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/starter_architecture_flutter_firebase"; - }; - name = Debug; - }; - 331C80DC294CF71000263BE5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F5D850A714A1FDE3B89655C2 /* Pods-RunnerTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.starterArchitectureFlutterFirebase.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/starter_architecture_flutter_firebase.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/starter_architecture_flutter_firebase"; - }; - name = Release; - }; - 331C80DD294CF71000263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 956F465479A0D8247B273A1C /* Pods-RunnerTests.profile.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.starterArchitectureFlutterFirebase.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/starter_architecture_flutter_firebase.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/starter_architecture_flutter_firebase"; - }; - name = Profile; - }; - 338D0CE9231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Profile; - }; - 338D0CEA231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = M54ZVB688G; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Profile; - }; - 338D0CEB231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Profile; - }; - 33CC10F92044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 33CC10FA2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 33CC10FC2044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = M54ZVB688G; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 33CC10FD2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = M54ZVB688G; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 33CC111C2044C6BA0003C045 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 33CC111D2044C6BA0003C045 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C80DB294CF71000263BE5 /* Debug */, - 331C80DC294CF71000263BE5 /* Release */, - 331C80DD294CF71000263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10F92044A3C60003C045 /* Debug */, - 33CC10FA2044A3C60003C045 /* Release */, - 338D0CE9231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10FC2044A3C60003C045 /* Debug */, - 33CC10FD2044A3C60003C045 /* Release */, - 338D0CEA231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC111C2044C6BA0003C045 /* Debug */, - 33CC111D2044C6BA0003C045 /* Release */, - 338D0CEB231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 33CC10E52044A3C60003C045 /* Project object */; -} diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index bba88c4c..00000000 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14..00000000 --- a/macos/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift deleted file mode 100644 index d53ef643..00000000 --- a/macos/Runner/AppDelegate.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Cocoa -import FlutterMacOS - -@NSApplicationMain -class AppDelegate: FlutterAppDelegate { - override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { - return true - } -} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index a2ec33f1..00000000 --- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_64.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "2x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "1x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "2x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "1x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_1024.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100644 index 82b6f9d9a33e198f5747104729e1fcef999772a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png deleted file mode 100644 index 13b35eba55c6dabc3aac36f33d859266c18fa0d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5680 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 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png deleted file mode 100644 index 0a3f5fa40fb3d1e0710331a48de5d256da3f275d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 520 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 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png deleted file mode 100644 index 2f1632cfddf3d9dade342351e627a0a75609fb46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig deleted file mode 100644 index e8f175dd..00000000 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -// Application-level settings for the Runner target. -// -// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the -// future. If not, the values below would default to using the project name when this becomes a -// 'flutter create' template. - -// The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = starter_architecture_flutter_firebase - -// The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.example.starterArchitectureFlutterFirebase - -// The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2023 com.example. All rights reserved. diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig deleted file mode 100644 index 36b0fd94..00000000 --- a/macos/Runner/Configs/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Debug.xcconfig" -#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig deleted file mode 100644 index dff4f495..00000000 --- a/macos/Runner/Configs/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Release.xcconfig" -#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig deleted file mode 100644 index 42bcbf47..00000000 --- a/macos/Runner/Configs/Warnings.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings -GCC_WARN_UNDECLARED_SELECTOR = YES -CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES -CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CLANG_WARN_PRAGMA_PACK = YES -CLANG_WARN_STRICT_PROTOTYPES = YES -CLANG_WARN_COMMA = YES -GCC_WARN_STRICT_SELECTOR_MATCH = YES -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -GCC_WARN_SHADOW = YES -CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements deleted file mode 100644 index 1fbcb4ea..00000000 --- a/macos/Runner/DebugProfile.entitlements +++ /dev/null @@ -1,16 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.cs.allow-jit - - com.apple.security.network.client - - com.apple.security.network.server - - keychain-access-groups - - - diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist deleted file mode 100644 index 4789daa6..00000000 --- a/macos/Runner/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - $(PRODUCT_COPYRIGHT) - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift deleted file mode 100644 index 3cc05eb2..00000000 --- a/macos/Runner/MainFlutterWindow.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Cocoa -import FlutterMacOS - -class MainFlutterWindow: NSWindow { - override func awakeFromNib() { - let flutterViewController = FlutterViewController() - let windowFrame = self.frame - self.contentViewController = flutterViewController - self.setFrame(windowFrame, display: true) - - RegisterGeneratedPlugins(registry: flutterViewController) - - super.awakeFromNib() - } -} diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements deleted file mode 100644 index 225aa48b..00000000 --- a/macos/Runner/Release.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.network.client - - keychain-access-groups - - - diff --git a/macos/RunnerTests/RunnerTests.swift b/macos/RunnerTests/RunnerTests.swift deleted file mode 100644 index 5418c9f5..00000000 --- a/macos/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import FlutterMacOS -import Cocoa -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/web/favicon.png b/web/favicon.png deleted file mode 100644 index 8aaa46ac1ae21512746f852a42ba87e4165dfdd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png deleted file mode 100644 index b749bfef07473333cf1dd31e9eed89862a5d52aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5292 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 diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png deleted file mode 100644 index 88cfd48dff1169879ba46840804b412fe02fefd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8252 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 diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png deleted file mode 100644 index eb9b4d76e525556d5d89141648c724331630325d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png deleted file mode 100644 index d69c56691fbdb0b7efa65097c7cc1edac12a6d3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20998 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 MPgg&ebxsLQ025IeI{*Lx diff --git a/web/index.html b/web/index.html deleted file mode 100644 index be2be3bd..00000000 --- a/web/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - starter_architecture_flutter_firebase - - - - - - - - - - diff --git a/web/manifest.json b/web/manifest.json deleted file mode 100644 index c7f1a4ce..00000000 --- a/web/manifest.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "starter_architecture_flutter_firebase", - "short_name": "starter_architecture_flutter_firebase", - "start_url": ".", - "display": "standalone", - "background_color": "#0175C2", - "theme_color": "#0175C2", - "description": "A new Flutter project.", - "orientation": "portrait-primary", - "prefer_related_applications": false, - "icons": [ - { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" - }, - { - "src": "icons/Icon-maskable-192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "icons/Icon-maskable-512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ] -} From 9b6167d36b853e862f4b32bec47c4723ff42beb1 Mon Sep 17 00:00:00 2001 From: adam-carbone Date: Fri, 19 Apr 2024 11:30:36 -0400 Subject: [PATCH 2/5] Updating the starter to reflect the new package name --- bootstrap-with-starter-project.sh | 64 +++++++++++++ lib/main.dart | 10 +- lib/src/app.dart | 2 +- .../common_widgets/action_text_button.dart | 2 +- .../common_widgets/async_value_widget.dart | 2 +- .../common_widgets/custom_text_button.dart | 2 +- lib/src/common_widgets/date_time_picker.dart | 6 +- .../empty_placeholder_widget.dart | 8 +- .../common_widgets/list_items_builder.dart | 2 +- lib/src/common_widgets/primary_button.dart | 2 +- lib/src/common_widgets/responsive_center.dart | 2 +- .../responsive_scrollable_card.dart | 6 +- .../presentation/custom_profile_screen.dart | 2 +- .../presentation/custom_sign_in_screen.dart | 4 +- .../entries/application/entries_service.dart | 20 ++-- .../entries/data/entries_repository.dart | 8 +- .../entries/domain/daily_jobs_details.dart | 2 +- lib/src/features/entries/domain/entry.dart | 2 +- .../features/entries/domain/entry_job.dart | 4 +- .../entries/presentation/entries_screen.dart | 10 +- .../entry_screen/entry_screen.dart | 18 ++-- .../entry_screen/entry_screen_controller.dart | 8 +- .../features/jobs/data/jobs_repository.dart | 10 +- .../edit_job_screen/edit_job_screen.dart | 10 +- .../edit_job_screen_controller.dart | 8 +- .../job_entries_screen/entry_list_item.dart | 8 +- .../job_entries_screen/job_entries_list.dart | 14 +-- .../job_entries_list_controller.dart | 6 +- .../job_entries_screen.dart | 10 +- .../presentation/jobs_screen/jobs_screen.dart | 12 +-- .../jobs_screen/jobs_screen_controller.dart | 6 +- .../presentation/onboarding_controller.dart | 2 +- .../presentation/onboarding_screen.dart | 12 +-- lib/src/routing/app_router.dart | 32 +++---- lib/src/routing/app_startup.dart | 4 +- lib/src/routing/not_found_screen.dart | 2 +- .../scaffold_with_nested_navigation.dart | 2 +- lib/src/utils/async_value_ui.dart | 4 +- pubspec.lock | 92 +++++++++---------- pubspec.yaml | 2 +- test/src/features/jobs/domain/job_test.dart | 2 +- test/src/mocks.dart | 4 +- 42 files changed, 246 insertions(+), 182 deletions(-) create mode 100755 bootstrap-with-starter-project.sh diff --git a/bootstrap-with-starter-project.sh b/bootstrap-with-starter-project.sh new file mode 100755 index 00000000..c7e5c83e --- /dev/null +++ b/bootstrap-with-starter-project.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# Check if a destination path was provided +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +# Set the remote repository URL directly in the script +remote_repo_url="https://github.com/symphonize/flutter_starter_base_app.git" + +# Assign command line argument to variable for the destination path +destination_path="$1" + +# Expand the destination path to an absolute path, handling tilde and relative paths +if [[ "$destination_path" == "~"* ]]; then + # Handle tilde expansion manually + destination_path="$HOME${destination_path:1}" +fi + +# Resolve potential relative path (including `.`) to an absolute path +destination_path="$(cd "$destination_path" && pwd)" + +# Use system temp directory or fallback to /tmp +temp_repo="${TMPDIR:-/tmp}/temp_repo" + +# Prompt for confirmation before proceeding +echo "This will bootstrap '$destination_path' with the Flutter starter project from '$remote_repo_url'." +read -p "Are you sure you want to proceed? (y/n): " confirmation +if [[ "$confirmation" != "y" && "$confirmation" != "Y" ]]; then + echo "Operation canceled." + exit 0 +fi + +# Clone, archive, and extract +git clone --bare "$remote_repo_url" "$temp_repo" && \ +cd "$temp_repo" && \ +git archive master | tar -x -C "$destination_path" && \ +cd .. && \ +rm -rf "$temp_repo" + +# Derive new package name from the destination directory name +new_package_name=$(basename "$destination_path") + +# Derive old package name from the remote repository URL +old_package_name=$(basename "$remote_repo_url" .git) + +# Echo the old and new package names +echo "Old package name: $old_package_name" +echo "New package name: $new_package_name" + +# Update Flutter package names in pubspec.yaml +echo "Updating Flutter package names in pubspec.yaml files..." +find "$destination_path" -type f -name "pubspec.yaml" -exec sh -c 'sed -i "" "s/^name:.*/name: $new_package_name/" "$1" && echo "Updated $1"' _ {} \; + +# Update Flutter package imports in Dart files within the /lib directory +echo "Updating Flutter package imports in Dart files..." +lib_path="${destination_path}/lib" +if [ -d "$lib_path" ]; then + find "$lib_path" -type f -name "*.dart" -exec sh -c 'sed -i "" "s/package:$old_package_name\//package:$new_package_name\//g" "$1" && echo "Updated $1"' _ {} \; +fi + +# Inform user of success +echo "The destination has been successfully bootstrapped with the starter project." diff --git a/lib/main.dart b/lib/main.dart index 9afcf463..ef8e521c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,10 @@ -import 'package:firebase_core/firebase_core.dart'; +// import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:starter_architecture_flutter_firebase/firebase_options.dart'; -import 'package:starter_architecture_flutter_firebase/src/app.dart'; -import 'package:starter_architecture_flutter_firebase/src/localization/string_hardcoded.dart'; +// import 'package:flutter_starter_base_app/firebase_options.dart'; +import 'package:flutter_starter_base_app/src/app.dart'; +import 'package:flutter_starter_base_app/src/localization/string_hardcoded.dart'; // ignore:depend_on_referenced_packages import 'package:flutter_web_plugins/url_strategy.dart'; @@ -16,7 +16,7 @@ Future main() async { // * https://docs.flutter.dev/testing/errors registerErrorHandlers(); // * Initialize Firebase - await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); + // await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); // * Entry point of the app runApp(const ProviderScope( child: MyApp(), diff --git a/lib/src/app.dart b/lib/src/app.dart index afb98931..33e94c57 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/app_router.dart'; +import 'package:flutter_starter_base_app/src/routing/app_router.dart'; class MyApp extends ConsumerWidget { const MyApp({super.key}); diff --git a/lib/src/common_widgets/action_text_button.dart b/lib/src/common_widgets/action_text_button.dart index 495feb37..32a0c915 100644 --- a/lib/src/common_widgets/action_text_button.dart +++ b/lib/src/common_widgets/action_text_button.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; /// Text button to be used as an [AppBar] action class ActionTextButton extends StatelessWidget { diff --git a/lib/src/common_widgets/async_value_widget.dart b/lib/src/common_widgets/async_value_widget.dart index 33137475..024eb26a 100644 --- a/lib/src/common_widgets/async_value_widget.dart +++ b/lib/src/common_widgets/async_value_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/error_message_widget.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/error_message_widget.dart'; class AsyncValueWidget extends StatelessWidget { const AsyncValueWidget({super.key, required this.value, required this.data}); diff --git a/lib/src/common_widgets/custom_text_button.dart b/lib/src/common_widgets/custom_text_button.dart index f710ba3f..c5ae1d24 100644 --- a/lib/src/common_widgets/custom_text_button.dart +++ b/lib/src/common_widgets/custom_text_button.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; /// Custom text button with a fixed height class CustomTextButton extends StatelessWidget { diff --git a/lib/src/common_widgets/date_time_picker.dart b/lib/src/common_widgets/date_time_picker.dart index 9702e4f8..4f23b5ef 100644 --- a/lib/src/common_widgets/date_time_picker.dart +++ b/lib/src/common_widgets/date_time_picker.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/input_dropdown.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; -import 'package:starter_architecture_flutter_firebase/src/utils/format.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/input_dropdown.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/utils/format.dart'; class DateTimePicker extends StatelessWidget { const DateTimePicker({ diff --git a/lib/src/common_widgets/empty_placeholder_widget.dart b/lib/src/common_widgets/empty_placeholder_widget.dart index 3bc0c139..7776ccd7 100644 --- a/lib/src/common_widgets/empty_placeholder_widget.dart +++ b/lib/src/common_widgets/empty_placeholder_widget.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/primary_button.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/app_router.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/routing/app_router.dart'; /// Placeholder widget showing a message and CTA to go back to the home screen. class EmptyPlaceholderWidget extends ConsumerWidget { diff --git a/lib/src/common_widgets/list_items_builder.dart b/lib/src/common_widgets/list_items_builder.dart index f5117345..675546d0 100644 --- a/lib/src/common_widgets/list_items_builder.dart +++ b/lib/src/common_widgets/list_items_builder.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/empty_content.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/empty_content.dart'; typedef ItemWidgetBuilder = Widget Function(BuildContext context, T item); diff --git a/lib/src/common_widgets/primary_button.dart b/lib/src/common_widgets/primary_button.dart index d425905b..c4a4a44f 100644 --- a/lib/src/common_widgets/primary_button.dart +++ b/lib/src/common_widgets/primary_button.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; /// Primary button based on [ElevatedButton]. /// Useful for CTAs in the app. diff --git a/lib/src/common_widgets/responsive_center.dart b/lib/src/common_widgets/responsive_center.dart index 95d4d5d4..f7027b2f 100644 --- a/lib/src/common_widgets/responsive_center.dart +++ b/lib/src/common_widgets/responsive_center.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/breakpoints.dart'; +import 'package:flutter_starter_base_app/src/constants/breakpoints.dart'; /// Reusable widget for showing a child with a maximum content width constraint. /// If available width is larger than the maximum width, the child will be diff --git a/lib/src/common_widgets/responsive_scrollable_card.dart b/lib/src/common_widgets/responsive_scrollable_card.dart index cf2e90fa..519e885d 100644 --- a/lib/src/common_widgets/responsive_scrollable_card.dart +++ b/lib/src/common_widgets/responsive_scrollable_card.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/responsive_center.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/breakpoints.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/responsive_center.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/constants/breakpoints.dart'; /// Scrollable widget that shows a responsive card with a given child widget. /// Useful for displaying forms and other widgets that need to be scrollable. diff --git a/lib/src/features/authentication/presentation/custom_profile_screen.dart b/lib/src/features/authentication/presentation/custom_profile_screen.dart index 9f0d6b0f..af59f017 100644 --- a/lib/src/features/authentication/presentation/custom_profile_screen.dart +++ b/lib/src/features/authentication/presentation/custom_profile_screen.dart @@ -1,7 +1,7 @@ import 'package:firebase_ui_auth/firebase_ui_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/presentation/auth_providers.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/presentation/auth_providers.dart'; class CustomProfileScreen extends ConsumerWidget { const CustomProfileScreen({super.key}); diff --git a/lib/src/features/authentication/presentation/custom_sign_in_screen.dart b/lib/src/features/authentication/presentation/custom_sign_in_screen.dart index 27642971..f3a181a2 100644 --- a/lib/src/features/authentication/presentation/custom_sign_in_screen.dart +++ b/lib/src/features/authentication/presentation/custom_sign_in_screen.dart @@ -1,8 +1,8 @@ import 'package:firebase_ui_auth/firebase_ui_auth.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; import 'auth_providers.dart'; diff --git a/lib/src/features/entries/application/entries_service.dart b/lib/src/features/entries/application/entries_service.dart index 65d5824a..a4fd86c6 100644 --- a/lib/src/features/entries/application/entries_service.dart +++ b/lib/src/features/entries/application/entries_service.dart @@ -1,15 +1,15 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:rxdart/rxdart.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/domain/app_user.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/data/entries_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/daily_jobs_details.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entries_list_tile_model.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry_job.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/data/jobs_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/utils/format.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/domain/app_user.dart'; +import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/daily_jobs_details.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entries_list_tile_model.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry_job.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; +import 'package:flutter_starter_base_app/src/utils/format.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; part 'entries_service.g.dart'; diff --git a/lib/src/features/entries/data/entries_repository.dart b/lib/src/features/entries/data/entries_repository.dart index 3952cecc..5ed19d70 100644 --- a/lib/src/features/entries/data/entries_repository.dart +++ b/lib/src/features/entries/data/entries_repository.dart @@ -1,9 +1,9 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/domain/app_user.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/domain/app_user.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; class EntriesRepository { const EntriesRepository(this._firestore); diff --git a/lib/src/features/entries/domain/daily_jobs_details.dart b/lib/src/features/entries/domain/daily_jobs_details.dart index 3cfaa4d5..f8dec439 100644 --- a/lib/src/features/entries/domain/daily_jobs_details.dart +++ b/lib/src/features/entries/domain/daily_jobs_details.dart @@ -1,4 +1,4 @@ -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry_job.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry_job.dart'; /// Temporary model class to store the time tracked and pay for a job class JobDetails { diff --git a/lib/src/features/entries/domain/entry.dart b/lib/src/features/entries/domain/entry.dart index 8bc3ee60..87a943a0 100644 --- a/lib/src/features/entries/domain/entry.dart +++ b/lib/src/features/entries/domain/entry.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; typedef EntryID = String; diff --git a/lib/src/features/entries/domain/entry_job.dart b/lib/src/features/entries/domain/entry_job.dart index 37a6fa0c..ec78a9d9 100644 --- a/lib/src/features/entries/domain/entry_job.dart +++ b/lib/src/features/entries/domain/entry_job.dart @@ -1,6 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; class EntryJob extends Equatable { const EntryJob(this.entry, this.job); diff --git a/lib/src/features/entries/presentation/entries_screen.dart b/lib/src/features/entries/presentation/entries_screen.dart index d2fd023e..f49fdf7d 100644 --- a/lib/src/features/entries/presentation/entries_screen.dart +++ b/lib/src/features/entries/presentation/entries_screen.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/strings.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entries_list_tile_model.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/application/entries_service.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/list_items_builder.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/constants/strings.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entries_list_tile_model.dart'; +import 'package:flutter_starter_base_app/src/features/entries/application/entries_service.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/list_items_builder.dart'; class EntriesScreen extends ConsumerWidget { const EntriesScreen({super.key}); diff --git a/lib/src/features/entries/presentation/entry_screen/entry_screen.dart b/lib/src/features/entries/presentation/entry_screen/entry_screen.dart index 0c98b5c7..d9f39cc5 100644 --- a/lib/src/features/entries/presentation/entry_screen/entry_screen.dart +++ b/lib/src/features/entries/presentation/entry_screen/entry_screen.dart @@ -3,15 +3,15 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/date_time_picker.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/responsive_center.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/breakpoints.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/presentation/entry_screen/entry_screen_controller.dart'; -import 'package:starter_architecture_flutter_firebase/src/utils/async_value_ui.dart'; -import 'package:starter_architecture_flutter_firebase/src/utils/format.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/date_time_picker.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/responsive_center.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/constants/breakpoints.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/entries/presentation/entry_screen/entry_screen_controller.dart'; +import 'package:flutter_starter_base_app/src/utils/async_value_ui.dart'; +import 'package:flutter_starter_base_app/src/utils/format.dart'; class EntryScreen extends ConsumerStatefulWidget { const EntryScreen({super.key, required this.jobId, this.entryId, this.entry}); diff --git a/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.dart b/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.dart index 4bf6ffaf..5d599f39 100644 --- a/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.dart +++ b/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/data/entries_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; part 'entry_screen_controller.g.dart'; diff --git a/lib/src/features/jobs/data/jobs_repository.dart b/lib/src/features/jobs/data/jobs_repository.dart index 1347896b..fc16d550 100644 --- a/lib/src/features/jobs/data/jobs_repository.dart +++ b/lib/src/features/jobs/data/jobs_repository.dart @@ -2,11 +2,11 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/domain/app_user.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/data/entries_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/domain/app_user.dart'; +import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; part 'jobs_repository.g.dart'; diff --git a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart b/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart index ccfaebee..b16e1b0c 100644 --- a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart +++ b/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart @@ -3,11 +3,11 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/responsive_center.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/breakpoints.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart'; -import 'package:starter_architecture_flutter_firebase/src/utils/async_value_ui.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/responsive_center.dart'; +import 'package:flutter_starter_base_app/src/constants/breakpoints.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart'; +import 'package:flutter_starter_base_app/src/utils/async_value_ui.dart'; class EditJobScreen extends ConsumerStatefulWidget { const EditJobScreen({super.key, this.jobId, this.job}); diff --git a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart b/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart index b8bb952c..b260c4f0 100644 --- a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart +++ b/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/data/jobs_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/presentation/edit_job_screen/job_submit_exception.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/presentation/edit_job_screen/job_submit_exception.dart'; part 'edit_job_screen_controller.g.dart'; diff --git a/lib/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart b/lib/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart index 767b9656..0df7face 100644 --- a/lib/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart +++ b/lib/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; -import 'package:starter_architecture_flutter_firebase/src/utils/format.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/utils/format.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; class EntryListItem extends StatelessWidget { const EntryListItem({ diff --git a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart index 6b6d0ac7..2b344f54 100644 --- a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart +++ b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart @@ -2,13 +2,13 @@ import 'package:firebase_ui_firestore/firebase_ui_firestore.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/data/entries_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/app_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/utils/async_value_ui.dart'; +import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart'; +import 'package:flutter_starter_base_app/src/routing/app_router.dart'; +import 'package:flutter_starter_base_app/src/utils/async_value_ui.dart'; class JobEntriesList extends ConsumerWidget { const JobEntriesList({super.key, required this.job}); diff --git a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart index f7f49367..c5593b10 100644 --- a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart +++ b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/data/entries_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; part 'job_entries_list_controller.g.dart'; diff --git a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart index ad256b80..168c20d2 100644 --- a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart +++ b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/async_value_widget.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/data/jobs_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/app_router.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/async_value_widget.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart'; +import 'package:flutter_starter_base_app/src/routing/app_router.dart'; class JobEntriesScreen extends ConsumerWidget { const JobEntriesScreen({super.key, required this.jobId}); diff --git a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen.dart b/lib/src/features/jobs/presentation/jobs_screen/jobs_screen.dart index 21d09ec9..5c2ba72c 100644 --- a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen.dart +++ b/lib/src/features/jobs/presentation/jobs_screen/jobs_screen.dart @@ -2,12 +2,12 @@ import 'package:firebase_ui_firestore/firebase_ui_firestore.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/strings.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/data/jobs_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/app_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/utils/async_value_ui.dart'; +import 'package:flutter_starter_base_app/src/constants/strings.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart'; +import 'package:flutter_starter_base_app/src/routing/app_router.dart'; +import 'package:flutter_starter_base_app/src/utils/async_value_ui.dart'; class JobsScreen extends StatelessWidget { const JobsScreen({super.key}); diff --git a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart b/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart index 260f844c..7667687d 100644 --- a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart +++ b/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/data/jobs_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; part 'jobs_screen_controller.g.dart'; diff --git a/lib/src/features/onboarding/presentation/onboarding_controller.dart b/lib/src/features/onboarding/presentation/onboarding_controller.dart index edfb004a..17ca3c7c 100644 --- a/lib/src/features/onboarding/presentation/onboarding_controller.dart +++ b/lib/src/features/onboarding/presentation/onboarding_controller.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/onboarding/data/onboarding_repository.dart'; +import 'package:flutter_starter_base_app/src/features/onboarding/data/onboarding_repository.dart'; part 'onboarding_controller.g.dart'; diff --git a/lib/src/features/onboarding/presentation/onboarding_screen.dart b/lib/src/features/onboarding/presentation/onboarding_screen.dart index 91da7000..1140a38d 100644 --- a/lib/src/features/onboarding/presentation/onboarding_screen.dart +++ b/lib/src/features/onboarding/presentation/onboarding_screen.dart @@ -2,12 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/primary_button.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/responsive_center.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/onboarding/presentation/onboarding_controller.dart'; -import 'package:starter_architecture_flutter_firebase/src/localization/string_hardcoded.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/app_router.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/responsive_center.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/features/onboarding/presentation/onboarding_controller.dart'; +import 'package:flutter_starter_base_app/src/localization/string_hardcoded.dart'; +import 'package:flutter_starter_base_app/src/routing/app_router.dart'; class OnboardingScreen extends ConsumerWidget { const OnboardingScreen({super.key}); diff --git a/lib/src/routing/app_router.dart b/lib/src/routing/app_router.dart index b9e29995..c03854d3 100644 --- a/lib/src/routing/app_router.dart +++ b/lib/src/routing/app_router.dart @@ -1,22 +1,22 @@ import 'package:flutter/material.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/app_startup.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/presentation/custom_profile_screen.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/presentation/custom_sign_in_screen.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/presentation/entries_screen.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/domain/entry.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/entries/presentation/entry_screen/entry_screen.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart'; +import 'package:flutter_starter_base_app/src/routing/app_startup.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/presentation/custom_profile_screen.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/presentation/custom_sign_in_screen.dart'; +import 'package:flutter_starter_base_app/src/features/entries/presentation/entries_screen.dart'; +import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/entries/presentation/entry_screen/entry_screen.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart'; import 'package:go_router/go_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/presentation/jobs_screen/jobs_screen.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/onboarding/data/onboarding_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/onboarding/presentation/onboarding_screen.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/go_router_refresh_stream.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/not_found_screen.dart'; -import 'package:starter_architecture_flutter_firebase/src/routing/scaffold_with_nested_navigation.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/presentation/jobs_screen/jobs_screen.dart'; +import 'package:flutter_starter_base_app/src/features/onboarding/data/onboarding_repository.dart'; +import 'package:flutter_starter_base_app/src/features/onboarding/presentation/onboarding_screen.dart'; +import 'package:flutter_starter_base_app/src/routing/go_router_refresh_stream.dart'; +import 'package:flutter_starter_base_app/src/routing/not_found_screen.dart'; +import 'package:flutter_starter_base_app/src/routing/scaffold_with_nested_navigation.dart'; part 'app_router.g.dart'; diff --git a/lib/src/routing/app_startup.dart b/lib/src/routing/app_startup.dart index 11cd4721..72ea9a64 100644 --- a/lib/src/routing/app_startup.dart +++ b/lib/src/routing/app_startup.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:starter_architecture_flutter_firebase/src/constants/app_sizes.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/onboarding/data/onboarding_repository.dart'; +import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/features/onboarding/data/onboarding_repository.dart'; part 'app_startup.g.dart'; diff --git a/lib/src/routing/not_found_screen.dart b/lib/src/routing/not_found_screen.dart index f7fe8684..823f0ad2 100644 --- a/lib/src/routing/not_found_screen.dart +++ b/lib/src/routing/not_found_screen.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:starter_architecture_flutter_firebase/src/common_widgets/empty_placeholder_widget.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/empty_placeholder_widget.dart'; /// Simple not found screen used for 404 errors (page not found on web) class NotFoundScreen extends StatelessWidget { diff --git a/lib/src/routing/scaffold_with_nested_navigation.dart b/lib/src/routing/scaffold_with_nested_navigation.dart index af5fb66b..5e5290d5 100644 --- a/lib/src/routing/scaffold_with_nested_navigation.dart +++ b/lib/src/routing/scaffold_with_nested_navigation.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:starter_architecture_flutter_firebase/src/localization/string_hardcoded.dart'; +import 'package:flutter_starter_base_app/src/localization/string_hardcoded.dart'; // Stateful navigation based on: // https://github.com/flutter/packages/blob/main/packages/go_router/example/lib/stateful_shell_route.dart diff --git a/lib/src/utils/async_value_ui.dart b/lib/src/utils/async_value_ui.dart index 4fc1f997..1e2011a2 100644 --- a/lib/src/utils/async_value_ui.dart +++ b/lib/src/utils/async_value_ui.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:starter_architecture_flutter_firebase/src/localization/string_hardcoded.dart'; -import 'package:starter_architecture_flutter_firebase/src/utils/alert_dialogs.dart'; +import 'package:flutter_starter_base_app/src/localization/string_hardcoded.dart'; +import 'package:flutter_starter_base_app/src/utils/alert_dialogs.dart'; extension AsyncValueUI on AsyncValue { void showAlertDialogOnError(BuildContext context) { diff --git a/pubspec.lock b/pubspec.lock index d0f6e571..112f68b3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "554f148e71e9e016d9c04d4af6b103ca3f74a1ceed7d7307b70a0f41e991eb77" + sha256: "99b5dec989287c1aca71bf27339e0022b4dc3679225f442fb75790ef44535bf8" url: "https://pub.dev" source: hosted - version: "1.3.26" + version: "1.3.30" analyzer: dependency: transitive description: @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.5.0" async: dependency: transitive description: @@ -93,10 +93,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" url: "https://pub.dev" source: hosted - version: "2.4.8" + version: "2.4.9" build_runner_core: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: built_value - sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e + sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb url: "https://pub.dev" source: hosted - version: "8.9.1" + version: "8.9.2" characters: dependency: transitive description: @@ -165,26 +165,26 @@ packages: dependency: "direct main" description: name: cloud_firestore - sha256: "621afb8a3752732f865ea2d25e2f5cd01ed16ee5691f5a33958876d0a1cae846" + sha256: "531a471f7eb9ae57bc8dc727c1fb424f7fe8817e84229fd527246af681bcf01c" url: "https://pub.dev" source: hosted - version: "4.15.9" + version: "4.17.0" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface - sha256: d200d82314548a11a02056ca96861d216ff814a1efe7bcc6595d404202f5212c + sha256: "1014ed707aafc41828704eac18bc5ebad37641f66614db334e4f22e57ae7f568" url: "https://pub.dev" source: hosted - version: "6.1.10" + version: "6.2.0" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web - sha256: "3b3046c23eccc1064328ab010cff4df470b6b1cfd648b82e08a84f5fb210bcb9" + sha256: be74d6d998807afe5bbe67c94ce4379b330c6817b8151488ce534a8c25d2df51 url: "https://pub.dev" source: hosted - version: "3.10.9" + version: "3.12.0" code_builder: dependency: transitive description: @@ -221,10 +221,10 @@ packages: dependency: "direct main" description: name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "1.0.8" custom_lint: dependency: "direct dev" description: @@ -309,35 +309,35 @@ packages: dependency: "direct main" description: name: firebase_auth - sha256: "3fd6475e60d518c021e70e7d4262db7dac327adf496e71048545da2e0b9ca510" + sha256: a35269247d7b23703bab35ecdb50462944ac1fcdfcf359a7071506c4ad830bfb url: "https://pub.dev" source: hosted - version: "4.17.9" + version: "4.19.2" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface - sha256: d44458576804f246a126fe797547330d2f7bd62069ce12479b583082340a2e4d + sha256: "0edf2466247d18cd2111c4784e43bce49d39cc4d052c122e8060630a136b5a09" url: "https://pub.dev" source: hosted - version: "7.1.9" + version: "7.2.3" firebase_auth_web: dependency: "direct overridden" description: path: "packages/firebase_auth/firebase_auth_web" ref: master - resolved-ref: "04280a31310dbbe51a8e619f031f5190d02e695d" + resolved-ref: "2b0860296bf577c99810643bb286b7219ee9291f" url: "https://github.com/firebase/flutterfire" source: git - version: "5.10.0" + version: "5.11.2" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "67bf0d5fd78f12f51c6b54a72f6141314136a1a90e98b1b7c45e7fac883254ed" + sha256: "6b1152a5af3b1cfe7e45309e96fc1aa14873f410f7aadb3878aa7812acfa7531" url: "https://pub.dev" source: hosted - version: "2.27.1" + version: "2.30.0" firebase_core_platform_interface: dependency: transitive description: @@ -350,26 +350,26 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: "5377eaac3b9fe8aaf22638d87f92b62784f23572e132dfc029195e84d6cb37de" + sha256: c8b02226e548f35aace298e2bb2e6c24e34e8a203d614e742bb1146e5a4ad3c8 url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.15.0" firebase_dynamic_links: dependency: transitive description: name: firebase_dynamic_links - sha256: "6f8180d1641ba274e241a690cd12d1163fdec75d807aa9daa37c27489e7ad3f7" + sha256: e40a96010e550caa69bd5511855d6245758d85446bd0ec8ad974a51d9299d607 url: "https://pub.dev" source: hosted - version: "5.4.18" + version: "5.5.2" firebase_dynamic_links_platform_interface: dependency: transitive description: name: firebase_dynamic_links_platform_interface - sha256: "8b6c1827488fa1af56e9a4834ee9e356c510e35d89d1839761064eabad951cbb" + sha256: "2f1f80fa016d327df49f903a5aa4bbc851aef981a20edf21e85ee85f3de2c165" url: "https://pub.dev" source: hosted - version: "0.2.6+26" + version: "0.2.6+30" firebase_ui_auth: dependency: "direct main" description: @@ -427,10 +427,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" flutter_localizations: dependency: transitive description: flutter @@ -474,10 +474,10 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" glob: dependency: transitive description: @@ -554,10 +554,10 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.1" json_annotation: dependency: transitive description: @@ -802,18 +802,18 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" shared_preferences_foundation: dependency: transitive description: @@ -975,10 +975,10 @@ packages: dependency: transitive description: name: uuid - sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 + sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" url: "https://pub.dev" source: hosted - version: "4.3.3" + version: "4.4.0" vector_graphics: dependency: transitive description: @@ -1039,18 +1039,18 @@ packages: dependency: transitive description: name: web_socket_channel - sha256: "1d8e795e2a8b3730c41b8a98a2dff2e0fb57ae6f0764a1c46ec5915387d257b2" + sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.5" win32: dependency: transitive description: name: win32 - sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480" + sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" url: "https://pub.dev" source: hosted - version: "5.3.0" + version: "5.4.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e1c88619..d14a8103 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,4 +1,4 @@ -name: starter_architecture_flutter_firebase +name: flutter_starter_base_app description: A new Flutter project. publish_to: 'none' diff --git a/test/src/features/jobs/domain/job_test.dart b/test/src/features/jobs/domain/job_test.dart index 530bde65..d626e252 100644 --- a/test/src/features/jobs/domain/job_test.dart +++ b/test/src/features/jobs/domain/job_test.dart @@ -1,5 +1,5 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/jobs/domain/job.dart'; +import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; void main() { group('fromMap', () { diff --git a/test/src/mocks.dart b/test/src/mocks.dart index 447e4db2..8aff4bbc 100644 --- a/test/src/mocks.dart +++ b/test/src/mocks.dart @@ -1,7 +1,7 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:mocktail/mocktail.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:starter_architecture_flutter_firebase/src/features/onboarding/data/onboarding_repository.dart'; +import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; +import 'package:flutter_starter_base_app/src/features/onboarding/data/onboarding_repository.dart'; class MockAuthRepository extends Mock implements AuthRepository {} From ddd047357fc1e72b22af8d25d42e0ea9ff64aac4 Mon Sep 17 00:00:00 2001 From: adam-carbone Date: Fri, 19 Apr 2024 11:58:45 -0400 Subject: [PATCH 3/5] updating the script so it takes care of package name update to match destination directory. --- bootstrap-with-starter-project.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bootstrap-with-starter-project.sh b/bootstrap-with-starter-project.sh index c7e5c83e..569cedcb 100755 --- a/bootstrap-with-starter-project.sh +++ b/bootstrap-with-starter-project.sh @@ -51,13 +51,13 @@ echo "New package name: $new_package_name" # Update Flutter package names in pubspec.yaml echo "Updating Flutter package names in pubspec.yaml files..." -find "$destination_path" -type f -name "pubspec.yaml" -exec sh -c 'sed -i "" "s/^name:.*/name: $new_package_name/" "$1" && echo "Updated $1"' _ {} \; +find "$destination_path" -type f -name "pubspec.yaml" -exec sh -c 'sed -i "" "s/^name:.*/name: $1/" "$2" && echo "Updated $2"' _ "$new_package_name" {} \; # Update Flutter package imports in Dart files within the /lib directory echo "Updating Flutter package imports in Dart files..." lib_path="${destination_path}/lib" if [ -d "$lib_path" ]; then - find "$lib_path" -type f -name "*.dart" -exec sh -c 'sed -i "" "s/package:$old_package_name\//package:$new_package_name\//g" "$1" && echo "Updated $1"' _ {} \; + find "$lib_path" -type f -name "*.dart" -exec sh -c 'sed -i "" "s/package:$2\//package:$1\//g" "$3" && echo "Updated $3"' _ "$new_package_name" "$old_package_name" {} \; fi # Inform user of success From 506cc4c13e9fd5295df377e8ff1a36cb57511d63 Mon Sep 17 00:00:00 2001 From: adam-carbone Date: Tue, 6 Aug 2024 12:55:10 -0400 Subject: [PATCH 4/5] Adding Symphonize Base examples This is the best practices and examples that we worked out during the previous project capturing that back to the base applicaiton. --- .github/workflows/tests.yaml | 16 +- .gitignore | 29 +- README.md | 141 ++-- assets/AppIcon-no_background.svg | 41 ++ assets/add_button_icon.svg | 3 + assets/bottom_navigation_bar/account.svg | 3 + assets/bottom_navigation_bar/alerts.svg | 3 + assets/bottom_navigation_bar/home.svg | 3 + assets/bottom_navigation_bar/reports.svg | 3 + assets/bottom_navigation_bar/schedule.svg | 3 + assets/close_button.svg | 6 + assets/detail_icon/check_mark.svg | 4 + assets/detail_icon/empty_mark.svg | 3 + assets/detail_icon/left_arrow.svg | 3 + assets/detail_icon/question_mark.svg | 3 + assets/detail_icon/right_arrow.svg | 3 + assets/detail_icon/wifi_charger_icon.svg | 98 +++ assets/detail_icon/wifi_icon.svg | 3 + assets/external_link.svg | 3 + assets/group.png | Bin 0 -> 7885 bytes assets/hamburger_menu_icon.svg | 3 + assets/images/house.png | Bin 0 -> 6971 bytes assets/launch_icon.ico | Bin 0 -> 6872 bytes assets/locale/en-US.json | 455 ++++++++++++ assets/location.png | Bin 0 -> 515 bytes assets/logo.png | Bin 0 -> 9862 bytes assets/readme_assets/add_charger.png | Bin 0 -> 56028 bytes assets/readme_assets/add_dongle.png | Bin 0 -> 59152 bytes assets/readme_assets/alert_config.png | Bin 0 -> 54679 bytes assets/readme_assets/alert_main.png | Bin 0 -> 22910 bytes assets/readme_assets/landing_empty.png | Bin 0 -> 21051 bytes assets/readme_assets/landing_full.png | Bin 0 -> 124818 bytes assets/readme_assets/report_main.png | Bin 0 -> 31854 bytes assets/readme_assets/report_table.png | Bin 0 -> 63229 bytes assets/readme_assets/start.png | Bin 0 -> 255912 bytes assets/setup_charger/bluetooth_icon.svg | 3 + assets/setup_charger/connection_fail.svg | 11 + assets/setup_charger/connection_success.svg | 3 + assets/setup_charger/empty_circle_large.svg | 3 + assets/setup_charger/phone.png | Bin 0 -> 10200 bytes assets/setup_charger/phone_background.png | Bin 0 -> 29024 bytes assets/setup_charger/plug_charger.svg | 186 +++++ assets/setup_charger/qr_charger.png | Bin 0 -> 16556 bytes assets/setup_charger/qr_charger.svg | 55 ++ assets/setup_dongle/dongle.png | Bin 0 -> 11514 bytes assets/setup_dongle/install_image.png | Bin 0 -> 5773 bytes assets/setup_dongle/vehicle_icon.png | Bin 0 -> 7426 bytes assets/splash.jpg | Bin 0 -> 79360 bytes assets/splash.svg | 52 ++ assets/vehicle_icon/motorcycle.svg | 4 + assets/vehicle_icon/pickup.svg | 3 + assets/vehicle_icon/sedan.svg | 3 + assets/vehicle_icon/suv.svg | 3 + assets/vehicle_icon/van.svg | 3 + flutter_native_splash.yaml | 11 + lib/main.dart | 78 +-- lib/src/accounts_page.dart | 498 ++++++++++++++ lib/src/api/api.dart | 232 +++++++ lib/src/api/api_endpoints.dart | 45 ++ lib/src/api/api_facade.dart | 15 + lib/src/api/base_api.dart | 30 + lib/src/api/dio_interceptor.dart | 59 ++ lib/src/api/mock_api.dart | 184 +++++ lib/src/app.dart | 46 -- .../common_widgets/action_text_button.dart | 8 +- lib/src/common_widgets/app_bar.dart | 110 +++ .../common_widgets/async_value_widget.dart | 8 +- .../common_widgets/basic_page_importer.dart | 4 + .../bluetooth_scanner/data/providers.dart | 42 ++ .../domain/bluetooth_response.dart | 11 + .../presentation/bluetooth_scanner.dart | 81 +++ lib/src/common_widgets/bottom_bar_button.dart | 56 ++ lib/src/common_widgets/circular_bar.dart | 96 +++ .../circular_loading_animation.dart | 75 ++ .../common_widgets/confirmation_dialog.dart | 24 + lib/src/common_widgets/country_select.dart | 53 ++ lib/src/common_widgets/custom_stepper.dart | 140 ++++ .../custom_text_form_field.dart | 159 +++++ .../empty_placeholder_widget.dart | 43 -- lib/src/common_widgets/hamburger_menu.dart | 40 ++ lib/src/common_widgets/info_text_dialog.dart | 27 + .../common_widgets/list_items_builder.dart | 3 +- .../common_widgets/main_action_button.dart | 21 + lib/src/common_widgets/password_input.dart | 48 ++ lib/src/common_widgets/primary_button.dart | 28 +- lib/src/common_widgets/reception_icon.dart | 16 + .../secondary_action_button.dart | 15 + lib/src/common_widgets/select_builder.dart | 71 ++ .../common_widgets/select_time_widget.dart | 29 + lib/src/common_widgets/subsection_title.dart | 13 + lib/src/common_widgets/text_input.dart | 57 ++ lib/src/constants/colors.dart | 101 +++ lib/src/constants/env_constants.dart | 20 + lib/src/constants/keys.dart | 3 + lib/src/constants/strings.dart | 14 +- lib/src/constants/svg_loader.dart | 190 ++++++ lib/src/constants/theme_data.dart | 98 +++ lib/src/domain/account.dart | 30 + lib/src/domain/basic_api_response.dart | 16 + lib/src/domain/country_data.dart | 38 ++ lib/src/domain/item.dart | 4 + lib/src/domain/label_value.dart | 22 + lib/src/domain/user.dart | 7 + lib/src/domain/wifi_details.dart | 6 + .../account/data/account_provider.dart | 34 + .../account/domain/create_account.dart | 23 + lib/src/features/account/domain/eula.dart | 11 + .../presentation/add_account_flow.dart | 645 ++++++++++++++++++ .../presentation/add_account_page.dart | 47 ++ .../default_contact_info_page.dart | 140 ++++ .../account/presentation/eula_transition.dart | 24 + .../account/presentation/eula_view.dart | 75 ++ .../presentation/username_password_page.dart | 233 +++++++ .../data/firebase_auth_repository.dart | 31 - .../data/firebase_auth_repository.g.dart | 54 -- .../authentication/domain/app_user.dart | 25 - .../presentation/auth_providers.dart | 14 - .../presentation/auth_providers.g.dart | 27 - .../presentation/custom_profile_screen.dart | 19 - .../presentation/custom_sign_in_screen.dart | 52 -- .../entries/application/entries_service.dart | 100 --- .../application/entries_service.g.dart | 43 -- .../entries/data/entries_repository.dart | 74 -- .../entries/domain/daily_jobs_details.dart | 76 --- .../domain/entries_list_tile_model.dart | 12 - lib/src/features/entries/domain/entry.dart | 49 -- .../features/entries/domain/entry_job.dart | 16 - .../entries/presentation/entries_screen.dart | 70 -- .../entry_screen/entry_screen.dart | 157 ----- .../entry_screen/entry_screen_controller.dart | 52 -- .../entry_screen_controller.g.dart | 27 - .../features/jobs/data/jobs_repository.dart | 103 --- .../features/jobs/data/jobs_repository.g.dart | 186 ----- lib/src/features/jobs/domain/job.dart | 35 - .../edit_job_screen/edit_job_screen.dart | 131 ---- .../edit_job_screen_controller.dart | 58 -- .../edit_job_screen_controller.g.dart | 27 - .../edit_job_screen/job_submit_exception.dart | 9 - .../job_entries_screen/entry_list_item.dart | 113 --- .../job_entries_screen/job_entries_list.dart | 44 -- .../job_entries_list_controller.dart | 27 - .../job_entries_list_controller.g.dart | 27 - .../job_entries_screen.dart | 55 -- .../presentation/jobs_screen/jobs_screen.dart | 80 --- .../jobs_screen/jobs_screen_controller.dart | 27 - .../jobs_screen/jobs_screen_controller.g.dart | 27 - lib/src/features/login/data/providers.dart | 23 + .../features/login/domain/login_response.dart | 13 + .../login/presentation/check_eula.dart | 27 + .../presentation/forgot_password_page.dart | 100 +++ .../login/presentation/login_page.dart | 231 +++++++ .../login/presentation/login_transition.dart | 30 + .../login/presentation/logout_transition.dart | 28 + .../presentation/reset_password_page.dart | 282 ++++++++ .../reset_password_success_page.dart | 39 ++ .../features/login/presentation/startup.dart | 26 + .../data/onboarding_repository.g.dart | 27 - .../presentation/onboarding_controller.g.dart | 27 - .../presentation/onboarding_screen.dart | 8 +- .../onboarding/presentation/splash.dart | 49 ++ .../report/data/report_providers.dart | 20 + lib/src/features/report/domain/report_by.dart | 1 + .../features/report/domain/report_data.dart | 24 + .../features/report/domain/report_frame.dart | 29 + .../report/presentation/bar_background.dart | 19 + .../report/presentation/bar_view.dart | 85 +++ .../report/presentation/bar_view_legend.dart | 21 + .../report/presentation/elliptic_button.dart | 45 ++ .../report/presentation/report_bar_view.dart | 35 + .../report/presentation/report_subtitle.dart | 11 + .../report/presentation/reports_page.dart | 82 +++ .../presentation/time_window_select.dart | 42 ++ .../presentation/vehicle_report_table.dart | 35 + lib/src/home_page.dart | 73 ++ lib/src/localization/asset_handler.dart | 89 +++ .../localization/localization_service.dart | 57 ++ lib/src/routing/app_router.dart | 338 ++++----- lib/src/routing/app_router.g.dart | 24 - lib/src/routing/app_startup.dart | 12 +- lib/src/routing/app_startup.g.dart | 24 - lib/src/routing/go_router_refresh_stream.dart | 21 - lib/src/routing/not_found_screen.dart | 17 - lib/src/routing/routes.dart | 46 ++ .../scaffold_with_nested_navigation.dart | 134 ---- lib/src/setup_screen.dart | 113 +++ lib/src/setup_success_page.dart | 38 ++ lib/src/utils/alert_dialogs.dart | 5 +- lib/src/utils/authentication_handler.dart | 31 + lib/src/utils/bar_view_calculator.dart | 21 + lib/src/utils/error_handler.dart | 28 + lib/src/utils/feature_constraints.dart | 102 +++ lib/src/utils/format.dart | 8 +- lib/src/utils/show_alert_dialog.dart | 18 +- .../utils/show_exception_alert_dialog.dart | 3 - lib/src/utils/string_extension.dart | 22 + lib/src/utils/translation_storage.dart | 32 + lib/src/utils/vin_check.dart | 57 ++ mock/countries.json | 48 ++ mock/en-US.json | 459 +++++++++++++ mock/fr-CA.json | 452 ++++++++++++ mock/states.json | 28 + package-cleanup.sh | 36 + pubspec.lock | 629 ++++++++++++----- pubspec.yaml | 80 ++- .../action_text_button_test.dart | 38 ++ .../custom_stepper_test.dart | 107 +++ .../custom_textformfield_test.dart | 120 ++++ .../primary_button_test.dart | 50 ++ test/src/features/jobs/domain/job_test.dart | 48 -- test/src/mocks.dart | 18 - test/unit_test/dio_interceptor_test.dart | 148 ++++ test/widget_test.dart | 27 + 212 files changed, 9362 insertions(+), 2860 deletions(-) create mode 100644 assets/AppIcon-no_background.svg create mode 100644 assets/add_button_icon.svg create mode 100644 assets/bottom_navigation_bar/account.svg create mode 100644 assets/bottom_navigation_bar/alerts.svg create mode 100644 assets/bottom_navigation_bar/home.svg create mode 100644 assets/bottom_navigation_bar/reports.svg create mode 100644 assets/bottom_navigation_bar/schedule.svg create mode 100644 assets/close_button.svg create mode 100644 assets/detail_icon/check_mark.svg create mode 100644 assets/detail_icon/empty_mark.svg create mode 100644 assets/detail_icon/left_arrow.svg create mode 100644 assets/detail_icon/question_mark.svg create mode 100644 assets/detail_icon/right_arrow.svg create mode 100644 assets/detail_icon/wifi_charger_icon.svg create mode 100644 assets/detail_icon/wifi_icon.svg create mode 100644 assets/external_link.svg create mode 100644 assets/group.png create mode 100644 assets/hamburger_menu_icon.svg create mode 100644 assets/images/house.png create mode 100644 assets/launch_icon.ico create mode 100644 assets/locale/en-US.json create mode 100644 assets/location.png create mode 100644 assets/logo.png create mode 100644 assets/readme_assets/add_charger.png create mode 100644 assets/readme_assets/add_dongle.png create mode 100644 assets/readme_assets/alert_config.png create mode 100644 assets/readme_assets/alert_main.png create mode 100644 assets/readme_assets/landing_empty.png create mode 100644 assets/readme_assets/landing_full.png create mode 100644 assets/readme_assets/report_main.png create mode 100644 assets/readme_assets/report_table.png create mode 100644 assets/readme_assets/start.png create mode 100644 assets/setup_charger/bluetooth_icon.svg create mode 100644 assets/setup_charger/connection_fail.svg create mode 100644 assets/setup_charger/connection_success.svg create mode 100644 assets/setup_charger/empty_circle_large.svg create mode 100644 assets/setup_charger/phone.png create mode 100644 assets/setup_charger/phone_background.png create mode 100644 assets/setup_charger/plug_charger.svg create mode 100644 assets/setup_charger/qr_charger.png create mode 100644 assets/setup_charger/qr_charger.svg create mode 100644 assets/setup_dongle/dongle.png create mode 100644 assets/setup_dongle/install_image.png create mode 100644 assets/setup_dongle/vehicle_icon.png create mode 100644 assets/splash.jpg create mode 100644 assets/splash.svg create mode 100644 assets/vehicle_icon/motorcycle.svg create mode 100644 assets/vehicle_icon/pickup.svg create mode 100644 assets/vehicle_icon/sedan.svg create mode 100644 assets/vehicle_icon/suv.svg create mode 100644 assets/vehicle_icon/van.svg create mode 100644 flutter_native_splash.yaml create mode 100644 lib/src/accounts_page.dart create mode 100644 lib/src/api/api.dart create mode 100644 lib/src/api/api_endpoints.dart create mode 100644 lib/src/api/api_facade.dart create mode 100644 lib/src/api/base_api.dart create mode 100644 lib/src/api/dio_interceptor.dart create mode 100644 lib/src/api/mock_api.dart delete mode 100644 lib/src/app.dart create mode 100644 lib/src/common_widgets/app_bar.dart create mode 100644 lib/src/common_widgets/basic_page_importer.dart create mode 100644 lib/src/common_widgets/bluetooth_scanner/data/providers.dart create mode 100644 lib/src/common_widgets/bluetooth_scanner/domain/bluetooth_response.dart create mode 100644 lib/src/common_widgets/bluetooth_scanner/presentation/bluetooth_scanner.dart create mode 100644 lib/src/common_widgets/bottom_bar_button.dart create mode 100644 lib/src/common_widgets/circular_bar.dart create mode 100644 lib/src/common_widgets/circular_loading_animation.dart create mode 100644 lib/src/common_widgets/confirmation_dialog.dart create mode 100644 lib/src/common_widgets/country_select.dart create mode 100644 lib/src/common_widgets/custom_stepper.dart create mode 100644 lib/src/common_widgets/custom_text_form_field.dart delete mode 100644 lib/src/common_widgets/empty_placeholder_widget.dart create mode 100644 lib/src/common_widgets/hamburger_menu.dart create mode 100644 lib/src/common_widgets/info_text_dialog.dart create mode 100644 lib/src/common_widgets/main_action_button.dart create mode 100644 lib/src/common_widgets/password_input.dart create mode 100644 lib/src/common_widgets/reception_icon.dart create mode 100644 lib/src/common_widgets/secondary_action_button.dart create mode 100644 lib/src/common_widgets/select_builder.dart create mode 100644 lib/src/common_widgets/select_time_widget.dart create mode 100644 lib/src/common_widgets/subsection_title.dart create mode 100644 lib/src/common_widgets/text_input.dart create mode 100644 lib/src/constants/colors.dart create mode 100644 lib/src/constants/env_constants.dart create mode 100644 lib/src/constants/svg_loader.dart create mode 100644 lib/src/constants/theme_data.dart create mode 100644 lib/src/domain/account.dart create mode 100644 lib/src/domain/basic_api_response.dart create mode 100644 lib/src/domain/country_data.dart create mode 100644 lib/src/domain/item.dart create mode 100644 lib/src/domain/label_value.dart create mode 100644 lib/src/domain/user.dart create mode 100644 lib/src/domain/wifi_details.dart create mode 100644 lib/src/features/account/data/account_provider.dart create mode 100644 lib/src/features/account/domain/create_account.dart create mode 100644 lib/src/features/account/domain/eula.dart create mode 100644 lib/src/features/account/presentation/add_account_flow.dart create mode 100644 lib/src/features/account/presentation/add_account_page.dart create mode 100644 lib/src/features/account/presentation/default_contact_info_page.dart create mode 100644 lib/src/features/account/presentation/eula_transition.dart create mode 100644 lib/src/features/account/presentation/eula_view.dart create mode 100644 lib/src/features/account/presentation/username_password_page.dart delete mode 100644 lib/src/features/authentication/data/firebase_auth_repository.dart delete mode 100644 lib/src/features/authentication/data/firebase_auth_repository.g.dart delete mode 100644 lib/src/features/authentication/domain/app_user.dart delete mode 100644 lib/src/features/authentication/presentation/auth_providers.dart delete mode 100644 lib/src/features/authentication/presentation/auth_providers.g.dart delete mode 100644 lib/src/features/authentication/presentation/custom_profile_screen.dart delete mode 100644 lib/src/features/authentication/presentation/custom_sign_in_screen.dart delete mode 100644 lib/src/features/entries/application/entries_service.dart delete mode 100644 lib/src/features/entries/application/entries_service.g.dart delete mode 100644 lib/src/features/entries/data/entries_repository.dart delete mode 100644 lib/src/features/entries/domain/daily_jobs_details.dart delete mode 100644 lib/src/features/entries/domain/entries_list_tile_model.dart delete mode 100644 lib/src/features/entries/domain/entry.dart delete mode 100644 lib/src/features/entries/domain/entry_job.dart delete mode 100644 lib/src/features/entries/presentation/entries_screen.dart delete mode 100644 lib/src/features/entries/presentation/entry_screen/entry_screen.dart delete mode 100644 lib/src/features/entries/presentation/entry_screen/entry_screen_controller.dart delete mode 100644 lib/src/features/entries/presentation/entry_screen/entry_screen_controller.g.dart delete mode 100644 lib/src/features/jobs/data/jobs_repository.dart delete mode 100644 lib/src/features/jobs/data/jobs_repository.g.dart delete mode 100644 lib/src/features/jobs/domain/job.dart delete mode 100644 lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart delete mode 100644 lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart delete mode 100644 lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.g.dart delete mode 100644 lib/src/features/jobs/presentation/edit_job_screen/job_submit_exception.dart delete mode 100644 lib/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart delete mode 100644 lib/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart delete mode 100644 lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart delete mode 100644 lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.g.dart delete mode 100644 lib/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart delete mode 100644 lib/src/features/jobs/presentation/jobs_screen/jobs_screen.dart delete mode 100644 lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart delete mode 100644 lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.g.dart create mode 100644 lib/src/features/login/data/providers.dart create mode 100644 lib/src/features/login/domain/login_response.dart create mode 100644 lib/src/features/login/presentation/check_eula.dart create mode 100644 lib/src/features/login/presentation/forgot_password_page.dart create mode 100644 lib/src/features/login/presentation/login_page.dart create mode 100644 lib/src/features/login/presentation/login_transition.dart create mode 100644 lib/src/features/login/presentation/logout_transition.dart create mode 100644 lib/src/features/login/presentation/reset_password_page.dart create mode 100644 lib/src/features/login/presentation/reset_password_success_page.dart create mode 100644 lib/src/features/login/presentation/startup.dart delete mode 100644 lib/src/features/onboarding/data/onboarding_repository.g.dart delete mode 100644 lib/src/features/onboarding/presentation/onboarding_controller.g.dart create mode 100644 lib/src/features/onboarding/presentation/splash.dart create mode 100644 lib/src/features/report/data/report_providers.dart create mode 100644 lib/src/features/report/domain/report_by.dart create mode 100644 lib/src/features/report/domain/report_data.dart create mode 100644 lib/src/features/report/domain/report_frame.dart create mode 100644 lib/src/features/report/presentation/bar_background.dart create mode 100644 lib/src/features/report/presentation/bar_view.dart create mode 100644 lib/src/features/report/presentation/bar_view_legend.dart create mode 100644 lib/src/features/report/presentation/elliptic_button.dart create mode 100644 lib/src/features/report/presentation/report_bar_view.dart create mode 100644 lib/src/features/report/presentation/report_subtitle.dart create mode 100644 lib/src/features/report/presentation/reports_page.dart create mode 100644 lib/src/features/report/presentation/time_window_select.dart create mode 100644 lib/src/features/report/presentation/vehicle_report_table.dart create mode 100644 lib/src/home_page.dart create mode 100644 lib/src/localization/asset_handler.dart create mode 100644 lib/src/localization/localization_service.dart delete mode 100644 lib/src/routing/app_router.g.dart delete mode 100644 lib/src/routing/app_startup.g.dart delete mode 100644 lib/src/routing/go_router_refresh_stream.dart delete mode 100644 lib/src/routing/not_found_screen.dart create mode 100644 lib/src/routing/routes.dart delete mode 100644 lib/src/routing/scaffold_with_nested_navigation.dart create mode 100644 lib/src/setup_screen.dart create mode 100644 lib/src/setup_success_page.dart create mode 100644 lib/src/utils/authentication_handler.dart create mode 100644 lib/src/utils/bar_view_calculator.dart create mode 100644 lib/src/utils/error_handler.dart create mode 100644 lib/src/utils/feature_constraints.dart create mode 100644 lib/src/utils/string_extension.dart create mode 100644 lib/src/utils/translation_storage.dart create mode 100644 lib/src/utils/vin_check.dart create mode 100644 mock/countries.json create mode 100644 mock/en-US.json create mode 100644 mock/fr-CA.json create mode 100644 mock/states.json create mode 100755 package-cleanup.sh create mode 100644 test/common_widgets_test/action_text_button_test.dart create mode 100644 test/common_widgets_test/custom_stepper_test.dart create mode 100644 test/common_widgets_test/custom_textformfield_test.dart create mode 100644 test/common_widgets_test/primary_button_test.dart delete mode 100644 test/src/features/jobs/domain/job_test.dart delete mode 100644 test/src/mocks.dart create mode 100644 test/unit_test/dio_interceptor_test.dart create mode 100644 test/widget_test.dart diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 2ce2d23d..37fc24c1 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -4,13 +4,9 @@ jobs: drive: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - name: Write firebase_options.dart - run: echo '{{ secrets.FIREBASE_OPTIONS }}' > lib/firebase_options.dart - - name: Write GoogleService-info.plist - run: echo '{{ secrets.GOOGLE_SERVICE_INFO_PLIST }}' > ios/Runner/GoogleService-Info.plist - - name: Write google-services.json - run: echo '{{ secrets.GOOGLE_SERVICES_JSON }}' > android/app/google-services.json - - uses: subosito/flutter-action@v2.8.0 - - name: Run Flutter tests - run: flutter test + - uses: actions/checkout@v1 + - uses: subosito/flutter-action@v2.8.0 + - run: flutter pub get + - run: flutter pub run build_runner build --delete-conflicting-outputs + - name: Run Flutter tests + run: flutter test diff --git a/.gitignore b/.gitignore index 37f3e0cc..ce2f3351 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ .buildlog/ .history .svn/ +*.jsk # IntelliJ related *.iml @@ -17,7 +18,7 @@ .idea/ # Visual Studio Code related -#.vscode/ +.vscode/ # Flutter repo-specific /bin/cache/ @@ -46,6 +47,13 @@ unlinked.ds unlinked_spec.ds .flutter-plugins-dependencies +# Ignoring unsupported platforms +linux +macos +windows +web + + # Android related **/android/**/gradle-wrapper.jar **/android/.gradle @@ -58,6 +66,10 @@ unlinked_spec.ds *.jks # iOS/XCode related +# commenting out the Podfile.lock because it is frequently changing and should be generated by the build +# want to avoid constant branch conflicts +/ios/Podfile.lock + **/ios/**/*.mode1v3 **/ios/**/*.mode2v3 **/ios/**/*.moved-aside @@ -102,4 +114,17 @@ macos/firebase_app_id_file.json android/app/google-services.json # Firebase hosting -.firebase/ \ No newline at end of file +.firebase/ + +.env +.env/ + +# contains responses from Danlaw API +api-response.yml + +**/*.g.dart +**/*.reflectable.dart + +# bundle files +*.apk +*.aab \ No newline at end of file diff --git a/README.md b/README.md index f096bd37..a7746156 100644 --- a/README.md +++ b/README.md @@ -1,102 +1,105 @@ -# Time Tracking app with Flutter & Firebase +

Danlaw Smart Charger

-A time tracking application built with Flutter & Firebase: +## Table of Contents -![](/.github/images/time-tracker-screenshots.png) +- [Description](#description) +- [Features](#features) +- [Roadmap](#roadmap) +- [Packages](#packages) +- [Support](#support) +- [Design](#design) +- [Screenshots](#screenshots) +- [License](#license) -This is intended as a **reference app** based on my [Riverpod Architecture](https://codewithandrea.com/articles/flutter-app-architecture-riverpod-introduction/). - -> **Note**: this project used to be called "Started Architecture for Flutter & Firebase" (based on this [old article](https://codewithandrea.com/videos/starter-architecture-flutter-firebase/)). As of January 2023, it follows my updated [Riverpod Architecture](https://codewithandrea.com/articles/flutter-app-architecture-riverpod-introduction/), using the latest packages. - -## Flutter web preview - -A Flutter web preview of the app is available here: - -- [Time Tracker | Flutter web demo](https://starter-architecture-flutter.web.app) +## Description +Danlaw Smart Charger provides a simple interface for users to monitor the charging status of their EVs, plan custom charging schedules and setup various alerts. + ## Features -- **Simple onboarding page** -- **Full authentication flow** (using email & password) -- **Jobs**: users can view, create, edit, and delete their own private jobs (each job has a name and hourly rate) -- **Entries**: for each job, user can view, create, edit, and delete the corresponding entries (an entry is a task with a start and end time, with an optional comment) -- **A report page** that shows a daily breakdown of all jobs, hours worked and pay, along with the totals. - -All the data is persisted with Firestore and is kept in sync across multiple devices. +- **Account**: New users need to create an account to access the features of the app. +- **Authentication**: After account creation, users can login with email & password. +- **Household**: + - Users can add up to 3 households per account. + - Household details can be changed. +- **Charger**: + - Users can add up to 3 chargers per household. + - Chargers can be added with scanning a QR code or Bluetooth flow. +- **Vehicle**: + - Users can add up to 6 vehicles per household. + - Vehicles can be added with scanning a QR code or Bluetooth flow. + - Diagnostic Trouble Codes can be accessed from details page. +- **Alert**: + - Alerts are grouped by Vehicles and Chargers. + - Users can be alerted by Push Notifications, Email and SMS. + - Alerts can be set based on remaining miles, charge status, etc.. +- **Schedule**: Users can see and set charging schedules for the week. +- **Reports**: Energy reports are available for all the vehicles and chargers. Table can be grouped by chargers. ## Roadmap -- [ ] Add missing tests -- [x] Stateful Nested Navigation (available since GoRouter 7.1) -- [ ] Use controllers / notifiers consistently across the app (some code still needs to be updated) -- [ ] Add localization -- [ ] Use the new Firebase UI packages where useful -- [ ] Responsive UI - -> This is a tentative roadmap. There is no ETA for any of the points above. This is a low priority project and I don't have much time to maintain it. - -## Relevant Articles +- [ ] Update Add Charger Flow +- [ ] Update Add Vehicle Flow +- [ ] Add more tests +- [ ] Add language selection -The app is based on my Flutter Riverpod architecture, which is explained in detail here: +>**Note:** Some of the items on the roadmap might be tackled at the next phase of development. -- [Flutter App Architecture with Riverpod: An Introduction](https://codewithandrea.com/articles/flutter-app-architecture-riverpod-introduction/) -- [Flutter Project Structure: Feature-first or Layer-first?](https://codewithandrea.com/articles/flutter-project-structure/) -- [Flutter App Architecture: The Repository Pattern](https://codewithandrea.com/articles/flutter-repository-pattern/) - -More more info on Riverpod, read this: - -- [Flutter Riverpod 2.0: The Ultimate Guide](https://codewithandrea.com/articles/flutter-state-management-riverpod/) - -## Packages in use +## Packages These are the main packages used in the app: - [Flutter Riverpod](https://pub.dev/packages/flutter_riverpod) for data caching, dependency injection, and more - [Riverpod Generator](https://pub.dev/packages/riverpod_generator) and [Riverpod Lint](https://pub.dev/packages/riverpod_lint) for the latest Riverpod APIs - [GoRouter](https://pub.dev/packages/go_router) for navigation -- [Firebase Auth](https://pub.dev/packages/firebase_auth) and [Firebase UI Auth](https://pub.dev/packages/firebase_ui_auth) for authentication -- [Cloud Firestore](https://pub.dev/packages/cloud_firestore) as a realtime database -- [Firebase UI for Firestore](https://pub.dev/packages/firebase_ui_firestore) for the `FirestoreListView` widget with pagination support -- [RxDart](https://pub.dev/packages/rxdart) for combining multiple Firestore collections as needed -- [Intl](https://pub.dev/packages/intl) for currency, date, time formatting +- [Intl](https://pub.dev/packages/intl) for date, time formatting - [Mocktail](https://pub.dev/packages/mocktail) for testing - [Equatable](https://pub.dev/packages/equatable) to reduce boilerplate code in model classes +- [flutter_blue_plus](https://pub.dev/packages/flutter_blue_plus) to communicate with Charger and Vehicle via Bluetooth +- [Reflectable](https://pub.dev/packages/reflectable) to automate widget generation from bespoke objects See the [pubspec.yaml](pubspec.yaml) file for the complete list. -## Running the project with Firebase - -To use this project with Firebase, follow these steps: - -- Create a new project with the Firebase console -- Enable Firebase Authentication, along with the Email/Password Authentication Sign-in provider in the Firebase Console (Authentication > Sign-in method > Email/Password > Edit > Enable > Save) -- Enable Cloud Firestore - -Then, follow one of the two approaches below. 👇 +## Support +Application support by [Danlaw](https://danlawtechnologies.com/contactus). -### 1. Using the CLI +Platform support: +- Android: SDK 34+ +- iOS: iOS 17.0+ -Make sure you have the Firebase CLI and [FlutterFire CLI](https://pub.dev/packages/flutterfire_cli) installed. +Localization support: +- United States English +- Canadian French +- Mexican Spanish -Then run this on the terminal from the root of this project: +Currently application uses default language of the device. If device language is not supported defaults to Engligh. -- Run `firebase login` so you have access to the Firebase project you have created -- Run `flutterfire configure` and follow all the steps +## Design -For more info, follow this guide: +Current designs for this application can be found at [Figma](https://www.figma.com/design/Ji08JojX9t4N5U4uhjgH55/DAN003---EV-Charger-App?node-id=315-20822&t=r8H62xjxlTNpKI6r-0). -- [How to add Firebase to a Flutter app with FlutterFire CLI](https://codewithandrea.com/articles/flutter-firebase-flutterfire-cli/) +## Screenshots -### 2. Manual way (not recommended) +

+       +       + +

+

+       +       + +

+

+ + + +

-If you don't want to use FlutterFire CLI, follow these steps instead: -- Register separate iOS, Android, and web apps in the Firebase project settings. -- On Android, use `com.example.starter_architecture_flutter_firebase` as the package name. -- then, [download and copy](https://firebase.google.com/docs/flutter/setup#configure_an_android_app) `google-services.json` into `android/app`. -- On iOS, use `com.example.starterArchitectureFlutterFirebase` as the bundle ID. -- then, [download and copy](https://firebase.google.com/docs/flutter/setup#configure_an_ios_app) `GoogleService-Info.plist` into `iOS/Runner`, and add it to the Runner target in Xcode. +## License +Copyright © 2024. All rights reserved by [Danlaw](https://danlawtechnologies.com/terms-conditions). -That's it. Have fun! +

-## [License: MIT](LICENSE.md) +[Back to Top](#top) \ No newline at end of file diff --git a/assets/AppIcon-no_background.svg b/assets/AppIcon-no_background.svg new file mode 100644 index 00000000..fd6335bd --- /dev/null +++ b/assets/AppIcon-no_background.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/add_button_icon.svg b/assets/add_button_icon.svg new file mode 100644 index 00000000..0a3a6b5b --- /dev/null +++ b/assets/add_button_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/bottom_navigation_bar/account.svg b/assets/bottom_navigation_bar/account.svg new file mode 100644 index 00000000..bcc8d3de --- /dev/null +++ b/assets/bottom_navigation_bar/account.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/bottom_navigation_bar/alerts.svg b/assets/bottom_navigation_bar/alerts.svg new file mode 100644 index 00000000..6833cf6f --- /dev/null +++ b/assets/bottom_navigation_bar/alerts.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/bottom_navigation_bar/home.svg b/assets/bottom_navigation_bar/home.svg new file mode 100644 index 00000000..2c8e19f8 --- /dev/null +++ b/assets/bottom_navigation_bar/home.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/bottom_navigation_bar/reports.svg b/assets/bottom_navigation_bar/reports.svg new file mode 100644 index 00000000..79ac7e62 --- /dev/null +++ b/assets/bottom_navigation_bar/reports.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/bottom_navigation_bar/schedule.svg b/assets/bottom_navigation_bar/schedule.svg new file mode 100644 index 00000000..e9ae8a44 --- /dev/null +++ b/assets/bottom_navigation_bar/schedule.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/close_button.svg b/assets/close_button.svg new file mode 100644 index 00000000..e45ff8a1 --- /dev/null +++ b/assets/close_button.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/detail_icon/check_mark.svg b/assets/detail_icon/check_mark.svg new file mode 100644 index 00000000..78746f22 --- /dev/null +++ b/assets/detail_icon/check_mark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/detail_icon/empty_mark.svg b/assets/detail_icon/empty_mark.svg new file mode 100644 index 00000000..cd229755 --- /dev/null +++ b/assets/detail_icon/empty_mark.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/detail_icon/left_arrow.svg b/assets/detail_icon/left_arrow.svg new file mode 100644 index 00000000..afe36748 --- /dev/null +++ b/assets/detail_icon/left_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/detail_icon/question_mark.svg b/assets/detail_icon/question_mark.svg new file mode 100644 index 00000000..b4d08d7b --- /dev/null +++ b/assets/detail_icon/question_mark.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/detail_icon/right_arrow.svg b/assets/detail_icon/right_arrow.svg new file mode 100644 index 00000000..e7e524b2 --- /dev/null +++ b/assets/detail_icon/right_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/detail_icon/wifi_charger_icon.svg b/assets/detail_icon/wifi_charger_icon.svg new file mode 100644 index 00000000..65f0d753 --- /dev/null +++ b/assets/detail_icon/wifi_charger_icon.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/detail_icon/wifi_icon.svg b/assets/detail_icon/wifi_icon.svg new file mode 100644 index 00000000..60909455 --- /dev/null +++ b/assets/detail_icon/wifi_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/external_link.svg b/assets/external_link.svg new file mode 100644 index 00000000..8cc586db --- /dev/null +++ b/assets/external_link.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/group.png b/assets/group.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5ecf6525de297a09daccd2746fc7524a95a180 GIT binary patch literal 7885 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 literal 0 HcmV?d00001 diff --git a/assets/hamburger_menu_icon.svg b/assets/hamburger_menu_icon.svg new file mode 100644 index 00000000..a5e31bbd --- /dev/null +++ b/assets/hamburger_menu_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/house.png b/assets/images/house.png new file mode 100644 index 0000000000000000000000000000000000000000..6fb41519a34d1e8536af96ed439ba47fd32cd2eb GIT binary patch literal 6971 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 LHPm^h?fCS6gY~j@ literal 0 HcmV?d00001 diff --git a/assets/locale/en-US.json b/assets/locale/en-US.json new file mode 100644 index 00000000..48125adb --- /dev/null +++ b/assets/locale/en-US.json @@ -0,0 +1,455 @@ +{ + "common": { + "name": "Name", + "home": "Home", + "schedule": "Schedule", + "account": "Account", + "reports": "Reports", + "alerts": "Alerts", + "details": "Details", + "start": "Start", + "set": "Set", + "select": "Select", + "next": "Next", + "finish": "Finish", + "cancel": "Cancel", + "back": "Back", + "time": "Time", + "distance": "Distance", + "duration": "Duration", + "cost": "Cost", + "used": "Used", + "remove": "Remove", + "centerQR": "Center QR Code in camera view", + "username": "Username", + "password": "Password", + "vehicle": "Vehicle", + "charger": "Charger", + "add": "Add", + "selected":"Selected" , + "unknonwn": "Unknown" + }, + "btn": { + "ok": "OK", + "getStarted": "Get Started", + "exitSetup": "Exit Setup", + "haveAccount": "Already have an account?", + "tryAgain": "Try Again", + "login": "Log In", + "loggingIn": "Logging In...", + "logout": "Logout", + "forgotPassword": "Forgot Password", + "resetPassword": "Reset Password", + "updatePassword": "Update Password", + "acceptEula": "I have read and accept the EULA", + "tryAnotherSsid": "Try Another SSID", + "openCamera": "Open Camera", + "addVehicleWDongle": "Add Vehicle with Dongle", + "removeVehicle": "Remove Vehicle", + "removeDongle": "Remove Dongle", + "removeCharger": "Remove Charger", + "removeHousehold":"Remove Household", + "changeIcon": "Change Icon", + "addHousehold": "Add Household", + "support": "Support", + "accessaries": "Accessories", + "appHome": "Go To App Home", + "scanQRCode": "Scan QR Code", + "orScanQRCode": "Or Scan QR Code", + "tryAnotherWayToConnect": "Try Another Way To Connect", + "confirm": "Confirm", + "goBack": "Go Back", + "selectDiffNetwork": "Select A Different Network", + "loginPage": "Go to Log In Page" + }, + "hint": { + "choose": "Choose", + "enter": "Enter", + "vehicleName": "Enter Vehicle Name", + "nameYourCharger": "Name Your Charger", + "customRates":"Set Custom Rates", + "optional": "Optional", + "phoneNumber": "Enter Phone Number", + "email": "Enter Email", + "emailOrUsername": "Enter Email or Username", + "password": "Enter Password", + "address": "Enter Address", + "address2": "Address 2 (optional)", + "city": "Enter City", + "zipCode": "Enter Zip Code" + }, + "validation": { + "textfield": { + "username": "Enter username", + "validUsername": "Enter a valid username", + "password": "Enter a password", + "validPassword": "Enter a valid password", + "confPassword": "Entered password doesn't match", + "verificationCode": "Enter verification code", + "validVerificationCode": "Enter a valid verification code", + "chargerName": "Enter a name for your charger", + "validChargerName": "Enter a valid name for your charger", + "vehicleName": "Enter vehicle name", + "validVehicleName": "Enter a valid name for your vehicle", + "householdName": "Enter a valid household name", + "streetAddress": "Enter a valid street address", + "city": "Enter a valid city", + "zipCode": "Enter a valid zip code", + "email": "Enter your email", + "validEmail": "Enter a valid email ID", + "phone": "Enter your phone number", + "validPhone": "Enter a valid phone number", + "lowMilesThreshold": "Enter a valid low miles threshold", + "arrivalAlertTime": "Enter valid time in seconds", + "minimumMilesThreshold": "Enter valid Minimum miles Threshold", + "maxChargeCost": "Enter a maximum charge cost", + "validMaxChargeCost": "Enter a valid maximum charge cost" + }, + "field": { + "breakerSize": "Select a Breaker Size", + "maxChargeCurrent": "Select a Max charge Current", + "reportingUnits": "Select reporting units", + "state": "Select a valid state", + "country": "Select a valid country", + "method": "Select a valid Pricing Method", + "utility": "Select a valid Utility", + "rateProgram": "Select a valid Rate Program", + "rate": "Enter valid rates", + "alertTime": "Please enter a valid alert time" + } + }, + "status": { + "charging": "Charging", + "idle": "Idle", + "pluggedIn": "Plugged in", + "finishedCharging": "Finished Charging", + "scheduled": "Scheduled", + "chargingError": "Charging Error" + }, + + "signalStrength": { + "strong": "Strong", + "moderate": "Moderate", + "weak": "Weak" + }, + + "connectionStatus": { + "connected": "Connected", + "disconnected": "Disconnected" + + }, + + "oob": { + "setup": "Setup", + "setupGuideline": "Follow the guided steps, below, to set up and start using your new charger.", + "accountWizDesc": "Set up address, contact and utility pricing", + "chargerWizDesc": "Install and configure your charger", + "vehicleWizDesc": "Connect dongle and configure your vehicle", + "setupComplete": "Your initial setup is complete", + "congratulations": "Congratulations" + }, + "dialog": { + "exitSetup": "Are you sure you want to exit setup?", + "resourceRemovalDesc": "This {resource} will be removed from your account.", + "removalConfirmation": "{resource} removed from your account" + }, + "charger": { + "wizard": { + "addChargerTitle": "Add Charger", + "pluginYourCharger": "Plug In Your Charger", + "configureCharger": "Configure Charger", + "pluginYourChargerDesc": "Once your charger is plugged in and the red, wifi light is on, you are ready to add it to your account.", + "connectYourCharger": "Connect Your Charger", + "bluetoothConnectionDesc": "Stand close to your charger and use the number on the side to select it from this list of available Bluetooth devices: ", + "bluetoothDevices": "Bluetooth Devices", + "connectYourChargerDesc": "Use your camera to scan the QR code on the size of your charger.", + "wifiSetup": "Set Up Charger WiFi", + "wifiSelectionDesc": "Select a WiFi connection for your charger", + "wifiNetworks": "Networks", + "wifiPasswordTitle": "WiFi Password for {name}", + "confirmConnection": "Confirm Charger Connection", + "confirmConnectionDesc": "The charger WiFi LED will blink Blue when connected to the Internet.", + "connecting": "Charger connecting to WiFi...", + "connected": "Charger Connected", + "failed": "Could not connect charger!" + }, + "startCharging": "Start Charging", + "stopCharging": "Stop Charging", + "scheduledStart": "Scheduled Start", + "scheduleCharging": "Schedule Charging", + "chargeRate": "Charge Rate", + "estChargeTime": "Est. Charge Time", + "estChargeCost": "Est. Charge Cost", + "completeBy": "Complete By", + "info": "Information", + "status": "Status", + "connectedVehicle": "Connected Vehicle", + "breakerSize": "Breaker Size", + "maxChargeCurrent": "Max Charge Current", + "modelNumber": "Model Number", + "serialNumber": "Serial Number", + "softwareVersion": "Software Version", + "panelLedLighting": "Panel LED Lighting", + "wifiSec": "WiFi Settings", + "wifi": { + "ssid": "SSID", + "mac": "MAC", + "connectionStatus": "Connection Status", + "signalStrength": "Signal Strength", + "rssi": "RSSI", + "ipAddress": "IP Address", + "lastContact": "Last Contact" + }, + "authSec": "Authorization", + "auth": { + "none": "None", + "always": "Ask every time", + "devicePresent": "When authorized device present" + }, + "specialOpsSec": "Special Operations", + "manageAlerts": "Manage Device Alerts", + "reboot": "Reboot Charger", + "factoryReset": "Restore Factory Defaults", + "resetFault": "Reset Charger Fault Error" + }, + "schedule": { + "options": "Schedule Options", + "custom": "Custom Schedule", + "onAllDay": "On All Day", + "scheduledCharging": "Scheduled Charging", + "smart": "Smart Schedule", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "selectHours": "Select the hours when charging is available", + "timeSelection": { + "ampm": "Charging will be available from {morningSession} and {eveningSession}. Please note all hours are in the charger's time zone.", + "am": "Charging will be available from {morningSession}. Please note all hours are in the charger's time zone.", + "pm": "Charging will be available from {eveningSession}. Please note all hours are in the charger's time zone.", + "none": "No charging hours available. Please configure your schedule." + } + }, + + "account": { + "phoneNumber": "Phone Number", + "email": "Email", + "wizard": { + "title": "Create Account", + "welcomeDesc": "Create your account with your home address and select your utility information.", + "createCredentialsDesc": "Create Your Username and Password", + "contactInformationDesc": "Default Contact Information" + }, + "reset": { + "resetPassSuccess":"Reset Password Success", + "forgotPassDesc": "Enter the username for your Danlaw account", + "checkYourEmailDesc": "Please check your email for a message from us with a code to reset your password.", + "resetPassSuccessDesc": "Your password was updated. Please log in with your new password" + }, + "confPassword": "Confirm Password", + "verification": "Verification Code" + }, + "household": { + "title": "Household", + "wizard": { + "title": "Create Household", + "nameYourHouseholdDesc": "Name your Household", + "householdAddressDesc": "Create Your Charger Household Address", + "useMyLocation": "Use my current location", + "pricingMethodDesc": "Select Charge Pricing Method", + "utilityCompanyDesc": "Select Utility Company", + "rateProgramDesc": "Select Rate Program", + "customRatesDesc": "Select Custom Rates", + "customRates": { + "subTitle": "Enter the rates per kWh for these standard rate times", + "weekdayDaytime": "Weekday Daytime Rate", + "weekdayNighttime": "Weekday Nighttime Rate", + "weekendRate": "Weekend Rate" + } + }, + "address": "Address", + "electricityPricing": "Electricity Pricing", + "chargers": "Chargers", + "streetAddress1": "Street Address 1", + "streetAddress2": "Street Address 2", + "city": "City", + "state": "State", + "zipCode": "Zip Code", + "country": "Country", + "pricingMethod": { + "short": "Method", + "long": "Pricing Method", + "chargerEstCost": "Charger Estimates Costs", + "utilityRates": "Utility company-based", + "manual": "Manual" + }, + "utility": "Utility", + "rateProgram": "Rate Program", + "rate": "Rate" + }, + "vehicle": { + "title": "Vehicle", + "wizard": { + "addVehicleTitle": "Add Vehicle", + "addDongle": "Add Dongle", + "connectDongle": "Connect Your Dongle", + "dongleDesc": "Locate the dongle you want to assign to your account", + "vehicleIconDesc": "Choose An Icon For Your Vehicle", + "scanDongleQR": "Scan Dongle QR Code", + "scanDongleQRDesc": "Use your camera to scan the QR code on the dongle.", + "installDongle": "Install Dongle", + "installDongleInVehicle": "Install dongle in your vehicle", + "installDongleInfo": "Once the dongle is plugged into your vehicle the app will confirm your connection.", + "noDongleFound": "No Dongle Found", + "installDongleLEDConf": "Make sure the LED on the dongle lights up. If not, please turn your vehicle on.", + "verifyingComms": "Verifying Communications", + "primaryUserInfo": "Enter Primary User Information", + "contactPhone": "Contact Phone", + "contactEmail": "Contact Email" + }, + "nameVehicle": "Name Your Vehicle", + "lastVehicleInfo": "Last Vehicle Attached Information", + "status": "Status", + "vin": "Vin", + "year": "Year", + "make": "Make", + "model": "Model", + "battery": "Battery", + "stateOfCharge": "State of Charge", + "batteryLife": "Battery Life", + "estMilesAvailable": "Estimated Miles Available", + "failureCodes": "Failure Codes", + "diagnosticsCodes": "Diagnostic Trouble Codes", + "dongleInfo": "Dongle Information", + "dongleId": "Dongle Id", + "lastConnected": "Last Connected", + "alerts": "Alerts", + "manageAlerts": "Manage Vehicle Alerts", + "ass": { + "title": "Active Safety System", + "abs": "Anti-lock Braking System (ABS)", + "esc": "Electronic Stability Control (ESC)", + "tc": "Traction Control", + "tpms": "Tire Pressure Monitory System Type (TPMS)", + "note": "Active Safety System Note" + }, + "eng": { + "title": "Engine", + "numCylinders": "Engine Number of Cylinders", + "displacementCC": "Displacement (CC)", + "displacementCI": "Displacement (CI)", + "displacementL": "Displacement (L)", + "engineModel": "Engine Model" + }, + "body": { + "title": "Exterior/Body", + "bodyClass": "Body Class", + "doors": "Doors", + "windows": "Windows" + } + }, + "reports": { + "vehicleEnergyReport": "Vehicle Energy Report", + "tw": { + "title": "Time Window", + "past31Days": "Past 31 Days", + "thisWeek": "This Week", + "thisMonth": "This Month", + "thisYear": "This year" + }, + "info": { + "barSelection": "Select a bar segment to see more details" + }, + "viewTrips": "View Trips", + "trips": "Trips", + "viewEvents": "View Charge Events", + "bar": { + "legendHome": "Home", + "legendpub": "Public", + "unknownVehicles": "Unknown Vehicles" + }, + "settings": "Settings", + "vehiclesInReport": "Vehicles In Report" + }, + "alerts": { + "charger": "Charger Alerts", + "vehicle": "Vehicle Alerts", + "options": "Alert Options", + "usePush": "Use Push Alerts", + "useText": "Send Text Alerts", + "useEmail": "Send Email Alerts", + "recipientPhone": "Recipient Phone", + "recipientEmail": "Recipient Email", + "pluginReminder": "Plug-in Reminder", + "chargingStatus": "Charging Status", + "nightly": "Nightly Alert", + "nightlyLowMiles": "Nightly Low Miles Alert", + "time": "Alert Time", + "lowMilesThreshold": "Low Miles Threshold", + "arrivalTime": "Arrival Alert Time (Seconds)", + "fullyCharged": "Vehicle Fully Charged Alert", + "chargingInterrupted": "Charging Interrupted Alert", + "minimumMilesMet": "Minimum Miles Met", + "minimumMilesThreshold": "Minimum Miles Threshold", + "highCost": "High Cost Alert", + "maxChargeCost": "Maximum Charge Cost" + }, + + "error": { + "noInfo": "No information provided" + }, + + "apiResponse": { + "success": { + "general": "Request successful.", + "fetch": "{resource} retrieved successfully.", + "fetchLoc": "Localized data retrieved successfully.", + "create": "{resource} created successfully.", + "update": "{resource} updated successfully.", + "delete": "{resource} deleted successfully.", + "remove": "{resource} removed successfully", + "auth": { + "login": "Logged in successfully.", + "logout": "Logged out successfully.", + "passwordReset": { + "codeSent": "Reset code sent successfully. Please check your email.", + "passwordUpdated": "Password reset successfully." + } + }, + "eula": { + "fetched": "EULA loaded successfully.", + "submitted": "EULA acceptance submitted successfully." + }, + "qrScanned": "QR code for {resource} scanned successfully.", + "bluetoothConnected": "Connected to {resource} via Bluetooth successfully.", + "operationCompleted": "{operation} on {resource} completed successfully." + }, + "error": { + "general": "An error occurred. Please try again later.", + "fetch": "Failed to retrieve {resource}. Please try again later.", + "fetchLoc": "Failed to retrieve Localized data. Defaulting to English.", + "create": "Failed to create {resource}. Please check your input and try again.", + "update": "Failed to update {resource}. Please check your input and try again.", + "delete": "Failed to delete {resource}. Please try again later.", + "missingParameter": "Oops! {field} is missing. Please provide all necessary information and try again.", + "invalidQR": "Invalid QR code for {resource}. Please try again.", + "limitReached": "You've reached the maximum limit of {limit} for {resource}.", + "unauthorized": "Unauthorized. Please log in again.", + "loginFailed": "Login failed. Please check your credentials and try again.", + "accessDenied": "Access forbidden. You don't have permission to perform this action.", + "notFound": "{Resource} not found. Please check and try again.", + "timeout": "Request timed out. Please try again later.", + "invalidData": "Unable to process the request. Please check your input and try again.", + "serverError": "Server error. Please try again later.", + "serviceUnavailable": "Service unavailable. Please try again later.", + "duplicateEntry": "A {resource} with this information already exists.", + "dependencyIssue": "Unable to perform this action due to dependencies on {resource}." + }, + "networkError": { + "general": "Unable to connect. Please check your internet connection." + } + } +} \ No newline at end of file diff --git a/assets/location.png b/assets/location.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d6fd095933eea0c6f7f7948ea7b504df232137 GIT binary patch literal 515 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π8o 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 literal 0 HcmV?d00001 diff --git a/assets/readme_assets/alert_config.png b/assets/readme_assets/alert_config.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0d91188fed220cfcf47e51c0d67f05e2c6675c GIT binary patch literal 54679 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 Vhl`!3+uZ;F002ovPDHLkV1g_JWE21Z literal 0 HcmV?d00001 diff --git a/assets/readme_assets/landing_empty.png b/assets/readme_assets/landing_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..d07ec6f5a993dec3d0e76be785d34c33013e2ba1 GIT binary patch literal 21051 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 q@Ptrz*|Oa+66t55N$i+NbofrB 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 aG5;U--;%}(d^~>u0000?vp0NV+qP}nI{2` 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

3-&+Af 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 E0%=nc5C8xG literal 0 HcmV?d00001 diff --git a/assets/splash.svg b/assets/splash.svg new file mode 100644 index 00000000..6a4459ed --- /dev/null +++ b/assets/splash.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/vehicle_icon/motorcycle.svg b/assets/vehicle_icon/motorcycle.svg new file mode 100644 index 00000000..d6ca0ab5 --- /dev/null +++ b/assets/vehicle_icon/motorcycle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/vehicle_icon/pickup.svg b/assets/vehicle_icon/pickup.svg new file mode 100644 index 00000000..ce77e688 --- /dev/null +++ b/assets/vehicle_icon/pickup.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/vehicle_icon/sedan.svg b/assets/vehicle_icon/sedan.svg new file mode 100644 index 00000000..75715250 --- /dev/null +++ b/assets/vehicle_icon/sedan.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/vehicle_icon/suv.svg b/assets/vehicle_icon/suv.svg new file mode 100644 index 00000000..023f3cab --- /dev/null +++ b/assets/vehicle_icon/suv.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/vehicle_icon/van.svg b/assets/vehicle_icon/van.svg new file mode 100644 index 00000000..b2890511 --- /dev/null +++ b/assets/vehicle_icon/van.svg @@ -0,0 +1,3 @@ + + + diff --git a/flutter_native_splash.yaml b/flutter_native_splash.yaml new file mode 100644 index 00000000..b34cc85c --- /dev/null +++ b/flutter_native_splash.yaml @@ -0,0 +1,11 @@ +# Save changes with dart run flutter_native_splash:create --path=flutter_native_splash.yaml +flutter_native_splash: + background_image: "assets/splash.jpg" + background_image_dark: "assets/splash.jpg" + android_12: + image: "assets/splash.jpg" + image_dark: "assets/splash.jpg" + fullscreen: true + android_gravity: center + ios_content_mode: center + color: "#0f1941" diff --git a/lib/main.dart b/lib/main.dart index ef8e521c..57a156d9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,47 +1,43 @@ -// import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/foundation.dart'; +import 'package:flutter_starter_base_app/src/localization/asset_handler.dart'; +import 'package:flutter_starter_base_app/src/localization/localization_service.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -// import 'package:flutter_starter_base_app/firebase_options.dart'; -import 'package:flutter_starter_base_app/src/app.dart'; -import 'package:flutter_starter_base_app/src/localization/string_hardcoded.dart'; -// ignore:depend_on_referenced_packages -import 'package:flutter_web_plugins/url_strategy.dart'; +import 'package:flutter_native_splash/flutter_native_splash.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart' show ConsumerWidget, ProviderScope, WidgetRef; +import 'package:flutter_starter_base_app/main.reflectable.dart'; +import 'package:flutter_starter_base_app/src/routing/app_router.dart' show goRouterProvider; +import 'package:flutter_starter_base_app/src/utils/error_handler.dart'; +import 'package:flutter_starter_base_app/src/constants/theme_data.dart'; -Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - // turn off the # in the URLs on the web - usePathUrlStrategy(); - // * Register error handlers. For more info, see: - // * https://docs.flutter.dev/testing/errors +void main() async { + FlutterNativeSplash.preserve(widgetsBinding: WidgetsFlutterBinding.ensureInitialized()); + await EasyLocalization.ensureInitialized(); registerErrorHandlers(); - // * Initialize Firebase - // await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); - // * Entry point of the app - runApp(const ProviderScope( - child: MyApp(), - )); + initializeReflectable(); + FlutterNativeSplash.remove(); + runApp(ProviderScope( + child: EasyLocalization( + supportedLocales: LocalizationService.getSupportedLocales(), + path: 'assets/locale', + useFallbackTranslations: true, + useFallbackTranslationsForEmptyResources: true, + fallbackLocale: LocalizationService.getFallbackLocale(), + startLocale: LocalizationService.getDeviceLocale(), + saveLocale: false, + assetLoader: AssetHandler(), + child: const EVChargerApp()))); } -void registerErrorHandlers() { - // * Show some error UI if any uncaught exception happens - FlutterError.onError = (FlutterErrorDetails details) { - FlutterError.presentError(details); - debugPrint(details.toString()); - }; - // * Handle errors from the underlying platform/OS - PlatformDispatcher.instance.onError = (Object error, StackTrace stack) { - debugPrint(error.toString()); - return true; - }; - // * Show some error UI when any widget in the app fails to build - ErrorWidget.builder = (FlutterErrorDetails details) { - return Scaffold( - appBar: AppBar( - backgroundColor: Colors.red, - title: Text('An error occurred'.hardcoded), - ), - body: Center(child: Text(details.toString())), - ); - }; +class EVChargerApp extends ConsumerWidget { + const EVChargerApp({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) => MaterialApp.router( + localizationsDelegates: context.localizationDelegates, + supportedLocales: context.supportedLocales, + locale: context.locale, + theme: DanlawTheme().themeData, + debugShowCheckedModeBanner: false, + routerConfig: ref.watch(goRouterProvider), + ); } diff --git a/lib/src/accounts_page.dart b/lib/src/accounts_page.dart new file mode 100644 index 00000000..5e80c5a9 --- /dev/null +++ b/lib/src/accounts_page.dart @@ -0,0 +1,498 @@ +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/subsection_title.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter_starter_base_app/src/utils/feature_constraints.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:email_validator/email_validator.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'dart:ui' as ui; +import 'package:go_router/go_router.dart'; + +class AccountDetailsPage extends ConsumerStatefulWidget { + const AccountDetailsPage({super.key}); + + @override + ConsumerState createState() => _AccountDetailsPageState(); +} + +class _AccountDetailsPageState extends ConsumerState { + final phoneNumberController = TextEditingController(); + final emailController = TextEditingController(); + final _formKey = GlobalKey(); + bool isEditingPhone = false; + bool isEditingEmail = false; + + Future _saveAccountDetails({required String phoneNumber, required String emailId}) async { + try { + final future = ref.read(saveAccountDetailsProvider(emailId: emailId, phoneNumber: phoneNumber).future); + + future.then((response) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Center(child: Text(response.message)), + ), + ); + }).catchError((error) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Center(child: Text('Error: $error')), + ), + ); + }); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: CustomColors().darkestGrayBG, + content: Center(child: Text('Failed to save account details: $e')), + ), + ); + } + } + + @override + Widget build(BuildContext context) { + final accountDetailsAsync = ref.watch(fetchAccountDetailsProvider); + + return Scaffold( + appBar: CustomAppBar( + titleWidget: Text(LocaleKeys.common_account.tr(), + style: DanlawTheme().defaultTextStyle(20).copyWith(fontWeight: FontWeight.w500))), + body: accountDetailsAsync.when( + loading: () => const Scaffold( + body: Directionality( + textDirection: ui.TextDirection.ltr, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [Text('Loading Account Details'), LoadingAnimation()]))), + error: (error, stack) { + return Center(child: Text('Error: $error')); + }, + data: (accountDetails) { + phoneNumberController.text = accountDetails.phoneNumber; + emailController.text = accountDetails.emailId; + return Form( + key: _formKey, + child: Column( + children: [ + Expanded( + child: ListView( + padding: const EdgeInsets.all(16), + children: [ + SubSectionTitle(text: LocaleKeys.account_wizard_contactInformationDesc.tr().toUpperCase()), + GestureDetector( + onTap: () { + setState(() { + isEditingPhone = !isEditingPhone; + }); + }, + child: Container( + height: 44, + decoration: BoxDecoration( + color: CustomColors().grayColor, + border: Border( + bottom: BorderSide( + color: CustomColors().grayColor, + width: 1.0, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.only(left: 16.0, right: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + LocaleKeys.account_phoneNumber.tr(), + style: TextStyle( + color: CustomColors().whitecolor, + fontSize: 17, + ), + ), + if (isEditingPhone) + Expanded( + child: TextFormField( + controller: phoneNumberController, + textAlign: TextAlign.right, + style: TextStyle( + color: CustomColors().secondaryDark, + fontSize: 17, + ), + decoration: InputDecoration( + hintText: LocaleKeys.hint_phoneNumber.tr(), + hintStyle: TextStyle( + color: CustomColors().secondaryDark, + ), + border: InputBorder.none, + ), + keyboardType: TextInputType.phone, + onChanged: (value) { + setState(() { + accountDetails.phoneNumber = value; + }); + }, + onEditingComplete: () { + if (_formKey.currentState!.validate()) { + _saveAccountDetails( + phoneNumber: accountDetails.phoneNumber, + emailId: accountDetails.emailId, + ); + setState(() { + isEditingPhone = false; + }); + } + }, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter a phone number'; + } + final phoneRegExp = RegExp(r'^\d{10}$'); + if (!phoneRegExp.hasMatch(value)) { + return 'Please enter a valid 10-digit phone number'; + } + return null; + }, + ), + ) + else + Expanded( + child: Text( + accountDetails.phoneNumber, + maxLines: 1, + textAlign: TextAlign.right, + style: TextStyle( + color: CustomColors().secondaryDark, + fontSize: 17, + ), + ), + ), + ], + ), + ), + ), + ), + GestureDetector( + onTap: () { + setState(() { + isEditingEmail = !isEditingEmail; + }); + }, + child: Container( + height: 44, + decoration: BoxDecoration( + color: CustomColors().grayColor, + border: Border( + bottom: BorderSide( + color: CustomColors().grayColor, + width: 1.0, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.only(left: 16.0, right: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + LocaleKeys.account_email.tr(), + style: TextStyle( + color: CustomColors().whitecolor, + fontSize: 17, + ), + ), + Padding( + padding: const EdgeInsets.only(left: 10.0), + child: Icon( + Icons.help_rounded, + color: CustomColors().lightblueColor, + size: 15, + ), + ), + // Spacer(), + const SizedBox( + width: 20, + ), + if (isEditingEmail) + Expanded( + child: TextFormField( + controller: emailController, + textAlign: TextAlign.right, + style: TextStyle( + color: CustomColors().secondaryDark, + fontSize: 17, + ), + decoration: InputDecoration( + hintText: 'Enter email', + hintStyle: TextStyle( + color: CustomColors().secondaryDark, + ), + border: InputBorder.none, + ), + keyboardType: TextInputType.emailAddress, + onChanged: (value) { + setState(() { + accountDetails.emailId = value; + }); + }, + onEditingComplete: () { + if (_formKey.currentState!.validate()) { + _saveAccountDetails( + phoneNumber: accountDetails.phoneNumber, + emailId: accountDetails.emailId); + setState(() { + isEditingEmail = false; + }); + } + }, + validator: (value) => + EmailValidator.validate(value ?? '') ? null : "Please enter a valid email", + ), + ) + else + Expanded( + child: Text( + accountDetails.emailId, + textAlign: TextAlign.right, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: CustomColors().secondaryDark, + fontSize: 17, + ), + ), + ), + ], + ), + ), + ), + ), + SubSectionTitle(text: LocaleKeys.household_title.tr().toUpperCase()), + ...?accountDetails.households?.map((household) => Container( + height: 44, + decoration: BoxDecoration( + color: CustomColors().grayColor, + border: Border( + bottom: BorderSide( + color: CustomColors().grayColor, + width: 1.0, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.only(left: 16.0, right: 16), + child: Row( + children: [ + Text( + household.householdName, + style: TextStyle( + color: CustomColors().whitecolor, + fontSize: 17, + ), + ), + Padding( + padding: const EdgeInsets.only(left: 10.0), + child: Icon( + Icons.help_rounded, + color: CustomColors().lightblueColor, + size: 15, + ), + ), + const Spacer(), + Expanded( + child: Text( + '${household.homeAddress.streetAddressFirstLine} ${household.homeAddress.city} ${household.homeAddress.state} ${household.homeAddress.zipCode}', + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: CustomColors().secondaryDark, + fontSize: 17, + ), + ), + ), + GestureDetector( + onTap: () async { + final response = await context.pushNamed(AppRoute.householdDetails.name, + pathParameters: {"householdId": household.householdId}); + if (response == true) { + ref.invalidate(fetchAccountDetailsProvider); + } + }, + child: Icon( + Icons.chevron_right, + color: CustomColors().lightblueColor, + ), + ), + ], + ), + ), + )), + InkWell( + onTap: () async { + await FeatureConstraints() + .canCreateFeature(ref, featureType: FeatureType.household, overrideThreshold: true) + .then((validation) async { + if (validation) { + final result = await context.push( + '/${AppRoute.addHousehold.name}', + ); + + if (result == true) { + ref.invalidate(fetchAccountDetailsProvider); + ref.read(fetchAccountDetailsProvider); + debugPrint("refresh = "); + } + } + }); + }, + child: Container( + height: 44, + decoration: BoxDecoration(color: CustomColors().grayColor), + child: Padding( + padding: const EdgeInsets.only(left: 15.0), + child: Row( + children: [ + Icon( + Icons.add_circle, + color: CustomColors().lightblueColor, + ), + Padding( + padding: const EdgeInsets.only(left: 10.0), + child: Text( + LocaleKeys.btn_addHousehold.tr(), + style: TextStyle( + color: CustomColors().lightblueColor, + fontSize: 17, + ), + ), + ), + ], + ), + ), + ), + ), + SubSectionTitle(text: LocaleKeys.vehicle_title.tr().toUpperCase()), + ...?accountDetails.vehicles?.map((vehicle) => Container( + height: 44, + decoration: BoxDecoration( + color: CustomColors().grayColor, + border: Border( + bottom: BorderSide( + color: CustomColors().grayColor, + width: 1.0, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.only(left: 16.0, right: 16), + child: Row( + children: [ + Text( + vehicle.vehicleName, + style: TextStyle( + color: CustomColors().whitecolor, + fontSize: 17, + ), + ), + Padding( + padding: const EdgeInsets.only(left: 10.0), + child: Icon( + Icons.help_rounded, + color: CustomColors().lightblueColor, + size: 15, + ), + ), + const Spacer(), + Expanded( + child: Text( + '${vehicle.year} ${vehicle.make} ${vehicle.model}', + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: CustomColors().secondaryDark, + fontSize: 17, + ), + ), + ), + GestureDetector( + onTap: () { + context.pushNamed(AppRoute.vehicleDetails.name, + pathParameters: {"vin": vehicle.vin}); + }, + child: Icon( + Icons.chevron_right, + color: CustomColors().lightblueColor, + ), + ), + ], + ), + ), + )), + InkWell( + onTap: () async { + await FeatureConstraints() + .canCreateFeature(ref, featureType: FeatureType.vehicle) + .then((validation) async { + if (validation) { + final result = await context.push( + '/${AppRoute.addVehicle.name}', + ); + + if (result == true) { + ref.invalidate(fetchAccountDetailsProvider); + ref.read(fetchAccountDetailsProvider); + debugPrint("refresh = "); + } + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("You have reached maximum limit of vehicles"))); + } + }); + }, + child: Container( + height: 44, + decoration: BoxDecoration(color: CustomColors().grayColor), + child: Padding( + padding: const EdgeInsets.only(left: 15.0), + child: Row( + children: [ + Icon( + Icons.add_circle, + color: CustomColors().lightblueColor, + ), + Padding( + padding: const EdgeInsets.only(left: 10.0), + child: Text( + LocaleKeys.vehicle_wizard_addVehicleTitle.tr(), + style: TextStyle( + color: CustomColors().lightblueColor, + fontSize: 17, + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + PrimaryButton( + onPressed: () => context.goNamed(AppRoute.logoutPageTransition.name), + backgroundColor: CustomColors().lightblueColor, + text: LocaleKeys.btn_logout.tr(), + ), + ], + ), + ), + ], + )); + }, + ), + ); + } +} diff --git a/lib/src/api/api.dart b/lib/src/api/api.dart new file mode 100644 index 00000000..76084296 --- /dev/null +++ b/lib/src/api/api.dart @@ -0,0 +1,232 @@ +import 'dart:convert'; +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter_starter_base_app/src/domain/account.dart'; +import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/domain/country_data.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; +import 'package:flutter_starter_base_app/src/utils/authentication_handler.dart'; +import 'package:flutter_starter_base_app/src/features/account/domain/create_account.dart'; +import 'package:flutter_starter_base_app/src/features/account/domain/eula.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/api/base_api.dart'; +import 'package:flutter_starter_base_app/src/api/api_endpoints.dart'; + + +class API implements BaseAPI { + final dio = Dio(BaseOptions()); + + Future _buildOptions({bool needsAuth = true}) async => needsAuth + ? await AuthenticationHandler().canAuthenticateUser() + ? Options(headers: { + "Authorization": "Bearer ${await AuthenticationHandler().getAccessToken()}", + "Content-Type": "application/json" + }) + : throw Exception('Cannot Authenticate. Please login again.') + : Options(headers: {"Authorization": "No Authorization", "Content-Type": "application/json"}); + + @override + Future login({required String username, required String password}) async { + try { + Response response = await dio.post((await APIEndpoint().buildBase()) + APIEndpoint.auth, + data: {"username": username, "password": password}); + if (response.statusCode != 200) throw Exception('Failed to authenticate user. ${response.statusMessage}'); + await AuthenticationHandler() + .saveTokens(response.data['domain']['accessToken'], response.data['domain']['refreshToken']); + await AuthenticationHandler().saveUsername(username); + } catch (e, stacktrace) { + if (e is DioException && e.response != null) { + print('Error response domain in Api: ${e.response?.data}'); + throw e; // rethrow the exception to be caught by the calling method + } + debugPrint('Error: $e\nStacktrace: $stacktrace'); + throw Exception('Failed to authenticate user: $e'); + } + } + + @override + Future refreshToken() async { + try { + Response response = await dio.post((await APIEndpoint().buildBase()) + APIEndpoint.refreshToken, + options: await _buildOptions(needsAuth: false), + data: { + "username": await AuthenticationHandler().getUsername(), + "refreshToken": await AuthenticationHandler().getRefreshToken() + }); + if (response.statusCode != 200) { + await AuthenticationHandler().clearTokens(); + return false; + } + await AuthenticationHandler() + .saveTokens(response.data['domain']['accessToken'], response.data['domain']['refreshToken']); + return true; + } catch (e, stackTrace) { + debugPrint('Error: $e\nStacktrace: $stackTrace'); + } + return false; + } + + @override + Future forgotPassword({required String username}) async { + try { + var response = await dio.post((await APIEndpoint().buildBase()) + APIEndpoint.forgotPassword, + options: await _buildOptions(needsAuth: false), data: {"username": username}); + var responseData = response.data; + if (responseData != null) { + return APIResponse.fromJson(responseData); + } else { + throw Exception('No domain found in the response'); + } + } catch (e, stacktrace) { + debugPrint('Error: $e\nStacktrace: $stacktrace'); + throw Exception('Failed to send reset code: $e'); + } + } + + @override + Future resetPassword({required String username, required String otp, required String newPassword}) async { + try { + final response = await dio.post((await APIEndpoint().buildBase()) + APIEndpoint.resetPassword, + options: await _buildOptions(needsAuth: false), + data: {"username": username, "otp": otp, "newPassword": newPassword}); + var responseData = response.data; + if (responseData != null) { + return APIResponse.fromJson(responseData); + } else { + throw Exception('No domain found in the response'); + } + } catch (e, stacktrace) { + debugPrint('Error: $e\nStacktrace: $stacktrace'); + throw Exception('Failed to reset password: $e'); + } + } + + @override + Future> getCountries() async { + try { + return ((await dio.get((await APIEndpoint().buildBase()) + APIEndpoint.countries, options: await _buildOptions())) + .data['domain']['countries'] as List) + .map((country) => Country.fromJson(country)) + .toList(); + } catch (e, stacktrace) { + debugPrint(e.toString() + stacktrace.toString()); + } + throw Exception('Failed to load Countries. Retrying..'); + } + + @override + Future> getStates({required String countryName}) async { + try { + return ((await dio.get((await APIEndpoint().buildBase()) + APIEndpoint.states(countryName), + options: await _buildOptions())) + .data['domain']['states'] as List) + .map((state) => State.fromJson(state)) + .toList(); + } catch (e, stacktrace) { + debugPrint(e.toString() + stacktrace.toString()); + } + throw Exception('Failed to load Countries. Retrying..'); + } + + Future createAccount({required CreateAccountRequest createAccountRequest}) async { + try { + var response = await dio.post((await APIEndpoint().buildBase()) + APIEndpoint.createAccount, + data: createAccountRequest.toJson(), options: await _buildOptions(needsAuth: false)); + return APIResponse.fromJson(response.data); + } catch (e, stacktrace) { + if (e is DioException && e.response != null) { + debugPrint('Error response domain: ${e.response?.data}'); + return APIResponse.fromJson(e.response?.data); + } + debugPrint('Error: $e\nStacktrace: $stacktrace'); + throw Exception('Failed to create account: $e'); + } + } + + @override + Future getAccountDetails() async { + try { + var response = await dio.get( + await APIEndpoint().buildBase() + APIEndpoint.accountDetails, + options: await _buildOptions(), + ); + var accountJson = response.data['domain']; + return AccountDetails.fromJson(accountJson); + } catch (e) { + debugPrint(e.toString()); + throw Exception('Failed to load Account details. Retrying..'); + } + } + + @override + Future saveAccountDetails({required String phoneNumber, required String emailId}) async { + try { + Response response = (await dio.put(await APIEndpoint().buildBase() + APIEndpoint.accountDetails, + data: jsonEncode({"phoneNumber": phoneNumber, "emailId": emailId}), options: await _buildOptions())); + if (response.data != null) { + return APIResponse.fromJson(response.data); + } + } catch (e, stacktrace) { + debugPrint(e.toString() + stacktrace.toString()); + } + throw Exception('Failed to save Account Details'); + } + + @override + Future acceptedEULA() async { + try { + return ((await dio.get((await APIEndpoint().buildBase()) + APIEndpoint.accountEULAStatus, + options: await _buildOptions())) + .data['latestAgreementAccepted'] as bool); + } catch (e, stacktrace) { + debugPrint(e.toString() + stacktrace.toString()); + } + throw Exception('Failed to load EULA Status.'); + } + + @override + Future getEULA(String languageCode) async { + try { + Response response = (await dio.get( + (await APIEndpoint().buildBase()) + APIEndpoint.accountLatestEULA(languageCode.replaceAll('_', '-')), + options: await _buildOptions())); + return EULA.fromJson(response.data['domain']); + } catch (e, stacktrace) { + debugPrint(e.toString() + stacktrace.toString()); + } + throw Exception('Failed to load EULA.'); + } + + Future submitEULA(String agreementId) async { + try { + Response response = await dio.post((await APIEndpoint().buildBase()) + APIEndpoint.accountEULASubmit, + options: await _buildOptions(), data: {'agreementId': agreementId}); + return response.data['status'] == 'success'; + } on DioException catch (e) { + debugPrint(e.message); + } catch (e, stacktrace) { + debugPrint(e.toString() + stacktrace.toString()); + } + throw Exception('Failed to submit EULA.'); + } + + @override + Future> getReportData(String timeWindow) async { + try { + Response response = (await dio.get(await APIEndpoint().buildBase() + APIEndpoint.getReportData(timeWindow), + options: (await _buildOptions()).copyWith(validateStatus: (status) => (status ?? 500) < 500, followRedirects: false))); + if (response.statusCode != 200) throw DioException(requestOptions: response.requestOptions, response: response); + return (response.data['data']['vehicles'] as List) + .map((reportJson) => ReportData.fromJson(reportJson)) + .toList(); + } on DioException catch (e) { + throw Exception(e.response?.data['message'] + ':' + e.response?.data['errorCode']); + } catch (e, stackTrace) { + debugPrint(e.toString()); + debugPrint(stackTrace.toString()); + } + throw Exception('Failed to fetch vehicle report list'); + } +} + diff --git a/lib/src/api/api_endpoints.dart b/lib/src/api/api_endpoints.dart new file mode 100644 index 00000000..d40897bb --- /dev/null +++ b/lib/src/api/api_endpoints.dart @@ -0,0 +1,45 @@ +import 'package:flutter_starter_base_app/src/constants/env_constants.dart'; + +class APIEndpoint { + static const apiPath = "${EnvValues.apiEnv}/${EnvValues.apiVersion}"; + + /// Account + static const String auth = '$apiPath/auth/login'; + static const String refreshToken = '$apiPath/auth/refresh-token'; + static const String forgotPassword = '$apiPath/auth/forgot-password'; + static const String resetPassword = '$apiPath/auth/reset-password'; + static const String accountDetails = '$apiPath/accounts/details'; + static const String accountEULAStatus = '$apiPath/user-agreement/status'; + static const String accountEULASubmit = '$apiPath/user-agreement/submit'; + static String accountLatestEULA(String languageCode) => '$apiPath/user-agreement/latest?languageCode=$languageCode'; + static const String createAccount = '$apiPath/auth/create-account'; + + /// Country + static const String countries = '$apiPath/countries'; + + /// States + static String states(String country) => '$apiPath/states?country=$country'; + + /// Schedule + static String scheduleDetails(String chargerId) => '$apiPath/schedules/details?chargerId=$chargerId'; + + /// Reports + /// Add project specific reporting API + static String getReportData(String duration) => '$apiPath/reports?duration=$duration'; + + /// + static String infoText(String languageCode) => '$apiPath/information-text?languageCode=$languageCode'; + + /// Call with --dart-define-from-file=.env/dev.json + Future buildBase() async { + String? apiHost; + + if (EnvValues.env == EnvValues.preProductionEnv) { + apiHost = EnvValues.apiHost; + } + if (apiHost == null || apiHost.isEmpty) { + throw Exception('Cannot build API Endpoint'); + } + return "$apiHost/"; + } +} diff --git a/lib/src/api/api_facade.dart b/lib/src/api/api_facade.dart new file mode 100644 index 00000000..50535394 --- /dev/null +++ b/lib/src/api/api_facade.dart @@ -0,0 +1,15 @@ +import 'package:flutter_starter_base_app/src/api/api.dart'; +import 'package:flutter_starter_base_app/src/api/base_api.dart'; +import 'package:flutter_starter_base_app/src/api/mock_api.dart'; +import 'package:flutter_starter_base_app/src/constants/env_constants.dart'; + +/// selects the appropriate API +class APIFacade { + Future getApi() async { + if (EnvValues.env == EnvValues.developmentEnv) { + return APIMock(); + } else { + return API(); + } + } +} diff --git a/lib/src/api/base_api.dart b/lib/src/api/base_api.dart new file mode 100644 index 00000000..22ac6c48 --- /dev/null +++ b/lib/src/api/base_api.dart @@ -0,0 +1,30 @@ +import 'package:flutter_starter_base_app/src/domain/account.dart'; +import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/domain/country_data.dart'; +import 'package:flutter_starter_base_app/src/features/account/domain/eula.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; + +mixin BaseAPI { + + Future login({required String username, required String password}); + + Future refreshToken(); + + Future forgotPassword({required String username}); + + Future resetPassword({required String username, required String otp, required String newPassword}); + + Future getAccountDetails(); + + Future saveAccountDetails({required String phoneNumber, required String emailId}); + + Future> getCountries(); + + Future> getStates({required String countryName}); + + Future acceptedEULA(); + + Future getEULA(String languageCode); + + Future> getReportData(String timeWindow); +} diff --git a/lib/src/api/dio_interceptor.dart b/lib/src/api/dio_interceptor.dart new file mode 100644 index 00000000..e361e780 --- /dev/null +++ b/lib/src/api/dio_interceptor.dart @@ -0,0 +1,59 @@ +import 'dart:convert'; +import 'package:dio/dio.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_starter_base_app/src/api/api_endpoints.dart'; + +class MockInterceptor extends Interceptor { + @override + void onRequest(RequestOptions options, RequestInterceptorHandler handler) async { + if (options.path == APIEndpoint.countries) { + return handler.resolve(Response( + requestOptions: options, + statusCode: 200, + data: await loadData('countries'), + )); + } + + if (options.path == APIEndpoint.accountDetails) { + return handler.resolve(Response( + requestOptions: options, + statusCode: 200, + data: await loadData('account_details'), + )); + } + if (options.path == APIEndpoint.states(options.uri.queryParameters['country'] ?? '')) { + return handler.resolve(Response( + requestOptions: options, + statusCode: 200, + data: await loadData('states'), + )); + } + if (options.path == APIEndpoint.states(options.uri.queryParameters['zipcode'] ?? '')) { + return handler.resolve(Response( + requestOptions: options, + statusCode: 200, + data: await loadData('utility_companies'), + )); + } + if (options.path == APIEndpoint.scheduleDetails(options.uri.queryParameters['chargerId'] ?? '')) { + return handler.resolve(Response( + requestOptions: options, + statusCode: 200, + data: await loadData('custom_schedule_details'), + )); + } + if (options.path == APIEndpoint.infoText(options.uri.queryParameters['languageCode'] ?? 'en-US')) { + try { + return handler.resolve(Response( + requestOptions: options, + statusCode: 200, + data: await loadData(options.uri.queryParameters['languageCode'] ?? 'en-US'), + )); + } catch (e) { + return handler.resolve(Response(requestOptions: options, statusCode: 404, data: 'NOT_FOUND')); + } + } + } + + loadData(String filelName) async => jsonDecode(await rootBundle.loadString('mock/$filelName.json')); +} diff --git a/lib/src/api/mock_api.dart b/lib/src/api/mock_api.dart new file mode 100644 index 00000000..3383e8a9 --- /dev/null +++ b/lib/src/api/mock_api.dart @@ -0,0 +1,184 @@ +import 'package:flutter_starter_base_app/src/api/api_endpoints.dart'; +import 'package:flutter_starter_base_app/src/api/base_api.dart'; +import 'package:flutter_starter_base_app/src/api/dio_interceptor.dart'; +import 'package:flutter_starter_base_app/src/domain/account.dart'; +import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/domain/country_data.dart'; +import 'package:flutter_starter_base_app/src/features/account/domain/eula.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; + + +class APIMock implements BaseAPI { + + final dio = Dio(BaseOptions()); + + APIMock() { + dio.interceptors.add(MockInterceptor()); + } + + @override + Future login({required String username, required String password}) async { + try { + await Future.delayed(const Duration(seconds: 3)); + // implement test logic + return; + } catch (e, stacktrace) { + if (e is DioException && e.response != null) { + print('Error response domain in Api: ${e.response?.data}'); + throw e; // rethrow the exception to be caught by the calling method + } + debugPrint('Error: $e\nStacktrace: $stacktrace'); + throw Exception('Failed to authenticate user: $e'); + } + } + + @override + Future refreshToken() async { + try { + await Future.delayed(const Duration(seconds: 3)); + // implement test logic + return true; + } catch (e, stacktrace) { + if (e is DioException && e.response != null) { + print('Error response domain in Api: ${e.response?.data}'); + throw e; // rethrow the exception to be caught by the calling method + } + debugPrint('Error: $e\nStacktrace: $stacktrace'); + throw Exception('Failed to authenticate user: $e'); + } + } + + @override + Future forgotPassword({required String username}) async { + try { + await Future.delayed(const Duration(seconds: 3)); + // implement test logic + return APIResponse.success(); + } catch (e, stacktrace) { + if (e is DioException && e.response != null) { + print('Error response domain in Api: ${e.response?.data}'); + throw e; // rethrow the exception to be caught by the calling method + } + debugPrint('Error: $e\nStacktrace: $stacktrace'); + throw Exception('Failed to authenticate user: $e'); + } + } + + @override + Future resetPassword({required String username, required String otp, required String newPassword}) async { + try { + await Future.delayed(const Duration(seconds: 3)); + // implement test logic + return APIResponse.success(); + } catch (e, stacktrace) { + if (e is DioException && e.response != null) { + print('Error response domain in Api: ${e.response?.data}'); + throw e; // rethrow the exception to be caught by the calling method + } + debugPrint('Error: $e\nStacktrace: $stacktrace'); + throw Exception('Failed to authenticate user: $e'); + } + } + + @override + Future> getCountries() async { + List countries = List.empty(growable: true); + try { + var countriesJson = (await dio.get(APIEndpoint.countries)) + .data['data']['countries']; + for (int i = 0; i < countriesJson.length; i++) { + countries.add(Country.fromJson(countriesJson[i])); + } + } catch (e) { + debugPrint(e.toString()); + } + return countries; + } + + @override + Future getAccountDetails() async { + try { + return AccountDetails.fromJson( + (await dio.get(APIEndpoint.accountDetails)).data['data']); + } catch (e) { + debugPrintStack(); + } + throw Exception(); + } + + @override + Future saveAccountDetails({required String phoneNumber, required String emailId}) async { + try { + await Future.delayed(const Duration(seconds: 1)); + // implement test logic + return APIResponse.success(); + } catch (e, stacktrace) { + debugPrint(e.toString() + stacktrace.toString()); + } + throw Exception('Failed to save Account Details'); + } + + @override + Future> getStates({required String countryName}) async { + List states = List.empty(growable: true); + try { + var statesJson = (await dio.get(APIEndpoint.states(countryName))) + .data['data']['states']; + for (int i = 0; i < statesJson.length; i++) { + states.add(State.fromJson(statesJson[i])); + } + } catch (e) { + debugPrint(e.toString()); + } + return states; + } + + @override + Future> getReportData(String timeWindow) async { + try { + List vehicleList = List.empty(growable: true); + var reportListJson = (await dio.get( + APIEndpoint.getReportData(timeWindow))) + .data['data']['vehicles']; + for (int i = 0; i < reportListJson.length; i++) { + vehicleList.add(ReportData.fromJson(reportListJson[i])); + } + return vehicleList; + } catch (e, stackTrace) { + debugPrint(e.toString()); + debugPrint(stackTrace.toString()); + } + throw Exception(); + } + + @override + Future acceptedEULA() async { + await Future.delayed(const Duration(seconds: 3)); + return true; + } + + Future getEULA(String languageCode) async { + await Future.delayed(const Duration(seconds: 3)); + return EULA.fromJson( + (await dio.get(APIEndpoint.accountLatestEULA(languageCode))) + .data['data']); + } + + + Future getInformationText(String languageCode) async { + try { + Response response = (await dio.get(APIEndpoint.infoText(languageCode))); + return response.data['data']; + } on DioException catch (e) { + debugPrint(e.message); + //todo + } catch (e) { + //todo + return null; + } + throw Exception(); + } +} + diff --git a/lib/src/app.dart b/lib/src/app.dart deleted file mode 100644 index 33e94c57..00000000 --- a/lib/src/app.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_starter_base_app/src/routing/app_router.dart'; - -class MyApp extends ConsumerWidget { - const MyApp({super.key}); - - static const primaryColor = Colors.indigo; - - @override - Widget build(BuildContext context, WidgetRef ref) { - final goRouter = ref.watch(goRouterProvider); - return MaterialApp.router( - routerConfig: goRouter, - theme: ThemeData( - colorSchemeSeed: primaryColor, - unselectedWidgetColor: Colors.grey, - appBarTheme: const AppBarTheme( - backgroundColor: primaryColor, - foregroundColor: Colors.white, - elevation: 2.0, - centerTitle: true, - ), - scaffoldBackgroundColor: Colors.grey[200], - dividerColor: Colors.grey[400], - // https://github.com/firebase/flutterfire/blob/master/packages/firebase_ui_auth/doc/theming.md - elevatedButtonTheme: ElevatedButtonThemeData( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all(primaryColor), - foregroundColor: MaterialStateProperty.all(Colors.white), - ), - ), - outlinedButtonTheme: OutlinedButtonThemeData( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all(primaryColor), - foregroundColor: MaterialStateProperty.all(Colors.white), - ), - ), - floatingActionButtonTheme: const FloatingActionButtonThemeData( - backgroundColor: primaryColor, - ), - ), - debugShowCheckedModeBanner: false, - ); - } -} diff --git a/lib/src/common_widgets/action_text_button.dart b/lib/src/common_widgets/action_text_button.dart index 32a0c915..4fb3938d 100644 --- a/lib/src/common_widgets/action_text_button.dart +++ b/lib/src/common_widgets/action_text_button.dart @@ -1,3 +1,4 @@ +import 'package:flutter_starter_base_app/src/constants/colors.dart'; import 'package:flutter/material.dart'; import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; @@ -15,9 +16,12 @@ class ActionTextButton extends StatelessWidget { child: Text(text, style: Theme.of(context) .textTheme - .titleLarge! - .copyWith(color: Colors.white)), + .titleMedium! + .copyWith(color: CustomColors().lightblueColor + // Colors.white + )), ), ); } } +// >>>>>>> 31efecbea456f03fbf91d0d8ec13fb67bc80b137 diff --git a/lib/src/common_widgets/app_bar.dart b/lib/src/common_widgets/app_bar.dart new file mode 100644 index 00000000..e0d33636 --- /dev/null +++ b/lib/src/common_widgets/app_bar.dart @@ -0,0 +1,110 @@ +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/svg_loader.dart'; +import 'package:flutter_starter_base_app/src/utils/feature_constraints.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/hamburger_menu.dart'; + +class CustomAppBar extends ConsumerWidget implements PreferredSizeWidget { + final Widget? titleWidget; + final bool automaticallyImplyLeading; + final Widget? leading; + final bool showHamburgerMenu; + final Widget? customActionIcon; + final VoidCallback? onCustomActionPressed; + final bool showBackButton; + + @override + final Size preferredSize; + const CustomAppBar({ + super.key, + required this.titleWidget, + this.automaticallyImplyLeading = false, + this.leading, + this.showHamburgerMenu = true, + this.customActionIcon, + this.onCustomActionPressed, + this.showBackButton = false, + }) : preferredSize = const Size.fromHeight(kToolbarHeight); + @override + Widget build(BuildContext context, WidgetRef ref) => AppBar( + automaticallyImplyLeading: automaticallyImplyLeading && leading == null, + leadingWidth: 100, + leading: showBackButton + ? InkWell( + onTap: () => Navigator.pop(context), + child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ + const Icon(CupertinoIcons.back), + Text(LocaleKeys.common_back.tr(), + style: TextStyle(fontSize: 17, color: CustomColors().primaryTextColor)) + ])) + : leading, + titleSpacing: 0, + centerTitle: true, + title: titleWidget ?? Container(), + actions: [ + if (showHamburgerMenu) + SizedBox( + child: HamburgerMenu(menuItemList: [ + HamburgerMenuItem( + title: LocaleKeys.btn_addHousehold.tr(), + function: () async => await FeatureConstraints() + .canCreateFeature(ref, featureType: FeatureType.household, overrideThreshold: true) + .then((validation) { + if (validation) { + context.push('/${AppRoute.addHousehold.name}'); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("You have reached maximum limit of households"))); + } + })), + HamburgerMenuItem( + title: LocaleKeys.charger_wizard_addChargerTitle.tr(), + function: () async => await FeatureConstraints() + .canCreateFeature(ref, featureType: FeatureType.charger, overrideThreshold: true) + .then((validation) { + if (validation) { + context.push('/${AppRoute.addCharger.name}'); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("You have reached maximum limit of chargers"))); + } + })), + HamburgerMenuItem( + title: LocaleKeys.vehicle_wizard_addVehicleTitle.tr(), + function: () async => await FeatureConstraints() + .canCreateFeature(ref, featureType: FeatureType.vehicle) + .then((validation) { + if (validation) { + context.push('/${AppRoute.addVehicle.name}'); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("You have reached maximum limit of vehicles"))); + } + })), + HamburgerMenuItem( + title: LocaleKeys.btn_support.tr(), + tailIcon: Padding(padding: const EdgeInsets.only(right: 6), child: SVGLoader().externalLinkIcon), + function: () async => await launchUrl(Uri.parse('https://www.danlawinc.com/contact-us'), + mode: LaunchMode.externalApplication)), + HamburgerMenuItem( + title: LocaleKeys.btn_accessaries.tr(), + function: () async => + await launchUrl(Uri.parse('https://www.danlawinc.com'), mode: LaunchMode.externalApplication), + tailIcon: Padding(padding: const EdgeInsets.only(right: 6), child: SVGLoader().externalLinkIcon)), + HamburgerMenuItem( + title: LocaleKeys.btn_logout.tr(), + function: () async => WidgetsBinding.instance + .addPostFrameCallback((_) => context.goNamed(AppRoute.logoutPageTransition.name)), + tailIcon: const Icon(Icons.logout)) + ])), + if (!showHamburgerMenu && customActionIcon != null) + IconButton(icon: customActionIcon!, onPressed: onCustomActionPressed) + ]); +} diff --git a/lib/src/common_widgets/async_value_widget.dart b/lib/src/common_widgets/async_value_widget.dart index 024eb26a..6066b0f6 100644 --- a/lib/src/common_widgets/async_value_widget.dart +++ b/lib/src/common_widgets/async_value_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_starter_base_app/src/common_widgets/error_message_widget.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; class AsyncValueWidget extends StatelessWidget { const AsyncValueWidget({super.key, required this.value, required this.data}); @@ -12,14 +13,13 @@ class AsyncValueWidget extends StatelessWidget { return value.when( data: data, error: (e, st) => Center(child: ErrorMessageWidget(e.toString())), - loading: () => const Center(child: CircularProgressIndicator()), + loading: () => const Center(child: LoadingAnimation()), ); } } class ScaffoldAsyncValueWidget extends StatelessWidget { - const ScaffoldAsyncValueWidget( - {super.key, required this.value, required this.data}); + const ScaffoldAsyncValueWidget({super.key, required this.value, required this.data}); final AsyncValue value; final Widget Function(T) data; @@ -33,7 +33,7 @@ class ScaffoldAsyncValueWidget extends StatelessWidget { ), loading: () => Scaffold( appBar: AppBar(), - body: const Center(child: CircularProgressIndicator()), + body: const Center(child: LoadingAnimation()), ), ); } diff --git a/lib/src/common_widgets/basic_page_importer.dart b/lib/src/common_widgets/basic_page_importer.dart new file mode 100644 index 00000000..6364922b --- /dev/null +++ b/lib/src/common_widgets/basic_page_importer.dart @@ -0,0 +1,4 @@ +export 'package:flutter_starter_base_app/src/common_widgets/bottom_bar_button.dart'; +export 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +export 'package:flutter_starter_base_app/src/constants/theme_data.dart'; +export 'package:flutter_starter_base_app/src/constants/colors.dart'; diff --git a/lib/src/common_widgets/bluetooth_scanner/data/providers.dart b/lib/src/common_widgets/bluetooth_scanner/data/providers.dart new file mode 100644 index 00000000..e692eaa7 --- /dev/null +++ b/lib/src/common_widgets/bluetooth_scanner/data/providers.dart @@ -0,0 +1,42 @@ +import 'package:flutter_starter_base_app/src/common_widgets/bluetooth_scanner/domain/bluetooth_response.dart'; +import 'package:wifi_scan/wifi_scan.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'providers.g.dart'; + +/// for now testing +@riverpod +Future chargerBluetoothConnection(ChargerBluetoothConnectionRef ref, {required String data}) async { + //todo timeout + await Future.delayed(const Duration(seconds: 4)); + return Future.value(BluetoothReponse(message: 'Successfully connected', status: 'Success')); + // return Future.error(BluetoothReponse(message: 'Failed to connect', status: 'Failed')); +} + + +class ScanResultState extends StateNotifier> { + ScanResultState() : super(List.empty(growable: true)); + List items() => state; + clear() => state.clear(); + static final provider = StateNotifierProvider.autoDispose>((_) => ScanResultState()); + void addIfNotPresent(ScanResult scanResult) => state.contains(scanResult) ? null : state.add(scanResult); +} + +/// Keeps track of the selected BT device at Add Charger Flow +final AutoDisposeStateProvider currentBluetoothScanResult = StateProvider.autoDispose((_) => null); + +/// Keeps track of the selected wifi at Add Charger Flow +final AutoDisposeStateProvider currentWiFiScanResult = StateProvider.autoDispose((_) => null); + +final AutoDisposeStateProvider password = StateProvider.autoDispose((_) => ''); + +@riverpod + +/// todo handle other cases +Future> wifiScanResultList(WifiScanResultListRef ref) async => + switch (await WiFiScan.instance.canGetScannedResults()) { + CanGetScannedResults.yes => WiFiScan.instance.getScannedResults(), + _ => throw Exception('Failed to scan WiFi networks') + }; + diff --git a/lib/src/common_widgets/bluetooth_scanner/domain/bluetooth_response.dart b/lib/src/common_widgets/bluetooth_scanner/domain/bluetooth_response.dart new file mode 100644 index 00000000..229fcbd4 --- /dev/null +++ b/lib/src/common_widgets/bluetooth_scanner/domain/bluetooth_response.dart @@ -0,0 +1,11 @@ +import 'package:json_annotation/json_annotation.dart'; +part 'bluetooth_response.g.dart'; + +@JsonSerializable() +class BluetoothReponse { + final String message; + final String status; + BluetoothReponse({required this.message, required this.status}); + factory BluetoothReponse.fromJson(Map json) => _$BluetoothReponseFromJson(json); + Map toJson() => _$BluetoothReponseToJson(this); +} diff --git a/lib/src/common_widgets/bluetooth_scanner/presentation/bluetooth_scanner.dart b/lib/src/common_widgets/bluetooth_scanner/presentation/bluetooth_scanner.dart new file mode 100644 index 00000000..8b08eeaf --- /dev/null +++ b/lib/src/common_widgets/bluetooth_scanner/presentation/bluetooth_scanner.dart @@ -0,0 +1,81 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/bluetooth_scanner/data/providers.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/reception_icon.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/constants/svg_loader.dart'; +import 'package:flutter_starter_base_app/src/constants/theme_data.dart'; + +class BluetoothHandler extends ConsumerStatefulWidget { + final AutoDisposeStateProvider scanResultProvider; + const BluetoothHandler({super.key, required this.scanResultProvider}); + @override + ConsumerState createState() => _BluetoothHandlerState(); +} + +class _BluetoothHandlerState extends ConsumerState { + startScan() async { + ref.read(ScanResultState.provider.notifier).clear(); + setState(() {}); + FlutterBluePlus.setLogLevel(LogLevel.error, color: true); + StreamSubscription> subscription = FlutterBluePlus.onScanResults.listen((results) { + if (results.isNotEmpty && results.last.device.advName.isNotEmpty) { + ref.read(ScanResultState.provider.notifier).addIfNotPresent(results.last); + setState(() {}); + } + }); + FlutterBluePlus.cancelWhenScanComplete(subscription); + FlutterBluePlus.startScan(timeout: const Duration(seconds: 15)); + } + + @override + void initState() { + startScan(); + super.initState(); + } + + @override + Widget build(BuildContext context) => Expanded( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(10), + child: Container( + color: CustomColors().darkGrayBG, + child: Column( + children: (ref.watch(ScanResultState.provider)..sort((a, b) => b.rssi - a.rssi)) + .map((ScanResult scanResult) => Row(children: [ + InkWell( + onTap: () async => ref.read(widget.scanResultProvider.notifier).state = scanResult, + child: Container( + padding: const EdgeInsets.only(left: 20), + child: ref.watch(widget.scanResultProvider) == scanResult + ? SVGLoader().checkMark + : SVGLoader().emptyMark)), + Expanded( + child: Container( + padding: const EdgeInsets.only(left: 10, right: 20), + child: Row(children: [ + Text(scanResult.advertisementData.advName, + overflow: TextOverflow.ellipsis, + style: DanlawTheme().defaultTextStyle(18), + softWrap: false, + maxLines: 1), + const Spacer(), + ReceptionIcon(level: scanResult.rssi) + ]))) + ])) + .toList() + .asMap() + .entries + .map((entry) => [ + if (entry.key != 0) + Container( + padding: const EdgeInsets.only(left: 10, right: 10), + child: const PopupMenuDivider()), + entry.value + ]) + .expand((e) => e) + .toList()))))); +} diff --git a/lib/src/common_widgets/bottom_bar_button.dart b/lib/src/common_widgets/bottom_bar_button.dart new file mode 100644 index 00000000..c1a810b9 --- /dev/null +++ b/lib/src/common_widgets/bottom_bar_button.dart @@ -0,0 +1,56 @@ +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/routing/app_router.dart'; +import 'package:flutter_starter_base_app/src/constants/svg_loader.dart'; + +StateProvider showBottomNav = StateProvider((ref) => true); + +class CustomNavigationBar extends ConsumerWidget { + const CustomNavigationBar({super.key, required this.child}); + + final Widget child; + + void _onItemTapped(BuildContext context, WidgetRef ref, int index) { + ref.read(currentMainRouteIndexProvider.notifier).state = index; + context.go('/${bottomNavRoutes[index].name}'); + } + + @override + Widget build(BuildContext context, WidgetRef ref) => Theme( + data: Theme.of(context).copyWith(), + child: Scaffold( + bottomNavigationBar: ref.watch(showBottomNav) + ? BottomNavigationBar( + selectedItemColor: CustomColors().primaryTextColor, + unselectedItemColor: CustomColors().darkGrayText, + onTap: (int index) => _onItemTapped(context, ref, index), + backgroundColor: CustomColors().darkestGrayBG, + type: BottomNavigationBarType.fixed, + currentIndex: ref.watch(currentMainRouteIndexProvider), + showUnselectedLabels: true, + showSelectedLabels: true, + unselectedFontSize: 12, + selectedFontSize: 12, + items: [ + BottomNavigationBarItem( + icon: SVGLoader().homeInactiveIcon, + activeIcon: SVGLoader().homeIcon, + label: LocaleKeys.common_home.tr()), + BottomNavigationBarItem( + icon: SVGLoader().accountInactiveIcon, + activeIcon: SVGLoader().accountIcon, + label: LocaleKeys.common_account.tr()), + BottomNavigationBarItem( + icon: SVGLoader().reportsInactiveIcon, + activeIcon: SVGLoader().reportsIcon, + label: LocaleKeys.common_reports.tr()), + ]) + : null, + body: child, + ), + ); +} diff --git a/lib/src/common_widgets/circular_bar.dart b/lib/src/common_widgets/circular_bar.dart new file mode 100644 index 00000000..a8b21d9e --- /dev/null +++ b/lib/src/common_widgets/circular_bar.dart @@ -0,0 +1,96 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; + +/// todo add greyed out +class GradientLoadingAnimation extends ConsumerWidget { + final bool isOutOfRange; + final double percent; + final List innerCircleTextList; + const GradientLoadingAnimation( + {super.key, required this.innerCircleTextList, this.isOutOfRange = false, required this.percent}); + + @override + Widget build(BuildContext context, WidgetRef ref) => SizedBox( + width: 50, + height: 50, + child: CustomPaint( + painter: _CircularPaint(progressValue: percent, isOutOfRange: isOutOfRange), + child: Container( + padding: const EdgeInsets.all(4.5), + decoration: const BoxDecoration( + shape: BoxShape.circle, + border: Border.fromBorderSide(BorderSide(color: Colors.transparent, width: 1.5))), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: innerCircleTextList + .map((text) => Text(text, + style: const TextStyle(fontSize: 10, color: Colors.white, fontWeight: FontWeight.bold))) + .toList())))); +} + +class _CircularPaint extends CustomPainter { + final double borderThickness = 5; + final double progressValue; + final bool isOutOfRange; + + _CircularPaint({required this.progressValue, required this.isOutOfRange}); + List buildGradient(bool isOutOfRange, double range) { + if (isOutOfRange) return [CustomColors().lighterGrayText, CustomColors().lighterGrayText]; + if (range > .25) { + return [ + CustomColors().batteryGreen, + CustomColors().batteryGreen, + CustomColors().batteryGreen, + CustomColors().batteryYellowishGreen, + CustomColors().batteryYellowishGreen, + CustomColors().batteryGreen, + ]; + } + return [ + CustomColors().batteryOrange, + CustomColors().batteryOrange, + CustomColors().batteryOrange, + CustomColors().batteryRed, + CustomColors().batteryRed, + ]; + } + + @override + void paint(Canvas canvas, Size size) { + final Rect rect = Rect.fromCenter( + center: Offset(size.width / 2, size.height / 2), + height: size.height, + width: size.width, + ); + canvas.drawArc( + rect, + 0, + pi * 2, + false, + Paint() + ..color = isOutOfRange ? CustomColors().lightGrayText : CustomColors().circularIndicatorBG + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.square + ..strokeWidth = borderThickness); + canvas.drawArc( + rect, + + /// not at the center? + -pi / 2 - pi / 38, + -pi * progressValue * 2, + false, + Paint() + ..blendMode = BlendMode.srcIn + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.square + ..strokeWidth = borderThickness + ..shader = SweepGradient(tileMode: TileMode.clamp, colors: buildGradient(isOutOfRange, progressValue)) + .createShader(rect)); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} diff --git a/lib/src/common_widgets/circular_loading_animation.dart b/lib/src/common_widgets/circular_loading_animation.dart new file mode 100644 index 00000000..afd82f7c --- /dev/null +++ b/lib/src/common_widgets/circular_loading_animation.dart @@ -0,0 +1,75 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_starter_base_app/src/constants/svg_loader.dart'; + +class LoadingAnimation extends StatefulWidget { + const LoadingAnimation({super.key}); + @override + State createState() => _LoadingAnimatioState(); +} + +class _LoadingAnimatioState extends State with TickerProviderStateMixin { + late final AnimationController _controller = + AnimationController(lowerBound: 0.5, upperBound: 1.3, duration: const Duration(seconds: 1), vsync: this) + ..repeat(reverse: true); + late final AnimationController _controller2 = + AnimationController(lowerBound: 0.5, upperBound: 1.3, duration: const Duration(seconds: 1), vsync: this); + late final AnimationController _controller3 = + AnimationController(lowerBound: 0.5, upperBound: 1.3, duration: const Duration(seconds: 1), vsync: this); + late final AnimationController _controller4 = + AnimationController(lowerBound: 0.5, upperBound: 1.3, duration: const Duration(seconds: 1), vsync: this); + listener() { + if (_controller.value > 0.7) { + _controller2.repeat(reverse: true); + _controller.removeListener(listener); + } + } + + listener2() { + if (_controller2.value > 0.7) { + _controller3.repeat(reverse: true); + _controller2.removeListener(listener2); + } + } + + listener3() { + if (_controller3.value > 0.7) { + _controller4.repeat(reverse: true); + _controller3.removeListener(listener3); + } + } + + @override + void initState() { + super.initState(); + _controller.addListener(listener); + _controller2.addListener(listener2); + _controller3.addListener(listener3); + } + + @override + void dispose() { + _controller.dispose(); + _controller2.dispose(); + _controller3.dispose(); + _controller4.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => AnimatedBuilder( + animation: _controller, + builder: (BuildContext _, child) => Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + Transform.scale( + scale: _controller.value, + child: Padding(padding: const EdgeInsets.all(8.0), child: SVGLoader().emptyCircleIcon)), + Transform.scale( + scale: _controller2.value, + child: Padding(padding: const EdgeInsets.all(8.0), child: SVGLoader().emptyCircleIcon)), + Transform.scale( + scale: _controller3.value, + child: Padding(padding: const EdgeInsets.all(8.0), child: SVGLoader().emptyCircleIcon)), + Transform.scale( + scale: _controller4.value, + child: Padding(padding: const EdgeInsets.all(8.0), child: SVGLoader().emptyCircleIcon)), + ])); +} diff --git a/lib/src/common_widgets/confirmation_dialog.dart b/lib/src/common_widgets/confirmation_dialog.dart new file mode 100644 index 00000000..fb64390d --- /dev/null +++ b/lib/src/common_widgets/confirmation_dialog.dart @@ -0,0 +1,24 @@ +part of 'package:flutter_starter_base_app/src/utils/alert_dialogs.dart'; + +Future showConfirmationDialog({ + required BuildContext context, + required String title, + String? content, + String? cancelActionText, + bool? useRootNavigator, + required String defaultActionText, +}) async { + return showDialog( + context: context, + useRootNavigator: useRootNavigator ?? false, + builder: (context) => AlertDialog( + insetPadding: const EdgeInsets.symmetric(horizontal: 40), + title: Text(title, maxLines: content != null ? 1 : 3), + content: content != null ? Text(content, maxLines: 3) : null, + actions: [ + if (cancelActionText != null) TextButton(child: Text(cancelActionText), onPressed: () => context.pop(false)), + TextButton(child: Text(defaultActionText), onPressed: () => context.pop(true)), + ], + ), + ); +} diff --git a/lib/src/common_widgets/country_select.dart b/lib/src/common_widgets/country_select.dart new file mode 100644 index 00000000..d4e1fa21 --- /dev/null +++ b/lib/src/common_widgets/country_select.dart @@ -0,0 +1,53 @@ +import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/select_builder.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:go_router/go_router.dart'; + +class CountrySelect extends ConsumerWidget { + const CountrySelect({super.key, this.initialSelection}); + final Item? initialSelection; + @override + Widget build(BuildContext context, WidgetRef ref) { + onCountrySelection(List choosenItemList) { + if (choosenItemList.length == 1) { + debugPrint("choosen item: ${choosenItemList.first.label}"); + context.pop(choosenItemList.first); + return; + } + + context.pop(); + } + + return Scaffold( + appBar: CustomAppBar( + showBackButton: true, + titleWidget: Text(LocaleKeys.household_country.tr()), + showHamburgerMenu: false, + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + child: ref.watch(fetchCountryListProvider).when( + data: (List itemList) { + return SelectBuilder( + onSelect: onCountrySelection, + items: itemList, + multiSelect: false, + initialSelection: initialSelection != null ? [initialSelection!] : null, + ); + }, + error: (error, stackTrace) { + WidgetsBinding.instance.addPostFrameCallback((_) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Center(child: Text('$error')))); + }); + + return Container(); + }, + loading: () => const LoadingAnimation())), + ); + } +} diff --git a/lib/src/common_widgets/custom_stepper.dart b/lib/src/common_widgets/custom_stepper.dart new file mode 100644 index 00000000..699d2ad2 --- /dev/null +++ b/lib/src/common_widgets/custom_stepper.dart @@ -0,0 +1,140 @@ +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter/material.dart'; + +class CustomStepper extends StatelessWidget { + final double? width; + final int totalSteps; + final int curStep; + final Color stepCompleteColor; + final Color currentStepColor; + final Color inactiveColor; + final double lineWidth; + final PageController? pageController; + final Function(bool isValid)? onStepContinue; + + CustomStepper({ + Key? key, + this.width, + required this.curStep, + required this.totalSteps, + required this.stepCompleteColor, + required this.inactiveColor, + required this.currentStepColor, + required this.lineWidth, + this.pageController, + this.onStepContinue, + }) : assert(curStep > 0 && curStep <= totalSteps), + super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.only( + top: 10.0, + left: 10.0, + right: 10.0, + ), + width: this.width, + child: Row( + children: _steps(), + ), + ); + } + + getCircleColor(i) { + var color; + if (i + 1 < curStep) { + color = stepCompleteColor; + } else if (i + 1 == curStep) + color = currentStepColor; + else + color = CustomColors().whitecolor; + return color; + } + + getBorderColor(i) { + var color; + if (i + 1 < curStep) { + color = stepCompleteColor; + } else if (i + 1 == curStep) + color = currentStepColor; + else + color = inactiveColor; + + return color; + } + + getLineColor(i) { + var color = curStep > i + 1 + ? CustomColors().lightblueColor + : CustomColors().whitecolor; + return color; + } + + List _steps() { + var list = []; + for (int i = 0; i < totalSteps; i++) { + //colors according to state + + var circleColor = getCircleColor(i); + var borderColor = getBorderColor(i); + var lineColor = getLineColor(i); + + // step circles + list.add( + GestureDetector( + onTap: () { + // Jump to the corresponding page when a step is tapped + pageController?.jumpToPage(i); + }, + child: Container( + width: 8.0, + height: 8.0, + child: getInnerElementOfStepper(i), + decoration: new BoxDecoration( + color: circleColor, + borderRadius: new BorderRadius.all(new Radius.circular(25.0)), + border: new Border.all( + color: borderColor, + width: 1.0, + ), + ), + ), + ), + ); + + //line between step circles + if (i != totalSteps - 1) { + list.add( + Expanded( + child: Container( + height: lineWidth, + color: lineColor, + ), + ), + ); + } + } + + return list; + } + + Widget getInnerElementOfStepper(index) { + if (index + 1 < curStep) { + return Container(); + } else if (index + 1 == curStep) { + return Center( + child: Text( + // '$curStep', + '', + style: TextStyle( + color: CustomColors().whitecolor, + fontWeight: FontWeight.bold, + fontFamily: 'Roboto', + ), + ), + ); + } else + return Container(); + } +} diff --git a/lib/src/common_widgets/custom_text_form_field.dart b/lib/src/common_widgets/custom_text_form_field.dart new file mode 100644 index 00000000..298579b5 --- /dev/null +++ b/lib/src/common_widgets/custom_text_form_field.dart @@ -0,0 +1,159 @@ +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class CustomTextFormField extends StatelessWidget { + const CustomTextFormField({ + super.key, + this.labelText, + this.suffixIcon, + required this.controller, + required this.textInputType, + // this.label, + this.errorText, + this.hintText, + this.onPressed, + this.onTap, + this.onChanged, + this.onFieldSubmitted, + this.onSaved, + this.validator, + this.enabled, + this.prefixIcon, + this.maxLines, + this.minimumLines, + this.onEditing, + this.prefixtext, + this.helptext, + this.focusNode, + this.obscureText = false, + this.autovalidateMode = AutovalidateMode.disabled, + this.suffixtext, + this.readOnly = false, + this.inputFormatter, + }); + + final String? labelText; + final String? hintText; + final int? maxLines; + final int? minimumLines; + final TextEditingController controller; + final TextInputType textInputType; + final IconData? suffixIcon; + final VoidCallback? onPressed; + final VoidCallback? onTap; + final ValueChanged? onFieldSubmitted; + final ValueChanged? onChanged; + final FormFieldValidator? validator; + final FormFieldSetter? onSaved; + final bool? enabled; + final Widget? prefixIcon; + final void Function()? onEditing; + final String? prefixtext; + final String? helptext; + final String? suffixtext; + final FocusNode? focusNode; + final String? errorText; + final bool obscureText; + final AutovalidateMode autovalidateMode; + final bool readOnly; + final TextInputFormatter? inputFormatter; + + @override + Widget build(BuildContext context) { + return TextFormField( + onFieldSubmitted: onFieldSubmitted, + onChanged: onChanged, + controller: controller, + onTap: onTap, + keyboardType: textInputType, + validator: validator, + maxLines: maxLines, + minLines: minimumLines, + enabled: enabled, + onEditingComplete: onEditing, + onSaved: onSaved, + obscureText: obscureText, + autovalidateMode: autovalidateMode, + inputFormatters: inputFormatter == null ? [] : [inputFormatter!], + // autofocus: true, + // textDirection: TextDirection.rtl, + readOnly: readOnly, + textAlign: TextAlign.right, + style: TextStyle( + overflow: TextOverflow.ellipsis, + color: CustomColors().whitecolor, // Set the text color + ), + + // style: Theme.of(context).textTheme.bodySmall, + cursorColor: CustomColors().whitecolor, + decoration: decoration(), + ); + } + + InputDecoration decoration() { + return InputDecoration( + contentPadding: const EdgeInsets.all(12.0), + hintMaxLines: 1, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(0.0), + borderSide: BorderSide( + color: CustomColors().grayColor, + )), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: CustomColors().grayColor, width: 0), + borderRadius: BorderRadius.circular(0.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: CustomColors().grayColor, width: 0), + borderRadius: BorderRadius.circular(0.0), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(0.0), + borderSide: BorderSide( + color: CustomColors().red, + width: 1, + ), + ), + errorText: errorText, + errorStyle: TextStyle(color: CustomColors().red), + helperText: helptext, + suffixText: suffixtext, + suffixStyle: TextStyle(color: CustomColors().whitecolor, fontSize: 17, fontWeight: FontWeight.normal), + labelText: labelText, + hintTextDirection: TextDirection.rtl, + floatingLabelBehavior: FloatingLabelBehavior.never, + labelStyle: TextStyle(color: CustomColors().lightblueColor, fontSize: 17, fontWeight: FontWeight.normal), + fillColor: CustomColors().grayColor, + filled: true, + isDense: true, + prefixText: controller.text.isEmpty ? prefixtext : null, + prefixStyle: TextStyle(color: CustomColors().whitecolor, fontSize: 17, fontWeight: FontWeight.normal), + hintText: hintText, + hintStyle: TextStyle( + overflow: TextOverflow.ellipsis, + color: CustomColors().lightblueColor, + fontSize: 17, + fontWeight: FontWeight.normal), + prefixIcon: prefixIcon, + prefixIconConstraints: prefixIcon != null + ? const BoxConstraints( + minWidth: 30, + minHeight: 30, + ) + : const BoxConstraints(), + suffixIcon: suffixIcon != null + ? IconButton( + icon: Icon( + suffixIcon, + color: CustomColors().lightblueColor, + size: 20, + ), + color: CustomColors().lightblueColor, + onPressed: onPressed, + iconSize: 20, + ) + : null, + ); + } +} \ No newline at end of file diff --git a/lib/src/common_widgets/empty_placeholder_widget.dart b/lib/src/common_widgets/empty_placeholder_widget.dart deleted file mode 100644 index 7776ccd7..00000000 --- a/lib/src/common_widgets/empty_placeholder_widget.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; -import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/routing/app_router.dart'; - -/// Placeholder widget showing a message and CTA to go back to the home screen. -class EmptyPlaceholderWidget extends ConsumerWidget { - const EmptyPlaceholderWidget({super.key, required this.message}); - final String message; - - @override - Widget build(BuildContext context, WidgetRef ref) { - return Padding( - padding: const EdgeInsets.all(Sizes.p16), - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - message, - style: Theme.of(context).textTheme.headlineMedium, - textAlign: TextAlign.center, - ), - gapH32, - PrimaryButton( - onPressed: () { - final isLoggedIn = - ref.watch(authRepositoryProvider).currentUser != null; - context.goNamed( - isLoggedIn ? AppRoute.jobs.name : AppRoute.signIn.name); - }, - text: 'Go Home', - ) - ], - ), - ), - ); - } -} diff --git a/lib/src/common_widgets/hamburger_menu.dart b/lib/src/common_widgets/hamburger_menu.dart new file mode 100644 index 00000000..44c148b1 --- /dev/null +++ b/lib/src/common_widgets/hamburger_menu.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/svg_loader.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; + +class HamburgerMenu extends ConsumerWidget { + final List menuItemList; + const HamburgerMenu({super.key, required this.menuItemList}); + @override + Widget build(BuildContext context, WidgetRef ref) => SafeArea( + child: PopupMenuButton( + icon: Container(child: SVGLoader().hamburgerMenuIcon), + clipBehavior: Clip.hardEdge, + offset: const Offset(20, 0), + padding: const EdgeInsets.all(0), + onSelected: (HamburgerMenuItem item) => item.function(), + itemBuilder: (_) { + List> list = List.empty(growable: true); + for (int i = 0; i < menuItemList.length; i++) { + list.add(PopupMenuItem(height: 25, value: menuItemList[i], child: menuItemList[i])); + if (i < menuItemList.length - 1) list.add(const PopupMenuDivider()); + } + return list; + })); +} + +class HamburgerMenuItem extends StatelessWidget { + final String title; + final Widget? tailIcon; + final Widget? leadIcon; + final Function function; + const HamburgerMenuItem({super.key, required this.title, required this.function, this.leadIcon, this.tailIcon}); + @override + Widget build(BuildContext context) => Row(children: [ + if (leadIcon != null) leadIcon!, + Text(title, style: TextStyle(color: CustomColors().whitecolor)), + const Spacer(), + if (tailIcon != null) tailIcon! + ]); +} diff --git a/lib/src/common_widgets/info_text_dialog.dart b/lib/src/common_widgets/info_text_dialog.dart new file mode 100644 index 00000000..783eef5f --- /dev/null +++ b/lib/src/common_widgets/info_text_dialog.dart @@ -0,0 +1,27 @@ +part of 'package:flutter_starter_base_app/src/utils/alert_dialogs.dart'; + +Future showInfoDialog( + BuildContext context, { + required String label, + required String content, +}) async { + return showDialog( + context: context, + builder: (context) => AlertDialog( + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12))), + insetPadding: const EdgeInsets.symmetric(horizontal: 40), + title: Text(label), + titleTextStyle: DanlawTheme().defaultTextStyle(14), + content: Text(content, maxLines: 5), + contentTextStyle: DanlawTheme().defaultTextStyle(14), + actionsAlignment: MainAxisAlignment.start, + actions: [ + TextButton(child: const Text("OK"), onPressed: () => context.pop()), + ], + ), + ); +} + + +// Usage +// showInfoDialog(context, label: "label", content: "content"); \ No newline at end of file diff --git a/lib/src/common_widgets/list_items_builder.dart b/lib/src/common_widgets/list_items_builder.dart index 675546d0..21b0e5da 100644 --- a/lib/src/common_widgets/list_items_builder.dart +++ b/lib/src/common_widgets/list_items_builder.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_starter_base_app/src/common_widgets/empty_content.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; typedef ItemWidgetBuilder = Widget Function(BuildContext context, T item); @@ -28,7 +29,7 @@ class ListItemsBuilder extends StatelessWidget { }, ) : const EmptyContent(), - loading: () => const Center(child: CircularProgressIndicator()), + loading: () => const Center(child: LoadingAnimation()), error: (_, __) => const EmptyContent( title: 'Something went wrong', message: 'Can\'t load items right now', diff --git a/lib/src/common_widgets/main_action_button.dart b/lib/src/common_widgets/main_action_button.dart new file mode 100644 index 00000000..4ad5e38a --- /dev/null +++ b/lib/src/common_widgets/main_action_button.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; + +class MainActionButton extends ConsumerWidget { + final Function onTap; + final bool isDisabled; + final String buttonText; + const MainActionButton({required this.buttonText, required this.onTap, this.isDisabled = false}); + @override + Widget build(BuildContext context, WidgetRef ref) => Container( + width: double.infinity, + child: ElevatedButton( + onPressed: () => isDisabled ? null : onTap(), + style: ButtonStyle( + backgroundColor: WidgetStateProperty.resolveWith( + (states) => isDisabled ? CustomColors().darkGrayBG : CustomColors().primaryTextColor)), + child: Text(buttonText, + style: TextStyle( + color: isDisabled ? CustomColors().lighterGrayText : CustomColors().secondaryButtonTextColor)))); +} diff --git a/lib/src/common_widgets/password_input.dart b/lib/src/common_widgets/password_input.dart new file mode 100644 index 00000000..c4d58ba3 --- /dev/null +++ b/lib/src/common_widgets/password_input.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/svg_loader.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; + +class PasswordInputField extends ConsumerWidget { + final String mainText; + final String hintText; + + final AutoDisposeStateProvider password; + + const PasswordInputField({super.key, required this.password, required this.hintText, required this.mainText}); + @override + Widget build(BuildContext context, WidgetRef ref) => Padding( + padding: const EdgeInsets.only(left: 10, right: 10, top: 5), + child: Container( + color: CustomColors().darkGrayBG, + padding: const EdgeInsets.only(left: 17, right: 17), + child: Row(mainAxisSize: MainAxisSize.min, children: [ + Flexible( + flex: 1, + fit: FlexFit.tight, + child: Row(children: [ + Text(mainText, style: DanlawTheme().defaultTextStyle(18)), + Tooltip( + message: 'description', + child: Container(padding: const EdgeInsets.only(left: 10), child: SVGLoader().questionMark)) + ])), + Flexible( + flex: 2, + fit: FlexFit.tight, + child: TextField( + autofocus: true, + obscureText: true, + obscuringCharacter: "*", + cursorColor: CustomColors().primaryTextColor, + onChanged: (newPassword) => ref.watch(password.notifier).update((state) => newPassword), + style: DanlawTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor), + decoration: InputDecoration( + filled: true, + hintText: hintText, + border: InputBorder.none, + fillColor: Colors.transparent, + hintTextDirection: TextDirection.rtl, + hintStyle: + DanlawTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor)))) + ]))); +} diff --git a/lib/src/common_widgets/primary_button.dart b/lib/src/common_widgets/primary_button.dart index c4a4a44f..f9bec473 100644 --- a/lib/src/common_widgets/primary_button.dart +++ b/lib/src/common_widgets/primary_button.dart @@ -1,5 +1,7 @@ +import 'package:flutter_starter_base_app/src/constants/colors.dart'; import 'package:flutter/material.dart'; import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; /// Primary button based on [ElevatedButton]. /// Useful for CTAs in the app. @@ -8,26 +10,38 @@ import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; /// the text. /// @param onPressed - callback to be called when the button is pressed. class PrimaryButton extends StatelessWidget { - const PrimaryButton( - {super.key, required this.text, this.isLoading = false, this.onPressed}); + const PrimaryButton({ + super.key, + required this.text, + this.isLoading = false, + this.onPressed, + this.backgroundColor, + }); final String text; final bool isLoading; final VoidCallback? onPressed; + final Color? backgroundColor; + @override Widget build(BuildContext context) { return SizedBox( height: Sizes.p48, + width: double.infinity, child: ElevatedButton( onPressed: onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: backgroundColor ?? + Theme.of(context).primaryColor, // Use provided background color or fallback to theme color + ), child: isLoading - ? const CircularProgressIndicator() + ? const LoadingAnimation() : Text( text, textAlign: TextAlign.center, - style: Theme.of(context) - .textTheme - .titleLarge! - .copyWith(color: Colors.white), + style: Theme.of(context).textTheme.titleMedium!.copyWith( + color: CustomColors().darkblueColor, + fontWeight: FontWeight.bold, // Set font weight to bold + ), // Use provided text color or fallback to white ), ), ); diff --git a/lib/src/common_widgets/reception_icon.dart b/lib/src/common_widgets/reception_icon.dart new file mode 100644 index 00000000..c532ff82 --- /dev/null +++ b/lib/src/common_widgets/reception_icon.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; + +/// https://www.mokoblue.com/measures-of-bluetooth-rssi/ +/// >>> For example, a pretty good value is below -50, a fairly reasonable value is between -70 to -80, while -100 indicates no signal at all. +// https://www.metageek.com/training/resources/understanding-rssi/ +class ReceptionIcon extends StatelessWidget { + final int level; + const ReceptionIcon({super.key, required this.level}); + @override + Widget build(BuildContext context) => switch (level) { + < -80 => Icon(Icons.wifi_1_bar, color: CustomColors().primaryTextColor), + < -60 => Icon(Icons.wifi_2_bar, color: CustomColors().primaryTextColor), + _ => Icon(Icons.wifi, color: CustomColors().primaryTextColor) + }; +} diff --git a/lib/src/common_widgets/secondary_action_button.dart b/lib/src/common_widgets/secondary_action_button.dart new file mode 100644 index 00000000..454725a2 --- /dev/null +++ b/lib/src/common_widgets/secondary_action_button.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; + +class SecondaryActionButton extends ConsumerWidget { + final Function onTap; + final bool isDisabled; + final String buttonText; + const SecondaryActionButton({super.key, required this.buttonText, required this.onTap, this.isDisabled = false}); + @override + Widget build(BuildContext context, WidgetRef ref) => InkWell( + onTap: () => onTap(), + child: Center( + child: Text(buttonText, style: TextStyle(color: CustomColors().primaryTextColor).copyWith(height: 5)))); +} diff --git a/lib/src/common_widgets/select_builder.dart b/lib/src/common_widgets/select_builder.dart new file mode 100644 index 00000000..bd320335 --- /dev/null +++ b/lib/src/common_widgets/select_builder.dart @@ -0,0 +1,71 @@ +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import '../domain/item.dart'; + +class SelectBuilder extends StatefulWidget { + const SelectBuilder({ + super.key, + required this.onSelect, + required this.items, + this.initialSelection, + this.multiSelect = false, + }); + + final void Function(List) onSelect; + final List items; + final List? initialSelection; + final bool multiSelect; + + @override + State createState() => _SelectBuilderState(); +} + +class _SelectBuilderState extends State { + Set _selectedItems = {}; + + @override + void initState() { + super.initState(); + if (widget.initialSelection != null) { + _selectedItems = Set.from(widget.initialSelection!); + } + } + + @override + Widget build(BuildContext context) { + return ListView.separated( + separatorBuilder: (context, index) => Divider(color: Colors.grey.shade900, height: 2), + itemCount: widget.items.length, + shrinkWrap: true, + itemBuilder: (context, index) { + final item = widget.items[index]; + final isSelected = _selectedItems.any((element) => element.value == item.value); + + return ListTile( + contentPadding: EdgeInsets.zero, + minVerticalPadding: 11, + minTileHeight: 11, + title: Text(item.label, style: DanlawTheme().defaultTextStyle(17)), + trailing: isSelected ? Icon(CupertinoIcons.check_mark, color: CustomColors().primaryTextColor) : null, + onTap: () => _onItemTap(item), + ); + }, + ); + } + + void _onItemTap(Item item) { + setState(() { + if (widget.multiSelect) { + if (_selectedItems.any((element) => element.value == item.value)) { + _selectedItems.removeWhere((element) => element.value == item.value); + } else { + _selectedItems.add(item); + } + } else { + _selectedItems = {item}; + } + }); + widget.onSelect(_selectedItems.toList()); + } +} diff --git a/lib/src/common_widgets/select_time_widget.dart b/lib/src/common_widgets/select_time_widget.dart new file mode 100644 index 00000000..d5887da5 --- /dev/null +++ b/lib/src/common_widgets/select_time_widget.dart @@ -0,0 +1,29 @@ +import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter/material.dart'; + +class SelectTimeWidget extends StatelessWidget { + const SelectTimeWidget({super.key, this.pageTitle, this.initialTime}); + + final String? pageTitle; + final TimeOfDay? initialTime; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: CustomColors().darkGray, + appBar: CustomAppBar( + showBackButton: true, + titleWidget: Text(pageTitle != null ? pageTitle! : "Alert Time"), + showHamburgerMenu: false), + body: Column( + children: [ + const SizedBox(height: 5), + TimePickerDialog( + initialTime: initialTime ?? TimeOfDay.now(), + ), + ], + ), + ); + } +} diff --git a/lib/src/common_widgets/subsection_title.dart b/lib/src/common_widgets/subsection_title.dart new file mode 100644 index 00000000..ce394400 --- /dev/null +++ b/lib/src/common_widgets/subsection_title.dart @@ -0,0 +1,13 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/constants/theme_data.dart'; + +class SubSectionTitle extends StatelessWidget { + final String text; + + const SubSectionTitle({super.key, required this.text}); + @override + Widget build(BuildContext context) => Padding( + padding: const EdgeInsets.only(left: 15, right: 10, top: 15, bottom: 5), + child: Text(text, style: DanlawTheme().defaultTextStyle(12).copyWith(color: CustomColors().lightGrayText))); +} diff --git a/lib/src/common_widgets/text_input.dart b/lib/src/common_widgets/text_input.dart new file mode 100644 index 00000000..c5fa518b --- /dev/null +++ b/lib/src/common_widgets/text_input.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/svg_loader.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; + +class TextInputField extends ConsumerWidget { + final String mainText; + final String hintText; + final String? Function(String?)? validator; + final TextInputFormatter? inputFormatter; + final AutoDisposeStateProvider textProvider; + + const TextInputField({ + super.key, + required this.textProvider, + required this.hintText, + required this.mainText, + this.inputFormatter, + this.validator, + }); + @override + Widget build(BuildContext context, WidgetRef ref) => Padding( + padding: const EdgeInsets.only(left: 10, right: 10, top: 5), + child: Container( + color: CustomColors().darkGrayBG, + padding: const EdgeInsets.only(left: 17, right: 17), + child: Row(mainAxisSize: MainAxisSize.min, children: [ + Flexible( + flex: 1, + fit: FlexFit.tight, + child: Row(children: [ + Text(mainText, style: DanlawTheme().defaultTextStyle(18)), + Tooltip( + message: 'description', + child: Container(padding: const EdgeInsets.only(left: 10), child: SVGLoader().questionMark)) + ])), + Flexible( + flex: 1, + fit: FlexFit.tight, + child: TextFormField( + autofocus: true, + cursorColor: CustomColors().primaryTextColor, + onChanged: (newPassword) => ref.watch(textProvider.notifier).update((state) => newPassword), + style: DanlawTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor), + validator: validator, + inputFormatters: inputFormatter == null ? [] : [inputFormatter!], + decoration: InputDecoration( + filled: true, + hintText: hintText, + border: InputBorder.none, + fillColor: Colors.transparent, + hintTextDirection: TextDirection.rtl, + hintStyle: + DanlawTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor)))) + ]))); +} diff --git a/lib/src/constants/colors.dart b/lib/src/constants/colors.dart new file mode 100644 index 00000000..71d92060 --- /dev/null +++ b/lib/src/constants/colors.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart' show Color; +import 'package:hexcolor/hexcolor.dart' show HexColor; + +enum ColorPattern { green, blue, red, gray } + +Map colorPatternMap = { + CustomColors().chargerGreen: ColorPattern.green, + CustomColors().chargerBlue: ColorPattern.blue, + CustomColors().chargerRed: ColorPattern.red, + CustomColors().darkGrayBG: ColorPattern.gray, +}; + +/// Stores Custom Theme colors +class CustomColors { + Color get red => HexColor('#CE0B00'); + + /// Hamburger menu BG + Color get darkMenuBG => const Color.fromARGB(255, 58, 58, 60); + + Color get darkestGrayBG => HexColor('#00000000'); + + /// Circular indicator paint on idle + Color get lighterGrayText => HexColor('#FFCBCBCB'); + + /// Circular indicator paint BG on idle + Color get lightGrayText => HexColor('#FF727272'); + + /// - Bottom Nav. Bar BG + Color get darkGrayBG => HexColor('#A6545458'); + + Color get darkerGrayBG => HexColor('#993B383E'); + + /// - Bottom Nav. Bar inactive text + Color get darkGrayText => HexColor('#999999'); + + /// - Bottom Nav. Bar active item/text + Color get primaryTextColor => HexColor('#D0BCFF'); + + /// - Remove Household Button BG + Color get secondaryButtonBG => HexColor('#EFB8C8'); + // Color get primaryButtonTextColor => HexColor("#381E72"); + Color get secondaryButtonTextColor => HexColor('#381E72'); + + /// Charger green + Color get chargerGreen => HexColor('#00FF1A'); + Color get buttonGreen => HexColor('#33C542'); + + ///Charger blue + Color get chargerBlue => HexColor('#02B0F0'); + + /// Charger orange + Color get chargerRed => HexColor('#ED5601'); + Color get chargerGray => HexColor('#FFFFFF'); + + /// Circular indicator + Color get circularIndicatorBG => HexColor('#002A25'); //#002A25//#007568//#BDFF00//FD0000 + + Color get vehicleBlueMask => HexColor('#CDE8E1'); + Color get vehicleRedMask => HexColor('#ED5601'); + Color get vehicleGreenMask => HexColor('#86FE16'); + + /// Gauge colors + + Color get batteryRed => HexColor('FFFD0000'); + Color get batteryOrange => HexColor('#FFBDFF00'); + // Color get batteryOrangishYellow => HexColor('#FF007568'); + Color get batteryGreen => HexColor('#00FF38'); + Color get batteryYellowishGreen => HexColor('#D9FD00'); + Color get darkGray => HexColor("#1C1C1E"); + Color get grayColor => const Color.fromRGBO(84, 84, 88, 0.65); + + Color get lightblueColor => HexColor("#D0BCFF"); /* primarybuttonBGcolor, hinttextcolor, actiontextbuttoncolor */ + Color get darkblueColor => HexColor("#381E72"); /*primarybuttontextcolor*/ + Color get whitecolor => HexColor("#FFFFFF"); /* TextColor*/ + Color get lightGrayColor => HexColor('#3A3A3C'); // Card background color + Color get darkelevatedColor => HexColor("#3A3A3C"); + + Color get lightredColor => HexColor("#EFB8C8"); + + Color get secondaryDark =>const Color.fromRGBO(235, 235, 245, 0.6); + Color get progressBarFilledColor => primaryTextColor; + Color get progressBarInactiveColor => HexColor('#ffbababa'); + Color get blueColor => HexColor("02B0F0"); //Manual schedule available hours color + Color get blackColor => HexColor("38383A"); // Not avilable hours color + + /// Reports Page + Color get reportBarBlue => HexColor('#02B0F0'); + Color get reportBarGray => HexColor('#EBEBF5'); + Color get reportByButtonBG => HexColor('#4A4458'); + Color get tableBorderColor => HexColor('#99EBEBF5'); + + ///Setup flow + Color get setUpText => HexColor("#CCC2DC"); + + ///close icon + Color get bgCloseIcon => const Color.fromRGBO(127, 127, 127, 0.5); + Color get closeIcon => const Color.fromRGBO(141, 135, 135, 1); + + // dialog color + Color get materialGrayBG => HexColor('#FF3B383E'); +} diff --git a/lib/src/constants/env_constants.dart b/lib/src/constants/env_constants.dart new file mode 100644 index 00000000..6cceb780 --- /dev/null +++ b/lib/src/constants/env_constants.dart @@ -0,0 +1,20 @@ +class EnvValues { + static String get productionEnv => 'prod'; + static String get preProductionEnv => 'preprod'; + static String get developmentEnv => 'dev'; + + static const String env = String.fromEnvironment('ENV'); + static const String username = String.fromEnvironment('USERNAME'); + static const String password = String.fromEnvironment('PASSWORD'); + + static const String apiEnv = String.fromEnvironment('API_ENV'); + static const String apiHost = String.fromEnvironment('API_HOST'); + static const String apiVersion = String.fromEnvironment('API_VERSION'); + static const String apiAccessToken = String.fromEnvironment('API_ACCESS_TOKEN'); + static const String apiRefreshToken = String.fromEnvironment('API_REFRESH_TOKEN'); +} + +class EnvKeys { + static String get apiAccessTokenKey => 'API_ACCESS_TOKEN'; + static String get apiRefreshTokenKey => 'API_REFRESH_TOKEN'; +} diff --git a/lib/src/constants/keys.dart b/lib/src/constants/keys.dart index ab319745..672b873a 100644 --- a/lib/src/constants/keys.dart +++ b/lib/src/constants/keys.dart @@ -8,4 +8,7 @@ class Keys { static const String logout = 'logout'; static const String alertDefault = 'alertDefault'; static const String alertCancel = 'alertCancel'; + + static const String invalidVIN = 'Received VIN is not valid'; + static const String negativeRange = 'Received vehicle range is negative'; } diff --git a/lib/src/constants/strings.dart b/lib/src/constants/strings.dart index ef092248..b5367216 100644 --- a/lib/src/constants/strings.dart +++ b/lib/src/constants/strings.dart @@ -5,8 +5,7 @@ class Strings { // Logout static const String logout = 'Logout'; - static const String logoutAreYouSure = - 'Are you sure that you want to logout?'; + static const String logoutAreYouSure = 'Are you sure that you want to logout?'; static const String logoutFailed = 'Logout failed'; // Sign In Page @@ -16,8 +15,13 @@ class Strings { static const String or = 'or'; static const String signInFailed = 'Sign in failed'; + static const String home = 'home'; + static const String account = 'account'; + static const String alerts = 'alerts'; + static const String schedule = 'schedule'; + static const String reports = 'reports'; // Home page - static const String homePage = 'Home Page'; + // static const String homePage = 'Home Page'; // Jobs page static const String jobs = 'Jobs'; @@ -26,6 +30,6 @@ class Strings { static const String entries = 'Entries'; // Account page - static const String account = 'Account'; - static const String accountPage = 'Account Page'; + // static const String account = 'Account'; + // static const String accountPage = 'Account Page'; } diff --git a/lib/src/constants/svg_loader.dart b/lib/src/constants/svg_loader.dart new file mode 100644 index 00000000..32dd1d17 --- /dev/null +++ b/lib/src/constants/svg_loader.dart @@ -0,0 +1,190 @@ +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/constants/strings.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_svg/flutter_svg.dart' hide Svg; + +class SVGLoader { + final String _bottomAppBarAssetPath = 'assets/bottom_navigation_bar/'; + final String _vehicleIconPath = 'assets/vehicle_icon/'; + final String _smallChargerIconPath = 'assets/charger_icon/small/'; + final String _redsPath = 'assets/charger_icon/red/'; + final String _bluesPath = 'assets/charger_icon/blue/'; + final String _graysPath = 'assets/charger_icon/gray/'; + final String _greensPath = 'assets/charger_icon/green/'; + final String _detailIconPath = 'assets/detail_icon/'; + final String _chargerSetupIconPath = 'assets/setup_charger/'; + final String _dongleSetupIconPath = 'assets/setup_dongle/'; + + /// ----- Bottom Bar Icons ----- + Widget get accountIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}account.svg', + semanticsLabel: Strings.account, + colorFilter: ColorFilter.mode(CustomColors().primaryTextColor, BlendMode.srcIn), + ); + Widget get accountInactiveIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}account.svg', + semanticsLabel: Strings.account, + colorFilter: ColorFilter.mode(CustomColors().darkGrayText, BlendMode.srcIn), + ); + Widget get alertsIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}alerts.svg', + semanticsLabel: Strings.alerts, + colorFilter: ColorFilter.mode(CustomColors().primaryTextColor, BlendMode.srcIn), + ); + Widget get alertsInactiveIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}alerts.svg', + semanticsLabel: Strings.alerts, + colorFilter: ColorFilter.mode(CustomColors().darkGrayText, BlendMode.srcIn), + ); + Widget get homeIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}home.svg', + semanticsLabel: Strings.home, + colorFilter: ColorFilter.mode(CustomColors().primaryTextColor, BlendMode.srcIn), + ); + Widget get homeInactiveIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}home.svg', + semanticsLabel: Strings.home, + colorFilter: ColorFilter.mode(CustomColors().darkGrayText, BlendMode.srcIn), + ); + Widget get reportsIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}reports.svg', + semanticsLabel: Strings.reports, + colorFilter: ColorFilter.mode(CustomColors().primaryTextColor, BlendMode.srcIn), + ); + Widget get reportsInactiveIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}reports.svg', + semanticsLabel: Strings.reports, + colorFilter: ColorFilter.mode(CustomColors().darkGrayText, BlendMode.srcIn), + ); + Widget get scheduleIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}schedule.svg', + semanticsLabel: Strings.schedule, + colorFilter: ColorFilter.mode(CustomColors().primaryTextColor, BlendMode.srcIn), + ); + Widget get scheduleInactiveIcon => SvgPicture.asset( + '${_bottomAppBarAssetPath}schedule.svg', + semanticsLabel: Strings.schedule, + colorFilter: ColorFilter.mode(CustomColors().darkGrayText, BlendMode.srcIn), + ); + + SvgPicture getVehicleIcon(String iconName, {ColorFilter? colorFilter}) => + SvgPicture.asset('${_vehicleIconPath + iconName}.svg', + semanticsLabel: Strings.schedule, colorFilter: colorFilter); + + SvgPicture getSUVIcon({ColorFilter? colorFilter}) => + SvgPicture.asset('${_vehicleIconPath}suv.svg', semanticsLabel: Strings.schedule, colorFilter: colorFilter); + + /// ----- Vehicle Icons ----- + SvgPicture getMotoIcon({ColorFilter? colorFilter}) => + SvgPicture.asset('${_vehicleIconPath}motorcycle.svg', semanticsLabel: Strings.schedule, colorFilter: colorFilter); + SvgPicture getLorryIcon({ColorFilter? colorFilter}) => + SvgPicture.asset('${_vehicleIconPath}van.svg', semanticsLabel: Strings.schedule, colorFilter: colorFilter); + SvgPicture getSedanIcon({ColorFilter? colorFilter}) => + SvgPicture.asset('${_vehicleIconPath}sedan.svg', semanticsLabel: Strings.schedule, colorFilter: colorFilter); + SvgPicture getPickupIcon({ColorFilter? colorFilter}) => + SvgPicture.asset('${_vehicleIconPath}pickup.svg', semanticsLabel: Strings.schedule, colorFilter: colorFilter); + + /// - Small + Widget get smallRedChargerIcon => SvgPicture.asset('${_smallChargerIconPath}red.svg'); + Image get smallRedChargerGlow => Image.asset('${_smallChargerIconPath}red_glow.png', fit: BoxFit.cover); + Widget get smallIdleChargerIcon => SvgPicture.asset('${_smallChargerIconPath}idle.svg'); + + Widget get tinyRed => SvgPicture.asset('${_redsPath}tiny.svg'); + Image get tinyRedGlow => Image.asset('${_redsPath}tiny_glow.png', fit: BoxFit.cover); + Widget get smallRed => SvgPicture.asset('${_redsPath}small.svg'); + Image get smallRedGlow => Image.asset('${_redsPath}small_glow.png', fit: BoxFit.cover); + Widget get mediumRed => SvgPicture.asset('${_redsPath}medium.svg'); + Image get mediumRedGlow => Image.asset('${_redsPath}medium_glow.png', fit: BoxFit.cover); + Widget get largeRed => SvgPicture.asset('${_redsPath}large.svg'); + Image get largeRedGlow => Image.asset('${_redsPath}large_glow.png', fit: BoxFit.cover); + + Widget get tinyGray => SvgPicture.asset('${_graysPath}tiny.svg'); + Widget get smallGray => SvgPicture.asset('${_graysPath}small.svg'); + Widget get mediumGray => SvgPicture.asset('${_graysPath}medium.svg'); + Widget get largeGray => SvgPicture.asset('${_graysPath}large.svg'); + Image get emptyGlow => Image.asset('${_graysPath}empty.png'); + + Widget get tinyBlue => SvgPicture.asset('${_bluesPath}tiny.svg'); + Image get tinyBlueGlow => Image.asset('${_bluesPath}tiny_glow.png', fit: BoxFit.cover); + Widget get smallBlue => SvgPicture.asset('${_bluesPath}small.svg'); + Image get smallBlueGlow => Image.asset('${_bluesPath}small_glow.png', fit: BoxFit.cover); + Widget get mediumBlue => SvgPicture.asset('${_bluesPath}medium.svg'); + Image get mediumBlueGlow => Image.asset('${_bluesPath}medium_glow.png', fit: BoxFit.cover); + Widget get largeBlue => SvgPicture.asset('${_bluesPath}large.svg'); + Image get largeBlueGlow => Image.asset('${_bluesPath}large_glow.png', fit: BoxFit.cover); + + Widget get tinyGreen => SvgPicture.asset('${_greensPath}tiny.svg'); + Image get tinyGreenGlow => Image.asset('${_greensPath}tiny_glow.png', fit: BoxFit.cover); + Widget get smallGreen => SvgPicture.asset('${_greensPath}small.svg'); + Image get smallGreenGlow => Image.asset('${_greensPath}small_glow.png', fit: BoxFit.cover); + Widget get mediumGreen => SvgPicture.asset('${_greensPath}medium.svg'); + Image get mediumGreenGlow => Image.asset('${_greensPath}medium_glow.png', fit: BoxFit.cover); + Widget get largeGreen => SvgPicture.asset('${_greensPath}large.svg'); + Image get largeGreenGlow => Image.asset('${_greensPath}large_glow.png', fit: BoxFit.cover); + + /// ----- Detail Page Icons ----- + Widget get questionMark => SvgPicture.asset('${_detailIconPath}question_mark.svg'); + Widget get rightArrow => SvgPicture.asset('${_detailIconPath}right_arrow.svg'); + Widget get leftArrow => SvgPicture.asset('${_detailIconPath}left_arrow.svg'); + Widget get checkMark => SvgPicture.asset('${_detailIconPath}check_mark.svg'); + Widget get emptyMark => SvgPicture.asset('${_detailIconPath}empty_mark.svg'); + Widget get chargerWifi => SvgPicture.asset('${_detailIconPath}wifi_charger_icon.svg'); + Widget get wifi => SvgPicture.asset('${_detailIconPath}wifi_icon.svg'); + + /// ----- Misc ----- + Widget get hamburgerMenuIcon => SvgPicture.asset('assets/hamburger_menu_icon.svg'); + Widget get chargerRateIcon => SvgPicture.asset('assets/charge_rate_icon.svg'); + Widget get closeIcon => SvgPicture.asset('assets/close_button.svg', height: 40); + Widget get externalLinkIcon => SvgPicture.asset('assets/external_link.svg'); + + /// ----- Add Charger ----- + Widget get phoneBGImage => Image.asset('${_chargerSetupIconPath}phone_background.png'); + Widget get phoneImage => Image.asset('${_chargerSetupIconPath}phone.png'); + Widget get qrChargerIcon => Image.asset('${_chargerSetupIconPath}qr_charger.png'); + Widget get plugChargerIcon => SvgPicture.asset('${_chargerSetupIconPath}plug_charger.svg'); + Widget get bluetoothIcon => SvgPicture.asset('${_chargerSetupIconPath}bluetooth_icon.svg'); + Widget get connectionFailIcon => SvgPicture.asset('${_chargerSetupIconPath}connection_fail.svg'); + Widget get emptyCircleIcon => SvgPicture.asset('${_chargerSetupIconPath}empty_circle_large.svg'); + Widget get connectionSuccessIcon => SvgPicture.asset('${_chargerSetupIconPath}connection_success.svg'); + Widget get addChargerButtonIcon => SvgPicture.asset('assets/add_button_icon.svg'); + + /// ----- Add Dongle ----- + Widget get vehicleImage => Image.asset('${_dongleSetupIconPath}vehicle_icon.png'); + Widget get dongleImage => Image.asset('${_dongleSetupIconPath}dongle.png'); + Widget get dongleInstalleImage => Image.asset('${_dongleSetupIconPath}install_image.png'); + +// todo move + List> getChargerSizeMap(ColorPattern pattern) { + switch (pattern) { + case ColorPattern.red: + return [ + {tinyRed: emptyGlow}, + {smallRed: emptyGlow}, + {mediumRed: emptyGlow}, + {largeRed: emptyGlow} + ]; + case ColorPattern.green: + return [ + {tinyGreen: tinyGreenGlow}, + {smallGreen: smallGreenGlow}, + {mediumGreen: mediumGreenGlow}, + {largeGreen: largeGreenGlow}, + ]; + case ColorPattern.blue: + return [ + {tinyBlue: emptyGlow}, + {smallBlue: emptyGlow}, + {mediumBlue: emptyGlow}, + {largeBlue: emptyGlow}, + ]; + case ColorPattern.gray: + return [ + {tinyGray: emptyGlow}, + {smallGray: emptyGlow}, + {mediumGray: emptyGlow}, + {largeGray: emptyGlow}, + ]; + } + } +} diff --git a/lib/src/constants/theme_data.dart b/lib/src/constants/theme_data.dart new file mode 100644 index 00000000..f4b2f84d --- /dev/null +++ b/lib/src/constants/theme_data.dart @@ -0,0 +1,98 @@ +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter/material.dart'; + +const primaryColor = Colors.black; + +class DanlawTheme { + TextStyle defaultTextStyle(double fontSize) => + TextStyle(color: Colors.white, fontSize: fontSize, overflow: TextOverflow.ellipsis); + BoxDecoration getColoredBoxDecoration(Color color) => BoxDecoration( + border: Border.all(color: color, width: 2, style: BorderStyle.solid), + color: CustomColors().darkestGrayBG, + borderRadius: const BorderRadius.all(Radius.circular(25))); + BoxDecoration getColoredBoxDecorationSharper(Color color) => BoxDecoration( + border: Border.all(color: color, width: 2, style: BorderStyle.solid), + color: CustomColors().darkestGrayBG, + borderRadius: const BorderRadius.all(Radius.circular(10))); + ThemeData get themeData => ThemeData( + colorSchemeSeed: primaryColor, + unselectedWidgetColor: Colors.grey, + appBarTheme: AppBarTheme( + backgroundColor: primaryColor, + foregroundColor: Colors.white, + elevation: 2.0, + centerTitle: true, + iconTheme: IconThemeData(color: CustomColors().primaryTextColor)), + scaffoldBackgroundColor: const Color.fromARGB(255, 0, 0, 0), + popupMenuTheme: PopupMenuThemeData( + position: PopupMenuPosition.under, + color: CustomColors().darkMenuBG, + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10)))), + dividerTheme: const DividerThemeData(color: Color.fromARGB(51, 255, 255, 255)), + dividerColor: const Color.fromARGB(255, 255, 255, 255), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(primaryColor), + foregroundColor: WidgetStateProperty.all(Colors.white))), + bottomAppBarTheme: const BottomAppBarTheme(color: Colors.black), + outlinedButtonTheme: OutlinedButtonThemeData( + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(primaryColor), + foregroundColor: WidgetStateProperty.all(Colors.white))), + textButtonTheme: TextButtonThemeData( + style: ButtonStyle(foregroundColor: WidgetStateProperty.all(CustomColors().primaryTextColor)), + ), + floatingActionButtonTheme: const FloatingActionButtonThemeData(backgroundColor: primaryColor), + timePickerTheme: TimePickerThemeData( + helpTextStyle: TextStyle(color: CustomColors().lighterGrayText), + backgroundColor: const Color.fromRGBO(43, 41, 48, 1), + hourMinuteColor: WidgetStateColor.resolveWith( + (states) => states.contains(WidgetState.selected) + ? const Color.fromRGBO(79, 55, 139, 1) + : const Color.fromRGBO(54, 52, 59, 1), + ), + hourMinuteTextColor: WidgetStateColor.resolveWith( + (states) => states.contains(WidgetState.selected) + ? const Color.fromRGBO(234, 221, 255, 1) + : CustomColors().lighterGrayText, + ), + dialBackgroundColor: const Color.fromRGBO(54, 52, 59, 1), + dialTextColor: WidgetStateColor.resolveWith( + (states) => states.contains(WidgetState.selected) ? Colors.black : Colors.white, + ), + dialHandColor: CustomColors().primaryTextColor, + dayPeriodBorderSide: BorderSide( + color: CustomColors().lightGrayText, + ), + dayPeriodColor: WidgetStateColor.resolveWith( + (states) => + states.contains(WidgetState.selected) ? const Color.fromRGBO(99, 59, 72, 1) : Colors.transparent, + ), + dayPeriodTextColor: WidgetStateColor.resolveWith( + (states) => states.contains(WidgetState.selected) + ? const Color.fromRGBO(255, 216, 228, 1) + : CustomColors().lighterGrayText, + ), + entryModeIconColor: CustomColors().lightGrayText, + cancelButtonStyle: ButtonStyle(foregroundColor: WidgetStatePropertyAll(CustomColors().primaryTextColor)), + confirmButtonStyle: ButtonStyle(foregroundColor: WidgetStatePropertyAll(CustomColors().primaryTextColor)), + ), + dataTableTheme: DataTableThemeData( + headingRowColor: WidgetStatePropertyAll(CustomColors().darkerGrayBG), + decoration: BoxDecoration( + border: Border.symmetric(horizontal: BorderSide(color: CustomColors().tableBorderColor, width: .5))), + dataTextStyle: defaultTextStyle(11).copyWith(color: CustomColors().tableBorderColor), + columnSpacing: 0, + horizontalMargin: 0, + dataRowMinHeight: 4, + dataRowMaxHeight: 20, + dividerThickness: .5, + headingRowHeight: 24, + dataRowColor: WidgetStatePropertyAll(CustomColors().darkerGrayBG)), + dialogTheme: DialogTheme( + backgroundColor: CustomColors().materialGrayBG, + titleTextStyle: defaultTextStyle(24).copyWith(color: Colors.white), + contentTextStyle: defaultTextStyle(14).copyWith(color: CustomColors().lighterGrayText), + ), + ); +} diff --git a/lib/src/domain/account.dart b/lib/src/domain/account.dart new file mode 100644 index 00000000..931dfad1 --- /dev/null +++ b/lib/src/domain/account.dart @@ -0,0 +1,30 @@ +import 'package:json_annotation/json_annotation.dart'; +part 'account.g.dart'; + +@JsonSerializable(explicitToJson: true) +class AccountDetails { + String phoneNumber; + String emailId; + + AccountDetails({required this.emailId, required this.phoneNumber}); + factory AccountDetails.fromJson(Map json) => _$AccountDetailsFromJson(json); + Map toJson() => _$AccountDetailsToJson(this); +} + +@JsonSerializable() +class AccountVehicle { + final String vin; + final String vehicleName; + final String year; + final String make; + final String model; + AccountVehicle({ + required this.make, + required this.model, + required this.vehicleName, + required this.vin, + required this.year, + }); + factory AccountVehicle.fromJson(Map json) => _$AccountVehicleFromJson(json); + Map toJson() => _$AccountVehicleToJson(this); +} diff --git a/lib/src/domain/basic_api_response.dart b/lib/src/domain/basic_api_response.dart new file mode 100644 index 00000000..14ec0bc3 --- /dev/null +++ b/lib/src/domain/basic_api_response.dart @@ -0,0 +1,16 @@ +import 'package:json_annotation/json_annotation.dart'; +part 'basic_api_response.g.dart'; + +@JsonSerializable() +class APIResponse { + + factory APIResponse.failed() => APIResponse(message: "Failed", status: "500"); + factory APIResponse.success() => APIResponse(message: "Success", status: "200"); + + final String message; + final dynamic status; + APIResponse({required this.message, required this.status}); + factory APIResponse.fromJson(Map json) => _$APIResponseFromJson(json); + Map toJson() => _$APIResponseToJson(this); + +} diff --git a/lib/src/domain/country_data.dart b/lib/src/domain/country_data.dart new file mode 100644 index 00000000..f7cd6b2e --- /dev/null +++ b/lib/src/domain/country_data.dart @@ -0,0 +1,38 @@ +import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:json_annotation/json_annotation.dart'; +part 'country_data.g.dart'; + +@JsonSerializable() +class Country with Item { + final String name; + final String code; + final String telephoneCode; + Country({ + required this.code, + required this.name, + required this.telephoneCode, + }); + + factory Country.fromJson(Map json) => _$CountryFromJson(json); + Map toJson() => _$CountryToJson(this); + + @override + String get label => name; + @override + String get value => code; +} + +@JsonSerializable() +class State with Item { + final String name; + final String code; + State({required this.code, required this.name}); + + factory State.fromJson(Map json) => _$StateFromJson(json); + Map toJson() => _$StateToJson(this); + + @override + String get label => name; + @override + String get value => code; +} diff --git a/lib/src/domain/item.dart b/lib/src/domain/item.dart new file mode 100644 index 00000000..85c56b39 --- /dev/null +++ b/lib/src/domain/item.dart @@ -0,0 +1,4 @@ +mixin Item { + String get label; + T get value; +} diff --git a/lib/src/domain/label_value.dart b/lib/src/domain/label_value.dart new file mode 100644 index 00000000..01ecbe09 --- /dev/null +++ b/lib/src/domain/label_value.dart @@ -0,0 +1,22 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:json_annotation/json_annotation.dart'; +part 'label_value.g.dart'; + +@JsonSerializable(explicitToJson: true) +class LabelValuePair extends Equatable implements Item { + final String label; + final dynamic value; + const LabelValuePair({required this.label, required this.value}); + factory LabelValuePair.fromJson(Map json) => _$LabelValuePairFromJson(json); + Map toJson() => _$LabelValuePairToJson(this); + + @override + List get props => [value]; + + @override + bool get stringify => true; + + String get displayText => label; +} + diff --git a/lib/src/domain/user.dart b/lib/src/domain/user.dart new file mode 100644 index 00000000..c0feca77 --- /dev/null +++ b/lib/src/domain/user.dart @@ -0,0 +1,7 @@ +class User { + final String emailId; + //with country code + final String phone; + String? dongleId; + User({required this.emailId, required this.phone, this.dongleId}); +} diff --git a/lib/src/domain/wifi_details.dart b/lib/src/domain/wifi_details.dart new file mode 100644 index 00000000..0cb31481 --- /dev/null +++ b/lib/src/domain/wifi_details.dart @@ -0,0 +1,6 @@ +class WifiDetails { + final String ssid; + final String mac; + final String ip; + WifiDetails({required this.ssid, required this.mac, required this.ip}); +} diff --git a/lib/src/features/account/data/account_provider.dart b/lib/src/features/account/data/account_provider.dart new file mode 100644 index 00000000..8640dea9 --- /dev/null +++ b/lib/src/features/account/data/account_provider.dart @@ -0,0 +1,34 @@ +import 'package:flutter_starter_base_app/src/api/api.dart'; +import 'package:flutter_starter_base_app/src/api/api_facade.dart'; +import 'package:flutter_starter_base_app/src/domain/account.dart'; +import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/features/account/domain/create_account.dart'; +import 'package:flutter_starter_base_app/src/features/account/domain/eula.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'account_provider.g.dart'; + +@riverpod +Future fetchAccountDetails(FetchAccountDetailsRef ref) async => + await (await APIFacade().getApi()).getAccountDetails(); + +@Riverpod(dependencies: []) +Future fetchEULAStatus(FetchEULAStatusRef ref) async => await (await APIFacade().getApi()).acceptedEULA(); +@Riverpod(dependencies: []) +Future fetchEULA(FetchEULARef ref, {required String languageCode}) async => await API().getEULA(languageCode); + +@riverpod +Future submitEULA(SubmitEULARef ref, {required String agreementId}) async => await API().submitEULA(agreementId); + +/// tracks EULA ID +StateProvider eulaProvider = StateProvider((ref) => null); + +@riverpod +Future createAccount(CreateAccountRef ref, {required CreateAccountRequest createAccountRequest}) async { + return await API().createAccount(createAccountRequest: createAccountRequest); +} + +@riverpod +Future saveAccountDetails(SaveAccountDetailsRef ref,{required String phoneNumber, required String emailId}) async{ + return await API().saveAccountDetails(phoneNumber:phoneNumber,emailId:emailId); +} \ No newline at end of file diff --git a/lib/src/features/account/domain/create_account.dart b/lib/src/features/account/domain/create_account.dart new file mode 100644 index 00000000..eaa696ae --- /dev/null +++ b/lib/src/features/account/domain/create_account.dart @@ -0,0 +1,23 @@ + +import 'package:json_annotation/json_annotation.dart'; +part 'create_account.g.dart'; + +@JsonSerializable() +class CreateAccountRequest { + final String username; + final String email; + final String password; + final String phoneNumber; + final String languageCode; + CreateAccountRequest({ + required this.username, + required this.email, + required this.password, + required this.phoneNumber, + required this.languageCode, + }); + factory CreateAccountRequest.fromJson(Map json) => + _$CreateAccountRequestFromJson(json); + Map toJson() => _$CreateAccountRequestToJson(this); +} + \ No newline at end of file diff --git a/lib/src/features/account/domain/eula.dart b/lib/src/features/account/domain/eula.dart new file mode 100644 index 00000000..fb68cb27 --- /dev/null +++ b/lib/src/features/account/domain/eula.dart @@ -0,0 +1,11 @@ +import 'package:json_annotation/json_annotation.dart'; +part 'eula.g.dart'; + +@JsonSerializable() +class EULA { + final String agreementId; + final String text; + EULA({required this.text, required this.agreementId}); + factory EULA.fromJson(Map json) => _$EULAFromJson(json); + Map toJson() => _$EULAToJson(this); +} diff --git a/lib/src/features/account/presentation/add_account_flow.dart b/lib/src/features/account/presentation/add_account_flow.dart new file mode 100644 index 00000000..73f46131 --- /dev/null +++ b/lib/src/features/account/presentation/add_account_flow.dart @@ -0,0 +1,645 @@ +import 'package:flutter_starter_base_app/src/common_widgets/action_text_button.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/custom_stepper.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/features/account/domain/create_account.dart'; +import 'package:flutter_starter_base_app/src/features/account/presentation/add_account_page.dart'; +import 'package:flutter_starter_base_app/src/features/account/presentation/username_password_page.dart'; +import 'package:flutter_starter_base_app/src/features/account/presentation/default_contact_info_page.dart'; +import 'package:flutter_starter_base_app/src/features/account/presentation/eula_view.dart'; +import 'package:flutter_starter_base_app/src/utils/authentication_handler.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:easy_localization/easy_localization.dart'; + +class AddAccountFLow extends ConsumerStatefulWidget { + const AddAccountFLow({super.key}); + + @override + ConsumerState createState() => _AddAccountFLowState(); +} + +class _AddAccountFLowState extends ConsumerState { + List pages = []; + int currentStep = 0; + PageController pageController = PageController(); + bool complete = false; + String title = LocaleKeys.account_wizard_title.tr(); + bool isAccountCreated = false; + bool isHouseholdStepComplete = false; + PricingMethodType? pricingMethod; + String selectedUtility = ""; + String selectedRateProgram = ""; + var selectedCustomRate; + bool pricingMethodavailable = false; + bool utilityrateavailable = false; + bool rateprogrameavailble = false; + bool customrateavailble = false; + bool ispricingSelecte = false; + final GlobalKey _createaccountformKey = GlobalKey(); + final GlobalKey _createaccounthouseholdformKey = GlobalKey(); + final GlobalKey _createaccounthouseholdadressformKey = GlobalKey(); + final GlobalKey _createinfoformKey = GlobalKey(); +// / Controllers for Create Account form + TextEditingController usernameController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + TextEditingController confirmPasswordController = TextEditingController(); + // Controllers for Create Household form + TextEditingController nameController = TextEditingController(); + // Controllers for Create Household Address form + TextEditingController streetController = TextEditingController(); + TextEditingController street1Controller = TextEditingController(); + TextEditingController cityController = TextEditingController(); + TextEditingController zipCodeController = TextEditingController(); + TextEditingController countryController = TextEditingController(); + TextEditingController stateController = TextEditingController(); + // Controller for Info form + TextEditingController emailController = TextEditingController(); + TextEditingController phoneNumberController = TextEditingController(); + PricingMethodStep currentPricingMethodStep = PricingMethodStep.methodChooser; + @override + void initState() { + super.initState(); + pageController = PageController(initialPage: currentStep); + updateTitle(currentStep); + } + + @override + Widget build(BuildContext context) { + pages = [ + const AddAccountPage(), + UsernameandPasswordPage( + formKey: _createaccountformKey, + usernameController: usernameController, + passwordController: passwordController, + confirmPasswordController: confirmPasswordController, + ), + DefaultContactInfoPage( + formKey: _createinfoformKey, + emailController: emailController, + phoneNumberController: phoneNumberController, + ), + isHouseholdStepComplete + ? CreateHouseholdAddressPage( + formKey: _createaccounthouseholdadressformKey, + streetAccountController: streetController, + street1AccountController: street1Controller, + cityAccountController: cityController, + zipcodeAccountController: zipCodeController, + countryAccountController: countryController, + stateAccountController: stateController, + ) + : CreateHouseHoldNamePage( + formKey: _createaccounthouseholdformKey, + accountnameController: nameController, + ), + getPricingMethodWidget(), + ]; + + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + centerTitle: false, + title: Text( + title, + style: TextStyle(fontSize: 20, fontWeight: FontWeight.w600, color: CustomColors().whitecolor), + ), + actions: [ + GestureDetector( + child: Container( + height: 24, + width: 24, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + border: Border.all(width: 0), + color: CustomColors().bgCloseIcon, + ), + child: Icon( + Icons.close_rounded, + size: 16, + color: CustomColors().closeIcon, + ), + ), + onTap: () => context.canPop() ? context.pop() : null), + ], + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: MediaQuery.of(context).size.width, + child: CustomStepper( + totalSteps: pages.length, + width: MediaQuery.of(context).size.width, + curStep: currentStep + 1, + stepCompleteColor: CustomColors().progressBarFilledColor, + currentStepColor: CustomColors().whitecolor, + inactiveColor: CustomColors().progressBarInactiveColor, + lineWidth: 0.7, + pageController: pageController, + ), + ), + const SizedBox(height: 10), + Expanded( + child: PageView.builder( + physics: const NeverScrollableScrollPhysics(), + controller: pageController, + itemCount: pages.length, + onPageChanged: (index) { + setState(() { + currentStep = index; + updateTitle(currentStep); + }); + }, + itemBuilder: (context, index) { + return pages[index]; + }, + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + currentStep == 0 + ? PrimaryButton( + backgroundColor: CustomColors().lightblueColor, + onPressed: () { + showDialog( + context: context, + builder: (BuildContext context) { + return EulaView( + onEULAAccepted: (bool acceptEULA) { + if (mounted && context.canPop()) context.pop(); + if (acceptEULA) { + goTo(1); // Navigate to the next step + } + }, + ); + }, + ); + }, + text: LocaleKeys.common_start.tr(), + ) + : PrimaryButton( + backgroundColor: CustomColors().lightblueColor, + text: getButtonLabel(), + onPressed: next, + ), + const SizedBox(width: 10), + ActionTextButton( + onPressed: currentStep == 0 ? () => context.pop(true) : back, + text: currentStep == 0 ? LocaleKeys.common_cancel.tr() : LocaleKeys.common_back.tr(), + ), + ], + ), + ), + ], + ), + ), + ); + } + + Widget getPricingMethodWidget() { + switch (currentPricingMethodStep) { + case PricingMethodStep.utilityChooser: + return UtilityChooser( + zipCode: zipCodeController.text, + showappbar: false, + onUtilitySelected: (utility) { + setState(() { + selectedUtility = utility; + ref.read(utilityProvider.notifier).selectUtility(utility); + }); + }, + ); + case PricingMethodStep.rateProgramChooser: + return RateProgramChooser( + showappbar: false, + onRateProgramSelected: (rateProgram) { + setState(() { + selectedRateProgram = rateProgram; + ref.read(rateProgramProvider.notifier).state = rateProgram; + }); + }, + ); + case PricingMethodStep.customRateChooser: + return CustomRateChooser( + onRateEntered: (rate) { + setState(() { + print("Parent received rate: $rate"); // Debug statement + selectedCustomRate = rate; + ref.read(customRateProvider.notifier).state = rate; + }); + }, + ); + default: + return AccountPricingMethodChooser( + onMethodSelected: (PricingMethodType method) { + setState(() { + pricingMethod = method; + }); + }, + onNext: next, + ); + } + } + + void back() { + if (currentStep == 4) { + if (currentPricingMethodStep == PricingMethodStep.utilityChooser) { + setState(() { + currentPricingMethodStep = PricingMethodStep.methodChooser; + }); + } else if (currentPricingMethodStep == PricingMethodStep.rateProgramChooser) { + setState(() { + currentPricingMethodStep = PricingMethodStep.utilityChooser; + }); + } else if (currentPricingMethodStep == PricingMethodStep.customRateChooser) { + setState(() { + currentPricingMethodStep = PricingMethodStep.methodChooser; + }); + } else { + goTo(currentStep - 1); + } + } else if (currentStep > 0) { + if (currentStep == 3 && isHouseholdStepComplete) { + setState(() { + isHouseholdStepComplete = false; + }); + } else { + goTo(currentStep - 1); + } + } + } + + void goTo(int step) { + setState(() { + currentStep = step; + }); + pageController.animateToPage( + step, + duration: const Duration(milliseconds: 500), + curve: Curves.ease, + ); + updateTitle(step); + } + + Future next() async { + bool isValid = true; + + if (currentStep == 1) { + isValid = _createaccountformKey.currentState!.validate(); + if (isValid) { + _createaccountformKey.currentState!.save(); + } + } + if (currentStep == 2) { + isValid = _createinfoformKey.currentState!.validate(); + if (isValid) { + _createinfoformKey.currentState!.save(); + await createAccount(context, ref); + if (!isAccountCreated) { + return; + } + } + } + if (currentStep == 3 && isAccountCreated) { + if (!isHouseholdStepComplete) { + isValid = _createaccounthouseholdformKey.currentState!.validate(); + if (isValid) { + _createaccounthouseholdformKey.currentState!.save(); + setState(() { + isHouseholdStepComplete = true; + }); + return; + } + } else { + isValid = _createaccounthouseholdadressformKey.currentState!.validate(); + if (isValid) { + _createaccounthouseholdadressformKey.currentState!.save(); + goTo(currentStep + 1); + return; + } + } + } + + if (currentStep == 4) { + if (pricingMethod == null) { + isValid = false; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Please select a pricing method.'), + ), + ); + } else { + ispricingSelecte = true; + if (pricingMethod == PricingMethodType.utilityRates) { + if (currentPricingMethodStep == PricingMethodStep.utilityChooser && selectedUtility == '') { + isValid = false; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Please select a utility company.'), + ), + ); + } else if (currentPricingMethodStep == PricingMethodStep.rateProgramChooser && selectedRateProgram == '') { + isValid = false; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Please select a rate program.'), + ), + ); + } + } else if (pricingMethod == PricingMethodType.manual) { + if (currentPricingMethodStep == PricingMethodStep.customRateChooser && selectedCustomRate == null) { + isValid = false; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Please enter a custom rate.'), + ), + ); + } + } + } + } + if (isValid) { + if (currentStep == 4 && ispricingSelecte) { + if (pricingMethod == PricingMethodType.utilityRates) { + if (currentPricingMethodStep == PricingMethodStep.methodChooser) { + setState(() { + currentPricingMethodStep = PricingMethodStep.utilityChooser; + }); + } else if (currentPricingMethodStep == PricingMethodStep.utilityChooser && selectedUtility.isNotEmpty) { + setState(() { + currentPricingMethodStep = PricingMethodStep.rateProgramChooser; + }); + } else if (currentPricingMethodStep == PricingMethodStep.rateProgramChooser && + selectedRateProgram.isNotEmpty) { + createHouseholdDetails(); + } + } else if (pricingMethod == PricingMethodType.manual) { + if (currentPricingMethodStep == PricingMethodStep.methodChooser) { + setState(() { + currentPricingMethodStep = PricingMethodStep.customRateChooser; + }); + } else if (currentPricingMethodStep == PricingMethodStep.customRateChooser && selectedCustomRate != null) { + createHouseholdDetails(); + } + } else if (pricingMethod == PricingMethodType.chargerEstimatesCost) { + createHouseholdDetails(); + } else { + createHouseholdDetails(); + } + } + if (isValid && (currentStep < pages.length - 1)) { + goTo(currentStep + 1); + } else if (isValid && currentStep == pages.length - 1) { + createHouseholdDetails(); + } + } + } + + String getButtonLabel() { + if (currentStep == 4) { + if (currentPricingMethodStep == PricingMethodStep.methodChooser && pricingMethod == null) { + return pricingMethod == null ? 'Next' : 'Next'; + } else if (pricingMethod == PricingMethodType.utilityRates && + selectedUtility.isEmpty && + selectedRateProgram.isEmpty) { + return 'Next'; + } else if (PricingMethodType == PricingMethodType.utilityRates) { + return 'Next'; + } else if (currentPricingMethodStep == PricingMethodStep.utilityChooser) { + return 'Next'; + } else if (currentPricingMethodStep == PricingMethodStep.rateProgramChooser) { + return 'Finish'; + } else if (currentPricingMethodStep == PricingMethodStep.customRateChooser) { + return 'Finish'; + } else if (pricingMethod == PricingMethodType.manual && selectedCustomRate == null) { + return 'Next'; + } else if (pricingMethod == PricingMethodType.chargerEstimatesCost) { + return 'Finish'; + } + } + return currentStep == pages.length - 1 ? 'Next' : 'Next'; + } + + /// creating account + + Future createAccount(BuildContext context, WidgetRef ref) async { + final username = usernameController.text; + final password = passwordController.text; + final email = emailController.text; + final phoneNumber = phoneNumberController.text; + + final createAccountData = CreateAccountRequest( + username: username, + email: email, + password: password, + phoneNumber: "+${phoneNumber}", + languageCode: "en-US", + ); + + try { + final response = + await ref.read(createAccountProvider(createAccountRequest: createAccountData).future).then((response) { + if (response.status == 'success') { + attemptLogin(context, username: username, password: password); + + clearAccountFields(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(response.message)), + ); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(response.message)), + ); + } + }); + } catch (e) { + String errorMessage = 'Failed to create account. Please try again.'; + if (e is DioException && e.response != null && e.response?.data != null) { + final responseData = e.response?.data; + print('Error response domain: $responseData'); + + if (responseData is Map && responseData.containsKey('message')) { + final dynamic message = responseData['message']; + errorMessage = message != null ? message.toString() : errorMessage; + } + } + print('Error: $e'); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(errorMessage)), + ); + } + } + + Future attemptLogin(BuildContext context, {required String username, required String password}) async { + try { + await ref.read(loginProvider(username: username, password: password).future); + if (context.mounted && (await AuthenticationHandler().canAuthenticateUser())) { + setState(() => isAccountCreated = true); + if (kDebugMode) print("Login successful"); + } else { + ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Cannot login at this moment.'))); + } + } catch (e) { + String errorMessage = 'Failed to Login. Please try again.'; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(errorMessage)), + ); +} + } + + Future createHouseholdDetails() async { + final householdName = nameController.text; + final homeAddress = HouseAddress( + streetAddressFirstLine: streetController.text, + streetAddressSecondLine: street1Controller.text, + city: cityController.text, + state: stateController.text, + zipCode: zipCodeController.text, + country: countryController.text, + ); + PricingMethod? chargePricingMethod; + if (pricingMethod == PricingMethodType.utilityRates) { + chargePricingMethod = PricingMethod( + type: PricingMethodType.utilityRates, + utilityCompany: selectedUtility, + rateProgram: selectedRateProgram, + ); + } else if (pricingMethod == PricingMethodType.manual) { + chargePricingMethod = const PricingMethod( + type: PricingMethodType.manual, + ); + } else if (pricingMethod == PricingMethodType.chargerEstimatesCost) { + chargePricingMethod = const PricingMethod( + type: PricingMethodType.chargerEstimatesCost, + ); + } else { + throw Exception("Invalid pricing method selected"); + } + + try { + ref + .read(createHouseholdDetailsProvider( + householdName: householdName, + homeAddress: homeAddress, + chargePricingMethod: chargePricingMethod, + )) + .when( + data: (data) { + if (data.status == 'success') { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('${data.message}'), + ), + ); + clearTextFields(); + clearSelections(); + if (context.canPop()) context.pop(true); + } + } + }, + error: (error, _) { + WidgetsBinding.instance.addPostFrameCallback((_) => ScaffoldMessenger.of(context).showSnackBar( + SnackBar(backgroundColor: CustomColors().darkestGrayBG, content: Center(child: Text('$error'))))); + return Container(); + }, + loading: () => const LoadingAnimation(), + ); + if (context.canPop()) context.pop(true); + } catch (e) { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Failed to create household. Please try again.'), + ), + ); + } + } + } + + void updateTitle(int step) { + setState(() { + switch (step) { + case 0: + title = LocaleKeys.account_wizard_title.tr(); + break; + case 1: + title = LocaleKeys.account_wizard_title.tr(); + + break; + case 2: + title = LocaleKeys.household_wizard_title.tr(); + break; + case 3: + title = LocaleKeys.household_wizard_title.tr(); + break; + case 4: + title = LocaleKeys.account_wizard_title.tr(); + break; + default: + title = LocaleKeys.account_wizard_title.tr(); + break; + } + }); + } + + void clearAccountFields() { + usernameController.clear(); + passwordController.clear(); + confirmPasswordController.clear(); + emailController.clear(); + phoneNumberController.clear(); + } + + void clearTextFields() { + nameController.clear(); + streetController.clear(); + street1Controller.dispose(); + cityController.clear(); + stateController.clear(); + zipCodeController.clear(); + countryController.clear(); + } + + void clearSelections() { + setState(() { + pricingMethod = null; + selectedUtility = ""; + selectedRateProgram = ""; + selectedCustomRate = null; + ref.read(utilityProvider.notifier).selectUtility(""); + ref.read(rateProgramProvider.notifier).state = null; + ref.read(customRateProvider.notifier).state = {}; + + currentPricingMethodStep = PricingMethodStep.methodChooser; + }); + } + + @override + void dispose() { + pageController.dispose(); + usernameController.dispose(); + passwordController.dispose(); + confirmPasswordController.dispose(); + emailController.dispose(); + phoneNumberController.dispose(); + nameController.dispose(); + streetController.dispose(); + street1Controller.dispose(); + cityController.dispose(); + stateController.dispose(); + countryController.dispose(); + super.dispose(); + } +} diff --git a/lib/src/features/account/presentation/add_account_page.dart b/lib/src/features/account/presentation/add_account_page.dart new file mode 100644 index 00000000..c66b844b --- /dev/null +++ b/lib/src/features/account/presentation/add_account_page.dart @@ -0,0 +1,47 @@ +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/constants/theme_data.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:easy_localization/easy_localization.dart'; + +class AddAccountPage extends ConsumerWidget { + const AddAccountPage({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + body: SingleChildScrollView( + child: Column(children: [ + Container( + color: primaryColor, + child: Column( + children: [ + SizedBox( + height: MediaQuery.of(context).size.height * 0.10, + ), + Image.asset("assets/images/house.png"), + Padding( + padding: + const EdgeInsets.only(left: 50.0, right: 50, top: 50, bottom: 10), + child: Text( + LocaleKeys.account_wizard_welcomeDesc.tr(), + textAlign: TextAlign.start, + maxLines: 3, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: CustomColors().whitecolor, + fontSize: 17, + fontWeight: FontWeight.w400), + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.10, + ), + ], + ), + ) + ]), + )); + } +} diff --git a/lib/src/features/account/presentation/default_contact_info_page.dart b/lib/src/features/account/presentation/default_contact_info_page.dart new file mode 100644 index 00000000..b0ae39a3 --- /dev/null +++ b/lib/src/features/account/presentation/default_contact_info_page.dart @@ -0,0 +1,140 @@ +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/custom_text_form_field.dart'; +import 'package:email_validator/email_validator.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class DefaultContactInfoPage extends ConsumerStatefulWidget { + final GlobalKey? formKey; + final TextEditingController emailController; + final TextEditingController phoneNumberController; + const DefaultContactInfoPage( + {required this.formKey, required this.emailController, required this.phoneNumberController, super.key}); + @override + _DefaultContactInfoPageState createState() => _DefaultContactInfoPageState(); +} + +class _DefaultContactInfoPageState extends ConsumerState { + FocusNode _emailfocusNode = FocusNode(); + FocusNode _passwordfocusNode = FocusNode(); + @override + void initState() { + super.initState(); + _emailfocusNode = FocusNode(); + _passwordfocusNode = FocusNode(); + } + @override + void dispose() { + _emailfocusNode.dispose(); + _passwordfocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final TextEditingController emailActiveController = widget.emailController; + final TextEditingController phoneNumberActiveController = widget.phoneNumberController; + return Scaffold( + body: SingleChildScrollView( + child: Form( + key: widget.formKey, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 15, bottom: 15), + child: Text( + "Default Contact Information", + style: TextStyle(fontSize: 17, fontWeight: FontWeight.w600, color: CustomColors().whitecolor), + ), + ), + phoneNumberTextField(context, phoneNumberActiveController), + emailTextField(context, emailActiveController) + ], + ), + ), + ), + ); + } + + CustomTextFormField phoneNumberTextField(BuildContext context, TextEditingController controller) { + return CustomTextFormField( + autovalidateMode: AutovalidateMode.onUserInteraction, + controller: controller, + focusNode: _emailfocusNode, + textInputType: TextInputType.number, + hintText: "Enter Phone Number", + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Phone Number', + style: TextStyle( + color: CustomColors().whitecolor, + fontWeight: FontWeight.w400, + fontSize: 17), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.02, + ), + Icon( + Icons.help, + color: CustomColors().whitecolor, + ) + ], + ), + ), + inputFormatter: FilteringTextInputFormatter.digitsOnly, + validator: (value) { + if (value == null || value.isEmpty) { + return "Phone Number can't be empty"; + } + // if (value.length < 10) { + // return "Phone Number must be 10 characters"; + // } + // if (value.length > 10) { + // return "Phone Number can't be more than 10 characters"; + // } + return null; + }, + onSaved: (value) {}, + ); + } + + CustomTextFormField emailTextField(BuildContext context, TextEditingController controller) { + return CustomTextFormField( + autovalidateMode: AutovalidateMode.onUserInteraction, + controller: controller, + focusNode: _emailfocusNode, + textInputType: TextInputType.emailAddress, + hintText: "Enter Email", + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Email', + style: TextStyle( + color: CustomColors().whitecolor, + fontWeight: FontWeight.w400, + fontSize: 17), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.02, + ), + Icon( + Icons.help, + color: CustomColors().whitecolor, + ) + ], + ), + ), + validator: (value) => EmailValidator.validate(value ?? '') ? null : "Please enter a valid email", + ); + } +} diff --git a/lib/src/features/account/presentation/eula_transition.dart b/lib/src/features/account/presentation/eula_transition.dart new file mode 100644 index 00000000..555cab28 --- /dev/null +++ b/lib/src/features/account/presentation/eula_transition.dart @@ -0,0 +1,24 @@ +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/theme_data.dart'; +import 'package:flutter_starter_base_app/src/features/account/data/account_provider.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; + +class EULATransition extends ConsumerWidget { + const EULATransition({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return ref.watch(submitEULAProvider(agreementId: ref.read(eulaProvider)?.agreementId ?? '')).when( + data: (bool isSuccesful) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (context.mounted) context.goNamed(isSuccesful ? AppRoute.home.name : AppRoute.splash.name); + }); + return Container(); + }, + error: (error, stackTrace) => Center(child: Text('Error: $error', style: DanlawTheme().defaultTextStyle(20))), + loading: () => const LoadingAnimation()); + } +} diff --git a/lib/src/features/account/presentation/eula_view.dart b/lib/src/features/account/presentation/eula_view.dart new file mode 100644 index 00000000..01e0eb1b --- /dev/null +++ b/lib/src/features/account/presentation/eula_view.dart @@ -0,0 +1,75 @@ +import 'package:flutter_starter_base_app/src/common_widgets/action_text_button.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/constants/theme_data.dart'; +import 'package:flutter_starter_base_app/src/features/account/data/account_provider.dart'; +import 'package:flutter_starter_base_app/src/features/account/domain/eula.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; + +class EulaView extends ConsumerWidget { + final bool isCancellable; + final Function(bool acceptEULA) onEULAAccepted; + + const EulaView({super.key, required this.onEULAAccepted, this.isCancellable = true}); + + @override + Widget build(BuildContext context, WidgetRef ref) => SafeArea( + child: Scaffold( + body: GestureDetector( + child: Container( + color: primaryColor, + child: Container( + margin: const EdgeInsets.all(2.0), + padding: const EdgeInsets.all(10.0), + child: Column(mainAxisSize: MainAxisSize.min, children: [ + Expanded( + child: Container( + padding: const EdgeInsets.all(6), + margin: const EdgeInsets.only(bottom: 10), + width: MediaQuery.of(context).size.width, + color: CustomColors().whitecolor, + child: SingleChildScrollView( + child: ref + .watch(fetchEULAProvider( + languageCode: PlatformDispatcher.instance.locale.toString())) + .when( + data: (EULA eula) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => ref.read(eulaProvider.notifier).state = eula); + return RichText( + text: TextSpan( + text: 'EULA INFORMATION\n\n', + style: DanlawTheme() + .defaultTextStyle(18) + .copyWith(fontWeight: FontWeight.w600, color: primaryColor), + children: [ + TextSpan( + text: eula.text, + style: const TextStyle(fontSize: 16, color: primaryColor)) + ])); + }, + error: (error, stackTrace) => Text( + 'EULA INFORMATION\n\nCannot fetch EULA at this time. Please try again later.', + style: DanlawTheme().defaultTextStyle(18)), + loading: () => Container())))), + SizedBox( + + ///XXX: + height: MediaQuery.of(context).size.height * 0.13, + width: MediaQuery.of(context).size.width, + child: Column(mainAxisSize: MainAxisSize.min, children: [ + PrimaryButton( + text: "I have read and accept the EULA", + onPressed: () async { + onEULAAccepted(true); + if (!isCancellable) context.goNamed(AppRoute.eulaTransition.name); + }, + backgroundColor: CustomColors().lightblueColor), + if (isCancellable) ActionTextButton(text: "Cancel", onPressed: () => context.pop(false)) + ])) + ])))))); +} diff --git a/lib/src/features/account/presentation/username_password_page.dart b/lib/src/features/account/presentation/username_password_page.dart new file mode 100644 index 00000000..bdee55bf --- /dev/null +++ b/lib/src/features/account/presentation/username_password_page.dart @@ -0,0 +1,233 @@ +import 'package:flutter_starter_base_app/src/common_widgets/custom_text_form_field.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class UsernameandPasswordPage extends ConsumerStatefulWidget { + final GlobalKey? formKey; + final TextEditingController usernameController; + final TextEditingController passwordController; + final TextEditingController confirmPasswordController; + UsernameandPasswordPage({ + Key? key, + this.formKey, + required this.usernameController, + required this.passwordController, + required this.confirmPasswordController, + }) : super(key: key); + + @override + _UsernameandPasswordPageState createState() => _UsernameandPasswordPageState(); +} + +class _UsernameandPasswordPageState extends ConsumerState { + FocusNode _usernamefocusNode = FocusNode(); + FocusNode _passwordfocusNode = FocusNode(); + FocusNode _confirmfocusNode = FocusNode(); + ValueNotifier obsecurePassword = ValueNotifier(true); + ValueNotifier obsecureConfirmPassword = ValueNotifier(true); + + @override + void initState() { + super.initState(); + _usernamefocusNode = FocusNode(); + _passwordfocusNode = FocusNode(); + _confirmfocusNode = FocusNode(); + } + + String? email; + + @override + void dispose() { + _usernamefocusNode.dispose(); + _passwordfocusNode.dispose(); + _confirmfocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SingleChildScrollView( + child: Form( + key: widget.formKey, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 15, bottom: 15), + child: Text( + "Create Your Username And Password", + style: TextStyle(fontSize: 17, fontWeight: FontWeight.w600, color: CustomColors().whitecolor), + ), + ), + textfields(context), + + passwordfield(), + // Add some spacing between fields + confirmpasswordfield(), + ], + ), + ), + ), + ); + } + + ValueListenableBuilder confirmpasswordfield() { + return ValueListenableBuilder( + valueListenable: obsecureConfirmPassword, + builder: (BuildContext context, value, Widget? child) { + return CustomTextFormField( + controller: widget.confirmPasswordController, + focusNode: _confirmfocusNode, + textInputType: TextInputType.text, + autovalidateMode: AutovalidateMode.onUserInteraction, + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + LocaleKeys.account_confPassword.tr(), + style: TextStyle(color: CustomColors().whitecolor, fontWeight: FontWeight.w400, fontSize: 17), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.02, + ), + Icon( + Icons.help, + color: CustomColors().whitecolor, + ), + ], + ), + ), + hintText: LocaleKeys.hint_password.tr(), + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter confirm password'; + } + if (value != widget.passwordController.text) { + return 'Confirm Password does not match with Password'; + } + return null; + }, + // suffixIcon: IconButton( + // icon: Icon( + // obsecureConfirmPassword.value ? Icons.visibility : Icons.visibility_off, + // color: const Color.fromRGBO(208, 188, 255, 1), + // size: 20, + // ), + // onPressed: () { + // obsecureConfirmPassword.value = !obsecureConfirmPassword.value; + // }, + // ), + + maxLines: 1, + onPressed: () { + obsecureConfirmPassword.value = !obsecureConfirmPassword.value; + }, + obscureText: obsecureConfirmPassword.value, + ); + }, + ); + } + + ValueListenableBuilder passwordfield() { + return ValueListenableBuilder( + valueListenable: obsecurePassword, + builder: (BuildContext context, value, Widget? child) { + return CustomTextFormField( + controller: widget.passwordController, + focusNode: _passwordfocusNode, + textInputType: TextInputType.text, + autovalidateMode: AutovalidateMode.onUserInteraction, + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + LocaleKeys.common_password.tr(), + style: TextStyle(color: CustomColors().whitecolor, fontWeight: FontWeight.w400, fontSize: 17), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.02, + ), + Icon( + Icons.help, + color: CustomColors().whitecolor, + ), + ], + ), + ), + hintText: LocaleKeys.hint_password.tr(), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter a password'; + } + // // Password validation rules + // if (!RegExp(r'^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$').hasMatch(value)) { + // return 'at least 8 characters, including one uppercase letter, one number, and one special character'; + // } + return null; + }, + maxLines: 1, + onPressed: () { + obsecurePassword.value = !obsecurePassword.value; + }, + obscureText: obsecurePassword.value, + ); + }, + ); + } + + CustomTextFormField textfields(BuildContext context) { + return CustomTextFormField( + autovalidateMode: AutovalidateMode.onUserInteraction, + controller: widget.usernameController, + focusNode: _usernamefocusNode, + textInputType: TextInputType.emailAddress, + hintText: LocaleKeys.hint_emailOrUsername.tr(), + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + LocaleKeys.common_username.tr(), + style: TextStyle( + // color: Colors.white, + color: CustomColors().whitecolor, + fontWeight: FontWeight.w400, + fontSize: 17), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.02, + ), + Icon( + Icons.help, + color: CustomColors().whitecolor, + ) + ], + ), + ), + validator: (value) { + if (value == null || value.isEmpty) { + return "Username can't be empty"; + } + // if (value.length < 3) { + // return "Username must be at least 3 characters"; + // } + // if (value.length > 15) { + // return "Username can't be more than 15 characters"; + // } + return null; + }, + + ); + } +} diff --git a/lib/src/features/authentication/data/firebase_auth_repository.dart b/lib/src/features/authentication/data/firebase_auth_repository.dart deleted file mode 100644 index f5367d9c..00000000 --- a/lib/src/features/authentication/data/firebase_auth_repository.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; - -part 'firebase_auth_repository.g.dart'; - -class AuthRepository { - AuthRepository(this._auth); - final FirebaseAuth _auth; - - Stream authStateChanges() => _auth.authStateChanges(); - User? get currentUser => _auth.currentUser; - - Future signInAnonymously() { - return _auth.signInAnonymously(); - } -} - -@Riverpod(keepAlive: true) -FirebaseAuth firebaseAuth(FirebaseAuthRef ref) { - return FirebaseAuth.instance; -} - -@Riverpod(keepAlive: true) -AuthRepository authRepository(AuthRepositoryRef ref) { - return AuthRepository(ref.watch(firebaseAuthProvider)); -} - -@riverpod -Stream authStateChanges(AuthStateChangesRef ref) { - return ref.watch(authRepositoryProvider).authStateChanges(); -} diff --git a/lib/src/features/authentication/data/firebase_auth_repository.g.dart b/lib/src/features/authentication/data/firebase_auth_repository.g.dart deleted file mode 100644 index f657494e..00000000 --- a/lib/src/features/authentication/data/firebase_auth_repository.g.dart +++ /dev/null @@ -1,54 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'firebase_auth_repository.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$firebaseAuthHash() => r'46c40b7c5cf8ab936c0daa96a6af106bd2ae5d51'; - -/// See also [firebaseAuth]. -@ProviderFor(firebaseAuth) -final firebaseAuthProvider = Provider.internal( - firebaseAuth, - name: r'firebaseAuthProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$firebaseAuthHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef FirebaseAuthRef = ProviderRef; -String _$authRepositoryHash() => r'3871275ded2762a0e529629be71e890bfd3bd7ad'; - -/// See also [authRepository]. -@ProviderFor(authRepository) -final authRepositoryProvider = Provider.internal( - authRepository, - name: r'authRepositoryProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$authRepositoryHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef AuthRepositoryRef = ProviderRef; -String _$authStateChangesHash() => r'af0a0185c59bf3c1ad8a9e041075517b3a2dcc31'; - -/// See also [authStateChanges]. -@ProviderFor(authStateChanges) -final authStateChangesProvider = AutoDisposeStreamProvider.internal( - authStateChanges, - name: r'authStateChangesProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$authStateChangesHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef AuthStateChangesRef = AutoDisposeStreamProviderRef; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/authentication/domain/app_user.dart b/lib/src/features/authentication/domain/app_user.dart deleted file mode 100644 index db572792..00000000 --- a/lib/src/features/authentication/domain/app_user.dart +++ /dev/null @@ -1,25 +0,0 @@ -/// Type defining a user ID from Firebase. -typedef UserID = String; - -/// Simple class representing the user UID and email. -class AppUser { - const AppUser({ - required this.uid, - required this.email, - }); - final String uid; - final String email; - - @override - bool operator ==(Object other) { - if (identical(this, other)) return true; - - return other is AppUser && other.uid == uid && other.email == email; - } - - @override - int get hashCode => uid.hashCode ^ email.hashCode; - - @override - String toString() => 'AppUser(uid: $uid, email: $email)'; -} diff --git a/lib/src/features/authentication/presentation/auth_providers.dart b/lib/src/features/authentication/presentation/auth_providers.dart deleted file mode 100644 index 273b8723..00000000 --- a/lib/src/features/authentication/presentation/auth_providers.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:firebase_auth/firebase_auth.dart' - hide EmailAuthProvider, AuthProvider; -import 'package:firebase_ui_auth/firebase_ui_auth.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; - -part 'auth_providers.g.dart'; - -@Riverpod(keepAlive: true) -List> authProviders( - AuthProvidersRef ref) { - return [ - EmailAuthProvider(), - ]; -} diff --git a/lib/src/features/authentication/presentation/auth_providers.g.dart b/lib/src/features/authentication/presentation/auth_providers.g.dart deleted file mode 100644 index 6f304119..00000000 --- a/lib/src/features/authentication/presentation/auth_providers.g.dart +++ /dev/null @@ -1,27 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'auth_providers.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$authProvidersHash() => r'ae6cefe8190c6d4e0c24eed661e7889031bfabda'; - -/// See also [authProviders]. -@ProviderFor(authProviders) -final authProvidersProvider = - Provider>>.internal( - authProviders, - name: r'authProvidersProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$authProvidersHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef AuthProvidersRef - = ProviderRef>>; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/authentication/presentation/custom_profile_screen.dart b/lib/src/features/authentication/presentation/custom_profile_screen.dart deleted file mode 100644 index af59f017..00000000 --- a/lib/src/features/authentication/presentation/custom_profile_screen.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:firebase_ui_auth/firebase_ui_auth.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/presentation/auth_providers.dart'; - -class CustomProfileScreen extends ConsumerWidget { - const CustomProfileScreen({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final authProviders = ref.watch(authProvidersProvider); - return ProfileScreen( - appBar: AppBar( - title: const Text('Profile'), - ), - providers: authProviders, - ); - } -} diff --git a/lib/src/features/authentication/presentation/custom_sign_in_screen.dart b/lib/src/features/authentication/presentation/custom_sign_in_screen.dart deleted file mode 100644 index f3a181a2..00000000 --- a/lib/src/features/authentication/presentation/custom_sign_in_screen.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:firebase_ui_auth/firebase_ui_auth.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; - -import 'auth_providers.dart'; - -class CustomSignInScreen extends ConsumerWidget { - const CustomSignInScreen({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final authProviders = ref.watch(authProvidersProvider); - return Scaffold( - appBar: AppBar( - title: const Text('Sign in'), - ), - body: SignInScreen( - providers: authProviders, - footerBuilder: (context, action) => const SignInAnonymouslyFooter(), - ), - ); - } -} - -class SignInAnonymouslyFooter extends ConsumerWidget { - const SignInAnonymouslyFooter({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - return Column( - children: [ - gapH8, - const Row( - children: [ - Expanded(child: Divider()), - Padding( - padding: EdgeInsets.symmetric(horizontal: Sizes.p8), - child: Text('or'), - ), - Expanded(child: Divider()), - ], - ), - TextButton( - onPressed: () => ref.read(firebaseAuthProvider).signInAnonymously(), - child: const Text('Sign in anonymously'), - ), - ], - ); - } -} diff --git a/lib/src/features/entries/application/entries_service.dart b/lib/src/features/entries/application/entries_service.dart deleted file mode 100644 index a4fd86c6..00000000 --- a/lib/src/features/entries/application/entries_service.dart +++ /dev/null @@ -1,100 +0,0 @@ -import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:rxdart/rxdart.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/domain/app_user.dart'; -import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/daily_jobs_details.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entries_list_tile_model.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry_job.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; -import 'package:flutter_starter_base_app/src/utils/format.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; - -part 'entries_service.g.dart'; - -// TODO: Clean up this code a bit more -class EntriesService { - EntriesService( - {required this.jobsRepository, required this.entriesRepository}); - final JobsRepository jobsRepository; - final EntriesRepository entriesRepository; - - /// combine List, List into List - Stream> _allEntriesStream(UserID uid) => - CombineLatestStream.combine2( - entriesRepository.watchEntries(uid: uid), - jobsRepository.watchJobs(uid: uid), - _entriesJobsCombiner, - ); - - static List _entriesJobsCombiner( - List entries, List jobs) { - return entries.map((entry) { - final job = jobs.firstWhere((job) => job.id == entry.jobId); - return EntryJob(entry, job); - }).toList(); - } - - /// Output stream - Stream> entriesTileModelStream(UserID uid) => - _allEntriesStream(uid).map(_createModels); - - static List _createModels(List allEntries) { - if (allEntries.isEmpty) { - return []; - } - final allDailyJobsDetails = DailyJobsDetails.all(allEntries); - - // total duration across all jobs - final totalDuration = allDailyJobsDetails - .map((dateJobsDuration) => dateJobsDuration.duration) - .reduce((value, element) => value + element); - - // total pay across all jobs - final totalPay = allDailyJobsDetails - .map((dateJobsDuration) => dateJobsDuration.pay) - .reduce((value, element) => value + element); - - return [ - EntriesListTileModel( - leadingText: 'All Entries', - middleText: Format.currency(totalPay), - trailingText: Format.hours(totalDuration), - ), - for (DailyJobsDetails dailyJobsDetails in allDailyJobsDetails) ...[ - EntriesListTileModel( - isHeader: true, - leadingText: Format.date(dailyJobsDetails.date), - middleText: Format.currency(dailyJobsDetails.pay), - trailingText: Format.hours(dailyJobsDetails.duration), - ), - for (JobDetails jobDuration in dailyJobsDetails.jobsDetails) - EntriesListTileModel( - leadingText: jobDuration.name, - middleText: Format.currency(jobDuration.pay), - trailingText: Format.hours(jobDuration.durationInHours), - ), - ] - ]; - } -} - -@riverpod -EntriesService entriesService(EntriesServiceRef ref) { - return EntriesService( - jobsRepository: ref.watch(jobsRepositoryProvider), - entriesRepository: ref.watch(entriesRepositoryProvider), - ); -} - -@riverpod -Stream> entriesTileModelStream( - EntriesTileModelStreamRef ref) { - final user = ref.watch(firebaseAuthProvider).currentUser; - if (user == null) { - throw AssertionError('User can\'t be null when fetching entries'); - } - final entriesService = ref.watch(entriesServiceProvider); - return entriesService.entriesTileModelStream(user.uid); -} diff --git a/lib/src/features/entries/application/entries_service.g.dart b/lib/src/features/entries/application/entries_service.g.dart deleted file mode 100644 index bf120c06..00000000 --- a/lib/src/features/entries/application/entries_service.g.dart +++ /dev/null @@ -1,43 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'entries_service.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$entriesServiceHash() => r'ad6f017678723501d64b7d33ea05ce3553cc010b'; - -/// See also [entriesService]. -@ProviderFor(entriesService) -final entriesServiceProvider = AutoDisposeProvider.internal( - entriesService, - name: r'entriesServiceProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$entriesServiceHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef EntriesServiceRef = AutoDisposeProviderRef; -String _$entriesTileModelStreamHash() => - r'69af265d2969a10a62e0b9e7b679ce336445b91c'; - -/// See also [entriesTileModelStream]. -@ProviderFor(entriesTileModelStream) -final entriesTileModelStreamProvider = - AutoDisposeStreamProvider>.internal( - entriesTileModelStream, - name: r'entriesTileModelStreamProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$entriesTileModelStreamHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef EntriesTileModelStreamRef - = AutoDisposeStreamProviderRef>; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/entries/data/entries_repository.dart b/lib/src/features/entries/data/entries_repository.dart deleted file mode 100644 index 5ed19d70..00000000 --- a/lib/src/features/entries/data/entries_repository.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/domain/app_user.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; - -class EntriesRepository { - const EntriesRepository(this._firestore); - final FirebaseFirestore _firestore; - - static String entryPath(String uid, String entryId) => - 'users/$uid/entries/$entryId'; - static String entriesPath(String uid) => 'users/$uid/entries'; - - // create - Future addEntry({ - required UserID uid, - required JobID jobId, - required DateTime start, - required DateTime end, - required String comment, - }) => - _firestore.collection(entriesPath(uid)).add({ - 'jobId': jobId, - 'start': start.millisecondsSinceEpoch, - 'end': end.millisecondsSinceEpoch, - 'comment': comment, - }); - - // update - Future updateEntry({ - required UserID uid, - required Entry entry, - }) => - _firestore.doc(entryPath(uid, entry.id)).update(entry.toMap()); - - // delete - Future deleteEntry({required UserID uid, required EntryID entryId}) => - _firestore.doc(entryPath(uid, entryId)).delete(); - - // read - Stream> watchEntries({required UserID uid, JobID? jobId}) => - queryEntries(uid: uid, jobId: jobId) - .snapshots() - .map((snapshot) => snapshot.docs.map((doc) => doc.data()).toList()); - - Query queryEntries({required UserID uid, JobID? jobId}) { - Query query = - _firestore.collection(entriesPath(uid)).withConverter( - fromFirestore: (snapshot, _) => - Entry.fromMap(snapshot.data()!, snapshot.id), - toFirestore: (entry, _) => entry.toMap(), - ); - if (jobId != null) { - query = query.where('jobId', isEqualTo: jobId); - } - return query; - } -} - -final entriesRepositoryProvider = Provider((ref) { - return EntriesRepository(FirebaseFirestore.instance); -}); - -final jobEntriesQueryProvider = - Provider.autoDispose.family, JobID>((ref, jobId) { - final user = ref.watch(firebaseAuthProvider).currentUser; - if (user == null) { - throw AssertionError('User can\'t be null when fetching jobs'); - } - final repository = ref.watch(entriesRepositoryProvider); - return repository.queryEntries(uid: user.uid, jobId: jobId); -}); diff --git a/lib/src/features/entries/domain/daily_jobs_details.dart b/lib/src/features/entries/domain/daily_jobs_details.dart deleted file mode 100644 index f8dec439..00000000 --- a/lib/src/features/entries/domain/daily_jobs_details.dart +++ /dev/null @@ -1,76 +0,0 @@ -import 'package:flutter_starter_base_app/src/features/entries/domain/entry_job.dart'; - -/// Temporary model class to store the time tracked and pay for a job -class JobDetails { - JobDetails({ - required this.name, - required this.durationInHours, - required this.pay, - }); - final String name; - double durationInHours; - double pay; -} - -/// Groups together all jobs/entries on a given day -class DailyJobsDetails { - DailyJobsDetails({required this.date, required this.jobsDetails}); - final DateTime date; - final List jobsDetails; - - double get pay => jobsDetails - .map((jobDuration) => jobDuration.pay) - .reduce((value, element) => value + element); - - double get duration => jobsDetails - .map((jobDuration) => jobDuration.durationInHours) - .reduce((value, element) => value + element); - - /// splits all entries into separate groups by date - static Map> _entriesByDate(List entries) { - final Map> map = {}; - for (final entryJob in entries) { - final entryDayStart = DateTime(entryJob.entry.start.year, - entryJob.entry.start.month, entryJob.entry.start.day); - if (map[entryDayStart] == null) { - map[entryDayStart] = [entryJob]; - } else { - map[entryDayStart]!.add(entryJob); - } - } - return map; - } - - /// maps an unordered list of EntryJob into a list of DailyJobsDetails with date information - static List all(List entries) { - final byDate = _entriesByDate(entries); - final List list = []; - for (final pair in byDate.entries) { - final date = pair.key; - final entriesByDate = pair.value; - final byJob = _jobsDetails(entriesByDate); - list.add(DailyJobsDetails(date: date, jobsDetails: byJob)); - } - return list.toList(); - } - - /// groups entries by job - static List _jobsDetails(List entries) { - final Map jobDuration = {}; - for (final entryJob in entries) { - final entry = entryJob.entry; - final pay = entry.durationInHours * entryJob.job.ratePerHour; - if (jobDuration[entry.jobId] == null) { - jobDuration[entry.jobId] = JobDetails( - name: entryJob.job.name, - durationInHours: entry.durationInHours, - pay: pay, - ); - } else { - jobDuration[entry.jobId]!.pay += pay; - jobDuration[entry.jobId]!.durationInHours += entry.durationInHours; - } - } - return jobDuration.values.toList(); - } -} diff --git a/lib/src/features/entries/domain/entries_list_tile_model.dart b/lib/src/features/entries/domain/entries_list_tile_model.dart deleted file mode 100644 index 179afa27..00000000 --- a/lib/src/features/entries/domain/entries_list_tile_model.dart +++ /dev/null @@ -1,12 +0,0 @@ -class EntriesListTileModel { - const EntriesListTileModel({ - required this.leadingText, - required this.trailingText, - this.middleText, - this.isHeader = false, - }); - final String leadingText; - final String trailingText; - final String? middleText; - final bool isHeader; -} diff --git a/lib/src/features/entries/domain/entry.dart b/lib/src/features/entries/domain/entry.dart deleted file mode 100644 index 87a943a0..00000000 --- a/lib/src/features/entries/domain/entry.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; - -typedef EntryID = String; - -class Entry extends Equatable { - const Entry({ - required this.id, - required this.jobId, - required this.start, - required this.end, - required this.comment, - }); - final EntryID id; - final JobID jobId; - final DateTime start; - final DateTime end; - final String comment; - - @override - List get props => [id, jobId, start, end, comment]; - - @override - bool get stringify => true; - - double get durationInHours => - end.difference(start).inMinutes.toDouble() / 60.0; - - factory Entry.fromMap(Map value, EntryID id) { - final startMilliseconds = value['start'] as int; - final endMilliseconds = value['end'] as int; - return Entry( - id: id, - jobId: value['jobId'] as String, - start: DateTime.fromMillisecondsSinceEpoch(startMilliseconds), - end: DateTime.fromMillisecondsSinceEpoch(endMilliseconds), - comment: value['comment'] as String? ?? '', - ); - } - - Map toMap() { - return { - 'jobId': jobId, - 'start': start.millisecondsSinceEpoch, - 'end': end.millisecondsSinceEpoch, - 'comment': comment, - }; - } -} diff --git a/lib/src/features/entries/domain/entry_job.dart b/lib/src/features/entries/domain/entry_job.dart deleted file mode 100644 index ec78a9d9..00000000 --- a/lib/src/features/entries/domain/entry_job.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; - -class EntryJob extends Equatable { - const EntryJob(this.entry, this.job); - - final Entry entry; - final Job job; - - @override - List get props => [entry, job]; - - @override - bool? get stringify => true; -} diff --git a/lib/src/features/entries/presentation/entries_screen.dart b/lib/src/features/entries/presentation/entries_screen.dart deleted file mode 100644 index f49fdf7d..00000000 --- a/lib/src/features/entries/presentation/entries_screen.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; -import 'package:flutter_starter_base_app/src/constants/strings.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entries_list_tile_model.dart'; -import 'package:flutter_starter_base_app/src/features/entries/application/entries_service.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/list_items_builder.dart'; - -class EntriesScreen extends ConsumerWidget { - const EntriesScreen({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - return Scaffold( - appBar: AppBar( - title: const Text(Strings.entries), - ), - body: Consumer( - builder: (context, ref, child) { - // * This data is combined from two streams, so it can't be returned - // * directly as a Query object from the repository. - // * As a result, we can't use FirestoreListView here. - final entriesTileModelStream = - ref.watch(entriesTileModelStreamProvider); - return ListItemsBuilder( - data: entriesTileModelStream, - itemBuilder: (context, model) => EntriesListTile(model: model), - ); - }, - ), - ); - } -} - -class EntriesListTile extends StatelessWidget { - const EntriesListTile({super.key, required this.model}); - final EntriesListTileModel model; - - @override - Widget build(BuildContext context) { - const fontSize = 16.0; - return Container( - color: model.isHeader ? Colors.indigo[100] : null, - padding: const EdgeInsets.symmetric( - vertical: Sizes.p8, - horizontal: Sizes.p16, - ), - child: Row( - children: [ - Text(model.leadingText, style: const TextStyle(fontSize: fontSize)), - Expanded(child: Container()), - if (model.middleText != null) - Text( - model.middleText!, - style: TextStyle(color: Colors.green[700], fontSize: fontSize), - textAlign: TextAlign.right, - ), - SizedBox( - width: 60.0, - child: Text( - model.trailingText, - style: const TextStyle(fontSize: fontSize), - textAlign: TextAlign.right, - ), - ), - ], - ), - ); - } -} diff --git a/lib/src/features/entries/presentation/entry_screen/entry_screen.dart b/lib/src/features/entries/presentation/entry_screen/entry_screen.dart deleted file mode 100644 index d9f39cc5..00000000 --- a/lib/src/features/entries/presentation/entry_screen/entry_screen.dart +++ /dev/null @@ -1,157 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/date_time_picker.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/responsive_center.dart'; -import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; -import 'package:flutter_starter_base_app/src/constants/breakpoints.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; -import 'package:flutter_starter_base_app/src/features/entries/presentation/entry_screen/entry_screen_controller.dart'; -import 'package:flutter_starter_base_app/src/utils/async_value_ui.dart'; -import 'package:flutter_starter_base_app/src/utils/format.dart'; - -class EntryScreen extends ConsumerStatefulWidget { - const EntryScreen({super.key, required this.jobId, this.entryId, this.entry}); - final JobID jobId; - final EntryID? entryId; - final Entry? entry; - - @override - ConsumerState createState() => _EntryPageState(); -} - -class _EntryPageState extends ConsumerState { - late DateTime _startDate; - late TimeOfDay _startTime; - late DateTime _endDate; - late TimeOfDay _endTime; - late String _comment; - - DateTime get start => DateTime(_startDate.year, _startDate.month, - _startDate.day, _startTime.hour, _startTime.minute); - DateTime get end => DateTime(_endDate.year, _endDate.month, _endDate.day, - _endTime.hour, _endTime.minute); - - @override - void initState() { - super.initState(); - final start = widget.entry?.start ?? DateTime.now(); - _startDate = DateTime(start.year, start.month, start.day); - _startTime = TimeOfDay.fromDateTime(start); - - final end = widget.entry?.end ?? DateTime.now(); - _endDate = DateTime(end.year, end.month, end.day); - _endTime = TimeOfDay.fromDateTime(end); - - _comment = widget.entry?.comment ?? ''; - } - - Future _setEntryAndDismiss() async { - final success = - await ref.read(entryScreenControllerProvider.notifier).submit( - entryId: widget.entryId, - jobId: widget.jobId, - start: start, - end: end, - comment: _comment, - ); - if (success && mounted) { - context.pop(); - } - } - - @override - Widget build(BuildContext context) { - ref.listen( - entryScreenControllerProvider, - (_, state) => state.showAlertDialogOnError(context), - ); - return Scaffold( - appBar: AppBar( - title: Text(widget.entry != null ? 'Edit Entry' : 'New Entry'), - actions: [ - TextButton( - child: Text( - widget.entry != null ? 'Update' : 'Create', - style: const TextStyle(fontSize: 18.0, color: Colors.white), - ), - onPressed: () => _setEntryAndDismiss(), - ), - ], - ), - body: SingleChildScrollView( - child: ResponsiveCenter( - maxContentWidth: Breakpoint.tablet, - padding: const EdgeInsets.all(Sizes.p16), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildStartDate(), - _buildEndDate(), - gapH8, - _buildDuration(), - gapH8, - _buildComment(), - ], - ), - ), - ), - ); - } - - Widget _buildStartDate() { - return DateTimePicker( - labelText: 'Start', - selectedDate: _startDate, - selectedTime: _startTime, - onSelectedDate: (date) => setState(() => _startDate = date), - onSelectedTime: (time) => setState(() => _startTime = time), - ); - } - - Widget _buildEndDate() { - return DateTimePicker( - labelText: 'End', - selectedDate: _endDate, - selectedTime: _endTime, - onSelectedDate: (date) => setState(() => _endDate = date), - onSelectedTime: (time) => setState(() => _endTime = time), - ); - } - - Widget _buildDuration() { - final durationInHours = end.difference(start).inMinutes.toDouble() / 60.0; - final durationFormatted = Format.hours(durationInHours); - return Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text( - 'Duration: $durationFormatted', - style: const TextStyle(fontSize: 18.0, fontWeight: FontWeight.w500), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - ); - } - - Widget _buildComment() { - return TextField( - keyboardType: TextInputType.text, - maxLength: 50, - controller: TextEditingController(text: _comment), - decoration: const InputDecoration( - labelText: 'Comment', - labelStyle: TextStyle(fontSize: 18.0, fontWeight: FontWeight.w500), - ), - keyboardAppearance: Brightness.light, - style: const TextStyle(fontSize: 20.0, color: Colors.black), - maxLines: null, - onChanged: (comment) => _comment = comment, - ); - } -} diff --git a/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.dart b/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.dart deleted file mode 100644 index 5d599f39..00000000 --- a/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'dart:async'; - -import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; - -part 'entry_screen_controller.g.dart'; - -@riverpod -class EntryScreenController extends _$EntryScreenController { - @override - FutureOr build() { - // ok to leave this empty if the return type is FutureOr - } - - Future submit({ - EntryID? entryId, - required JobID jobId, - required DateTime start, - required DateTime end, - required String comment, - }) async { - final currentUser = ref.read(authRepositoryProvider).currentUser; - if (currentUser == null) { - throw AssertionError('User can\'t be null'); - } - final repository = ref.read(entriesRepositoryProvider); - state = const AsyncLoading(); - if (entryId == null) { - state = await AsyncValue.guard(() => repository.addEntry( - uid: currentUser.uid, - jobId: jobId, - start: start, - end: end, - comment: comment, - )); - } else { - final entry = Entry( - id: entryId, - jobId: jobId, - start: start, - end: end, - comment: comment, - ); - state = await AsyncValue.guard( - () => repository.updateEntry(uid: currentUser.uid, entry: entry)); - } - return state.hasError == false; - } -} diff --git a/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.g.dart b/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.g.dart deleted file mode 100644 index 4eea11b5..00000000 --- a/lib/src/features/entries/presentation/entry_screen/entry_screen_controller.g.dart +++ /dev/null @@ -1,27 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'entry_screen_controller.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$entryScreenControllerHash() => - r'75638e7eac6bacd498349a143fc5fc827171674a'; - -/// See also [EntryScreenController]. -@ProviderFor(EntryScreenController) -final entryScreenControllerProvider = - AutoDisposeAsyncNotifierProvider.internal( - EntryScreenController.new, - name: r'entryScreenControllerProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$entryScreenControllerHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$EntryScreenController = AutoDisposeAsyncNotifier; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/jobs/data/jobs_repository.dart b/lib/src/features/jobs/data/jobs_repository.dart deleted file mode 100644 index fc16d550..00000000 --- a/lib/src/features/jobs/data/jobs_repository.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'dart:async'; - -import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/domain/app_user.dart'; -import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; - -part 'jobs_repository.g.dart'; - -class JobsRepository { - const JobsRepository(this._firestore); - final FirebaseFirestore _firestore; - - static String jobPath(String uid, String jobId) => 'users/$uid/jobs/$jobId'; - static String jobsPath(String uid) => 'users/$uid/jobs'; - static String entriesPath(String uid) => EntriesRepository.entriesPath(uid); - - // create - Future addJob( - {required UserID uid, - required String name, - required int ratePerHour}) => - _firestore.collection(jobsPath(uid)).add({ - 'name': name, - 'ratePerHour': ratePerHour, - }); - - // update - Future updateJob({required UserID uid, required Job job}) => - _firestore.doc(jobPath(uid, job.id)).update(job.toMap()); - - // delete - Future deleteJob({required UserID uid, required JobID jobId}) async { - // delete where entry.jobId == job.jobId - final entriesRef = _firestore.collection(entriesPath(uid)); - final entries = await entriesRef.get(); - for (final snapshot in entries.docs) { - final entry = Entry.fromMap(snapshot.data(), snapshot.id); - if (entry.jobId == jobId) { - await snapshot.reference.delete(); - } - } - // delete job - final jobRef = _firestore.doc(jobPath(uid, jobId)); - await jobRef.delete(); - } - - // read - Stream watchJob({required UserID uid, required JobID jobId}) => - _firestore - .doc(jobPath(uid, jobId)) - .withConverter( - fromFirestore: (snapshot, _) => - Job.fromMap(snapshot.data()!, snapshot.id), - toFirestore: (job, _) => job.toMap(), - ) - .snapshots() - .map((snapshot) => snapshot.data()!); - - Stream> watchJobs({required UserID uid}) => queryJobs(uid: uid) - .snapshots() - .map((snapshot) => snapshot.docs.map((doc) => doc.data()).toList()); - - Query queryJobs({required UserID uid}) => - _firestore.collection(jobsPath(uid)).withConverter( - fromFirestore: (snapshot, _) => - Job.fromMap(snapshot.data()!, snapshot.id), - toFirestore: (job, _) => job.toMap(), - ); - - Future> fetchJobs({required UserID uid}) async { - final jobs = await queryJobs(uid: uid).get(); - return jobs.docs.map((doc) => doc.data()).toList(); - } -} - -@Riverpod(keepAlive: true) -JobsRepository jobsRepository(JobsRepositoryRef ref) { - return JobsRepository(FirebaseFirestore.instance); -} - -@riverpod -Query jobsQuery(JobsQueryRef ref) { - final user = ref.watch(firebaseAuthProvider).currentUser; - if (user == null) { - throw AssertionError('User can\'t be null'); - } - final repository = ref.watch(jobsRepositoryProvider); - return repository.queryJobs(uid: user.uid); -} - -@riverpod -Stream jobStream(JobStreamRef ref, JobID jobId) { - final user = ref.watch(firebaseAuthProvider).currentUser; - if (user == null) { - throw AssertionError('User can\'t be null'); - } - final repository = ref.watch(jobsRepositoryProvider); - return repository.watchJob(uid: user.uid, jobId: jobId); -} diff --git a/lib/src/features/jobs/data/jobs_repository.g.dart b/lib/src/features/jobs/data/jobs_repository.g.dart deleted file mode 100644 index c1bfb42b..00000000 --- a/lib/src/features/jobs/data/jobs_repository.g.dart +++ /dev/null @@ -1,186 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'jobs_repository.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$jobsRepositoryHash() => r'99834710b25b2229bf6bd85bb1e522bfb2b61d5b'; - -/// See also [jobsRepository]. -@ProviderFor(jobsRepository) -final jobsRepositoryProvider = Provider.internal( - jobsRepository, - name: r'jobsRepositoryProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$jobsRepositoryHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef JobsRepositoryRef = ProviderRef; -String _$jobsQueryHash() => r'46482866aecb8be7e41fd6bdb0e2d5a6a87fc350'; - -/// See also [jobsQuery]. -@ProviderFor(jobsQuery) -final jobsQueryProvider = AutoDisposeProvider>.internal( - jobsQuery, - name: r'jobsQueryProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$jobsQueryHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef JobsQueryRef = AutoDisposeProviderRef>; -String _$jobStreamHash() => r'72fc86cf080cd4a6bdb2da9f13ff81efb312521e'; - -/// Copied from Dart SDK -class _SystemHash { - _SystemHash._(); - - static int combine(int hash, int value) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + value); - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); - return hash ^ (hash >> 6); - } - - static int finish(int hash) { - // ignore: parameter_assignments - hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); - // ignore: parameter_assignments - hash = hash ^ (hash >> 11); - return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); - } -} - -/// See also [jobStream]. -@ProviderFor(jobStream) -const jobStreamProvider = JobStreamFamily(); - -/// See also [jobStream]. -class JobStreamFamily extends Family> { - /// See also [jobStream]. - const JobStreamFamily(); - - /// See also [jobStream]. - JobStreamProvider call( - String jobId, - ) { - return JobStreamProvider( - jobId, - ); - } - - @override - JobStreamProvider getProviderOverride( - covariant JobStreamProvider provider, - ) { - return call( - provider.jobId, - ); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'jobStreamProvider'; -} - -/// See also [jobStream]. -class JobStreamProvider extends AutoDisposeStreamProvider { - /// See also [jobStream]. - JobStreamProvider( - String jobId, - ) : this._internal( - (ref) => jobStream( - ref as JobStreamRef, - jobId, - ), - from: jobStreamProvider, - name: r'jobStreamProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$jobStreamHash, - dependencies: JobStreamFamily._dependencies, - allTransitiveDependencies: JobStreamFamily._allTransitiveDependencies, - jobId: jobId, - ); - - JobStreamProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.jobId, - }) : super.internal(); - - final String jobId; - - @override - Override overrideWith( - Stream Function(JobStreamRef provider) create, - ) { - return ProviderOverride( - origin: this, - override: JobStreamProvider._internal( - (ref) => create(ref as JobStreamRef), - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - jobId: jobId, - ), - ); - } - - @override - AutoDisposeStreamProviderElement createElement() { - return _JobStreamProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is JobStreamProvider && other.jobId == jobId; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, jobId.hashCode); - - return _SystemHash.finish(hash); - } -} - -mixin JobStreamRef on AutoDisposeStreamProviderRef { - /// The parameter `jobId` of this provider. - String get jobId; -} - -class _JobStreamProviderElement extends AutoDisposeStreamProviderElement - with JobStreamRef { - _JobStreamProviderElement(super.provider); - - @override - String get jobId => (origin as JobStreamProvider).jobId; -} -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/jobs/domain/job.dart b/lib/src/features/jobs/domain/job.dart deleted file mode 100644 index 2aa3106b..00000000 --- a/lib/src/features/jobs/domain/job.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter/foundation.dart'; - -typedef JobID = String; - -@immutable -class Job extends Equatable { - const Job({required this.id, required this.name, required this.ratePerHour}); - final JobID id; - final String name; - final int ratePerHour; - - @override - List get props => [name, ratePerHour]; - - @override - bool get stringify => true; - - factory Job.fromMap(Map data, String id) { - final name = data['name'] as String; - final ratePerHour = data['ratePerHour'] as int; - return Job( - id: id, - name: name, - ratePerHour: ratePerHour, - ); - } - - Map toMap() { - return { - 'name': name, - 'ratePerHour': ratePerHour, - }; - } -} diff --git a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart b/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart deleted file mode 100644 index b16e1b0c..00000000 --- a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/responsive_center.dart'; -import 'package:flutter_starter_base_app/src/constants/breakpoints.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart'; -import 'package:flutter_starter_base_app/src/utils/async_value_ui.dart'; - -class EditJobScreen extends ConsumerStatefulWidget { - const EditJobScreen({super.key, this.jobId, this.job}); - final JobID? jobId; - final Job? job; - - @override - ConsumerState createState() => _EditJobPageState(); -} - -class _EditJobPageState extends ConsumerState { - final _formKey = GlobalKey(); - - String? _name; - int? _ratePerHour; - - @override - void initState() { - super.initState(); - if (widget.job != null) { - _name = widget.job?.name; - _ratePerHour = widget.job?.ratePerHour; - } - } - - bool _validateAndSaveForm() { - final form = _formKey.currentState!; - if (form.validate()) { - form.save(); - return true; - } - return false; - } - - Future _submit() async { - if (_validateAndSaveForm()) { - final success = - await ref.read(editJobScreenControllerProvider.notifier).submit( - jobId: widget.jobId, - oldJob: widget.job, - name: _name ?? '', - ratePerHour: _ratePerHour ?? 0, - ); - if (success && mounted) { - context.pop(); - } - } - } - - @override - Widget build(BuildContext context) { - ref.listen( - editJobScreenControllerProvider, - (_, state) => state.showAlertDialogOnError(context), - ); - final state = ref.watch(editJobScreenControllerProvider); - return Scaffold( - appBar: AppBar( - title: Text(widget.job == null ? 'New Job' : 'Edit Job'), - actions: [ - TextButton( - onPressed: state.isLoading ? null : _submit, - child: const Text( - 'Save', - style: TextStyle(fontSize: 18, color: Colors.white), - ), - ), - ], - ), - body: _buildContents(), - ); - } - - Widget _buildContents() { - return SingleChildScrollView( - child: ResponsiveCenter( - maxContentWidth: Breakpoint.tablet, - padding: const EdgeInsets.all(16.0), - child: Card( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: _buildForm(), - ), - ), - ), - ); - } - - Widget _buildForm() { - return Form( - key: _formKey, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: _buildFormChildren(), - ), - ); - } - - List _buildFormChildren() { - return [ - TextFormField( - decoration: const InputDecoration(labelText: 'Job name'), - keyboardAppearance: Brightness.light, - initialValue: _name, - validator: (value) => - (value ?? '').isNotEmpty ? null : 'Name can\'t be empty', - onSaved: (value) => _name = value, - ), - TextFormField( - decoration: const InputDecoration(labelText: 'Rate per hour'), - keyboardAppearance: Brightness.light, - initialValue: _ratePerHour != null ? '$_ratePerHour' : null, - keyboardType: const TextInputType.numberWithOptions( - signed: false, - decimal: false, - ), - onSaved: (value) => _ratePerHour = int.tryParse(value ?? '') ?? 0, - ), - ]; - } -} diff --git a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart b/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart deleted file mode 100644 index b260c4f0..00000000 --- a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'dart:async'; - -import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/presentation/edit_job_screen/job_submit_exception.dart'; - -part 'edit_job_screen_controller.g.dart'; - -@riverpod -class EditJobScreenController extends _$EditJobScreenController { - @override - FutureOr build() { - // - } - - Future submit( - {JobID? jobId, - Job? oldJob, - required String name, - required int ratePerHour}) async { - final currentUser = ref.read(authRepositoryProvider).currentUser; - if (currentUser == null) { - throw AssertionError('User can\'t be null'); - } - // set loading state - state = const AsyncLoading().copyWithPrevious(state); - // check if name is already in use - final repository = ref.read(jobsRepositoryProvider); - final jobs = await repository.fetchJobs(uid: currentUser.uid); - final allLowerCaseNames = - jobs.map((job) => job.name.toLowerCase()).toList(); - // it's ok to use the same name as the old job - if (oldJob != null) { - allLowerCaseNames.remove(oldJob.name.toLowerCase()); - } - // check if name is already used - if (allLowerCaseNames.contains(name.toLowerCase())) { - state = AsyncError(JobSubmitException(), StackTrace.current); - return false; - } else { - // job previously existed - if (jobId != null) { - final job = Job(id: jobId, name: name, ratePerHour: ratePerHour); - state = await AsyncValue.guard( - () => repository.updateJob(uid: currentUser.uid, job: job), - ); - } else { - state = await AsyncValue.guard( - () => repository.addJob( - uid: currentUser.uid, name: name, ratePerHour: ratePerHour), - ); - } - return state.hasError == false; - } - } -} diff --git a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.g.dart b/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.g.dart deleted file mode 100644 index 775f9d7c..00000000 --- a/lib/src/features/jobs/presentation/edit_job_screen/edit_job_screen_controller.g.dart +++ /dev/null @@ -1,27 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'edit_job_screen_controller.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$editJobScreenControllerHash() => - r'e2985913f443860f6aa9d1b0aa462d4e5c25bed4'; - -/// See also [EditJobScreenController]. -@ProviderFor(EditJobScreenController) -final editJobScreenControllerProvider = - AutoDisposeAsyncNotifierProvider.internal( - EditJobScreenController.new, - name: r'editJobScreenControllerProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$editJobScreenControllerHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$EditJobScreenController = AutoDisposeAsyncNotifier; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/jobs/presentation/edit_job_screen/job_submit_exception.dart b/lib/src/features/jobs/presentation/edit_job_screen/job_submit_exception.dart deleted file mode 100644 index e8f19329..00000000 --- a/lib/src/features/jobs/presentation/edit_job_screen/job_submit_exception.dart +++ /dev/null @@ -1,9 +0,0 @@ -class JobSubmitException { - String get title => 'Name already used'; - String get description => 'Please choose a different job name'; - - @override - String toString() { - return '$title. $description.'; - } -} diff --git a/lib/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart b/lib/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart deleted file mode 100644 index 0df7face..00000000 --- a/lib/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart +++ /dev/null @@ -1,113 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; -import 'package:flutter_starter_base_app/src/utils/format.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; - -class EntryListItem extends StatelessWidget { - const EntryListItem({ - super.key, - required this.entry, - required this.job, - this.onTap, - }); - - final Entry entry; - final Job job; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: onTap, - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: Sizes.p16, - vertical: Sizes.p8, - ), - child: Row( - children: [ - Expanded( - child: _buildContents(context), - ), - const Icon(Icons.chevron_right, color: Colors.grey), - ], - ), - ), - ); - } - - Widget _buildContents(BuildContext context) { - final dayOfWeek = Format.dayOfWeek(entry.start); - final startDate = Format.date(entry.start); - final startTime = TimeOfDay.fromDateTime(entry.start).format(context); - final endTime = TimeOfDay.fromDateTime(entry.end).format(context); - final durationFormatted = Format.hours(entry.durationInHours); - - final pay = job.ratePerHour * entry.durationInHours; - final payFormatted = Format.currency(pay); - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row(children: [ - Text(dayOfWeek, - style: const TextStyle(fontSize: 18.0, color: Colors.grey)), - gapW16, - Text(startDate, style: const TextStyle(fontSize: 18.0)), - if (job.ratePerHour > 0.0) ...[ - Expanded(child: Container()), - Text( - payFormatted, - style: TextStyle(fontSize: 16.0, color: Colors.green[700]), - ), - ], - ]), - Row(children: [ - Text('$startTime - $endTime', style: const TextStyle(fontSize: 16.0)), - Expanded(child: Container()), - Text(durationFormatted, style: const TextStyle(fontSize: 16.0)), - ]), - if (entry.comment.isNotEmpty) - Text( - entry.comment, - style: const TextStyle(fontSize: 12.0), - overflow: TextOverflow.ellipsis, - maxLines: 1, - ), - ], - ); - } -} - -class DismissibleEntryListItem extends StatelessWidget { - const DismissibleEntryListItem({ - super.key, - required this.dismissibleKey, - required this.entry, - required this.job, - this.onDismissed, - this.onTap, - }); - - final Key dismissibleKey; - final Entry entry; - final Job job; - final VoidCallback? onDismissed; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - return Dismissible( - background: Container(color: Colors.red), - key: dismissibleKey, - direction: DismissDirection.endToStart, - onDismissed: (direction) => onDismissed?.call(), - child: EntryListItem( - entry: entry, - job: job, - onTap: onTap, - ), - ); - } -} diff --git a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart deleted file mode 100644 index 2b344f54..00000000 --- a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:firebase_ui_firestore/firebase_ui_firestore.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/presentation/job_entries_screen/entry_list_item.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart'; -import 'package:flutter_starter_base_app/src/routing/app_router.dart'; -import 'package:flutter_starter_base_app/src/utils/async_value_ui.dart'; - -class JobEntriesList extends ConsumerWidget { - const JobEntriesList({super.key, required this.job}); - final Job job; - - @override - Widget build(BuildContext context, WidgetRef ref) { - ref.listen( - jobsEntriesListControllerProvider, - (_, state) => state.showAlertDialogOnError(context), - ); - final jobEntriesQuery = ref.watch(jobEntriesQueryProvider(job.id)); - return FirestoreListView( - query: jobEntriesQuery, - itemBuilder: (context, doc) { - final entry = doc.data(); - return DismissibleEntryListItem( - dismissibleKey: Key('entry-${entry.id}'), - entry: entry, - job: job, - onDismissed: () => ref - .read(jobsEntriesListControllerProvider.notifier) - .deleteEntry(entry.id), - onTap: () => context.goNamed( - AppRoute.entry.name, - pathParameters: {'id': job.id, 'eid': entry.id}, - extra: entry, - ), - ); - }, - ); - } -} diff --git a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart deleted file mode 100644 index c5593b10..00000000 --- a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'dart:async'; - -import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/features/entries/data/entries_repository.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; - -part 'job_entries_list_controller.g.dart'; - -@riverpod -class JobsEntriesListController extends _$JobsEntriesListController { - @override - FutureOr build() { - // ok to leave this empty if the return type is FutureOr - } - - Future deleteEntry(EntryID entryId) async { - final currentUser = ref.read(authRepositoryProvider).currentUser; - if (currentUser == null) { - throw AssertionError('User can\'t be null'); - } - final repository = ref.read(entriesRepositoryProvider); - state = const AsyncLoading(); - state = await AsyncValue.guard( - () => repository.deleteEntry(uid: currentUser.uid, entryId: entryId)); - } -} diff --git a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.g.dart b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.g.dart deleted file mode 100644 index 608608e5..00000000 --- a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_list_controller.g.dart +++ /dev/null @@ -1,27 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'job_entries_list_controller.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$jobsEntriesListControllerHash() => - r'f9a08b66a0c962d210a09aebb711d38acb354b1e'; - -/// See also [JobsEntriesListController]. -@ProviderFor(JobsEntriesListController) -final jobsEntriesListControllerProvider = - AutoDisposeAsyncNotifierProvider.internal( - JobsEntriesListController.new, - name: r'jobsEntriesListControllerProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$jobsEntriesListControllerHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$JobsEntriesListController = AutoDisposeAsyncNotifier; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart b/lib/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart deleted file mode 100644 index 168c20d2..00000000 --- a/lib/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart +++ /dev/null @@ -1,55 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/async_value_widget.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/presentation/job_entries_screen/job_entries_list.dart'; -import 'package:flutter_starter_base_app/src/routing/app_router.dart'; - -class JobEntriesScreen extends ConsumerWidget { - const JobEntriesScreen({super.key, required this.jobId}); - final JobID jobId; - - @override - Widget build(BuildContext context, WidgetRef ref) { - final jobAsync = ref.watch(jobStreamProvider(jobId)); - return ScaffoldAsyncValueWidget( - value: jobAsync, - data: (job) => JobEntriesPageContents(job: job), - ); - } -} - -class JobEntriesPageContents extends StatelessWidget { - const JobEntriesPageContents({super.key, required this.job}); - final Job job; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(job.name), - actions: [ - IconButton( - icon: const Icon(Icons.edit, color: Colors.white), - onPressed: () => context.goNamed( - AppRoute.editJob.name, - pathParameters: {'id': job.id}, - extra: job, - ), - ), - ], - ), - body: JobEntriesList(job: job), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.add, color: Colors.white), - onPressed: () => context.goNamed( - AppRoute.addEntry.name, - pathParameters: {'id': job.id}, - extra: job, - ), - ), - ); - } -} diff --git a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen.dart b/lib/src/features/jobs/presentation/jobs_screen/jobs_screen.dart deleted file mode 100644 index 5c2ba72c..00000000 --- a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'package:firebase_ui_firestore/firebase_ui_firestore.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_starter_base_app/src/constants/strings.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart'; -import 'package:flutter_starter_base_app/src/routing/app_router.dart'; -import 'package:flutter_starter_base_app/src/utils/async_value_ui.dart'; - -class JobsScreen extends StatelessWidget { - const JobsScreen({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text(Strings.jobs), - actions: [ - IconButton( - icon: const Icon(Icons.add, color: Colors.white), - onPressed: () => context.goNamed(AppRoute.addJob.name), - ), - ], - ), - body: Consumer( - builder: (context, ref, child) { - ref.listen( - jobsScreenControllerProvider, - (_, state) => state.showAlertDialogOnError(context), - ); - final jobsQuery = ref.watch(jobsQueryProvider); - return FirestoreListView( - query: jobsQuery, - emptyBuilder: (context) => const Center(child: Text('No data')), - errorBuilder: (context, error, stackTrace) => Center( - child: Text(error.toString()), - ), - loadingBuilder: (context) => - const Center(child: CircularProgressIndicator()), - itemBuilder: (context, doc) { - final job = doc.data(); - return Dismissible( - key: Key('job-${job.id}'), - background: Container(color: Colors.red), - direction: DismissDirection.endToStart, - onDismissed: (direction) => ref - .read(jobsScreenControllerProvider.notifier) - .deleteJob(job), - child: JobListTile( - job: job, - onTap: () => context.goNamed( - AppRoute.job.name, - pathParameters: {'id': job.id}, - ), - ), - ); - }, - ); - }, - ), - ); - } -} - -class JobListTile extends StatelessWidget { - const JobListTile({super.key, required this.job, this.onTap}); - final Job job; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - return ListTile( - title: Text(job.name), - trailing: const Icon(Icons.chevron_right), - onTap: onTap, - ); - } -} diff --git a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart b/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart deleted file mode 100644 index 7667687d..00000000 --- a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'dart:async'; - -import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/data/jobs_repository.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; - -part 'jobs_screen_controller.g.dart'; - -@riverpod -class JobsScreenController extends _$JobsScreenController { - @override - FutureOr build() { - // ok to leave this empty if the return type is FutureOr - } - - Future deleteJob(Job job) async { - final currentUser = ref.read(authRepositoryProvider).currentUser; - if (currentUser == null) { - throw AssertionError('User can\'t be null'); - } - final repository = ref.read(jobsRepositoryProvider); - state = const AsyncLoading(); - state = await AsyncValue.guard( - () => repository.deleteJob(uid: currentUser.uid, jobId: job.id)); - } -} diff --git a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.g.dart b/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.g.dart deleted file mode 100644 index ade570c8..00000000 --- a/lib/src/features/jobs/presentation/jobs_screen/jobs_screen_controller.g.dart +++ /dev/null @@ -1,27 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'jobs_screen_controller.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$jobsScreenControllerHash() => - r'e3a40258404cf512fd12924d8f0a485f75d7d6fb'; - -/// See also [JobsScreenController]. -@ProviderFor(JobsScreenController) -final jobsScreenControllerProvider = - AutoDisposeAsyncNotifierProvider.internal( - JobsScreenController.new, - name: r'jobsScreenControllerProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$jobsScreenControllerHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$JobsScreenController = AutoDisposeAsyncNotifier; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/login/data/providers.dart b/lib/src/features/login/data/providers.dart new file mode 100644 index 00000000..594083d7 --- /dev/null +++ b/lib/src/features/login/data/providers.dart @@ -0,0 +1,23 @@ +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/utils/authentication_handler.dart'; +import 'package:flutter_starter_base_app/src/api/api.dart'; +part 'providers.g.dart'; + +@riverpod +Future login(LoginRef ref, {required String username, required String password}) async => + await API().login(username: username, password: password); +@riverpod +Future logout(LogoutRef ref) async => await AuthenticationHandler().clearTokens(); +@riverpod +Future refreshToken(RefreshTokenRef ref) async => await API().refreshToken(); +@riverpod +Future forgotPassword(ForgotPasswordRef ref, {required String username}) async => + await API().forgotPassword(username: username); +@riverpod +Future resetPassword(ResetPasswordRef ref, + {required String username, required String otp, required String newPassword}) async => + await API().resetPassword(username: username, otp: otp, newPassword: newPassword); + +@riverpod +Future canAuthenticateUser(CanAuthenticateUserRef ref) async => AuthenticationHandler().canAuthenticateUser(); diff --git a/lib/src/features/login/domain/login_response.dart b/lib/src/features/login/domain/login_response.dart new file mode 100644 index 00000000..ddb8f9cb --- /dev/null +++ b/lib/src/features/login/domain/login_response.dart @@ -0,0 +1,13 @@ +import 'package:json_annotation/json_annotation.dart'; +part 'login_response.g.dart'; + +@JsonSerializable() +class LoginResponse { + final String accessToken; + final String refreshToken; + + LoginResponse({required this.accessToken, required this.refreshToken}); + + factory LoginResponse.fromJson(Map json) => _$LoginResponseFromJson(json); + Map toJson() => _$LoginResponseToJson(this); +} diff --git a/lib/src/features/login/presentation/check_eula.dart b/lib/src/features/login/presentation/check_eula.dart new file mode 100644 index 00000000..c96f48a9 --- /dev/null +++ b/lib/src/features/login/presentation/check_eula.dart @@ -0,0 +1,27 @@ +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter/material.dart'; + +class CheckEULA extends ConsumerWidget { + const CheckEULA({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) => ref.watch(fetchEULAStatusProvider).when( + data: (bool acceptedEULA) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (context.mounted) { + acceptedEULA ? context.goNamed(AppRoute.home.name) : context.pushNamed(AppRoute.acceptEULA.name); + } + }); + return Container(); + }, + error: (error, stackTrace) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (context.mounted) context.goNamed(AppRoute.splash.name); + }); + return Container(); + }, + loading: () => const LoadingAnimation()); +} diff --git a/lib/src/features/login/presentation/forgot_password_page.dart b/lib/src/features/login/presentation/forgot_password_page.dart new file mode 100644 index 00000000..41b3dfa5 --- /dev/null +++ b/lib/src/features/login/presentation/forgot_password_page.dart @@ -0,0 +1,100 @@ +import 'package:flutter_starter_base_app/src/common_widgets/action_text_button.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/custom_text_form_field.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:go_router/go_router.dart'; + +class ForgotPasswordView extends ConsumerStatefulWidget { + const ForgotPasswordView({super.key}); + @override + ConsumerState createState() => _ForgotPasswordViewState(); +} + +class _ForgotPasswordViewState extends ConsumerState { + final _formKey = GlobalKey(); + final TextEditingController usernameController = TextEditingController(); + final FocusNode _usernameFocusNode = FocusNode(); + @override + void dispose() { + _usernameFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => Scaffold( + appBar: CustomAppBar( + titleWidget: Text(LocaleKeys.btn_forgotPassword.tr()), showBackButton: true, showHamburgerMenu: false), + body: Container( + color: CustomColors().darkGray, + child: Form( + key: _formKey, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Column(children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 17.5, vertical: 16), + child: Text(LocaleKeys.account_reset_forgotPassDesc.tr(), + style: TextStyle( + color: CustomColors().whitecolor, fontSize: 17, fontWeight: FontWeight.w400))), + _buildUsername(context) + ]), + Column(children: [ + _buildResetPassword(context), + ActionTextButton( + onPressed: () => context.canPop() ? context.pop() : null, text: LocaleKeys.btn_login.tr()) + ]) + ]))))); + + _buildResetPassword(BuildContext context) => PrimaryButton( + text: LocaleKeys.btn_resetPassword.tr(), + backgroundColor: CustomColors().lightblueColor, + onPressed: () async { + if (_formKey.currentState!.validate()) { + try { + await ref.read(forgotPasswordProvider(username: usernameController.text).future).then((response) { + final message = response.message; + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(message))); + } + }); + if (context.mounted) context.pushNamed(AppRoute.resetPassword.name); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('$e'))); + } + } + }); + + _buildUsername(BuildContext context) => CustomTextFormField( + autovalidateMode: AutovalidateMode.onUserInteraction, + controller: usernameController, + focusNode: _usernameFocusNode, + textInputType: TextInputType.text, + hintText: 'Enter Username', + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row(mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ + Text(LocaleKeys.common_username.tr(), + style: TextStyle(color: CustomColors().whitecolor, fontWeight: FontWeight.w400, fontSize: 17)), + SizedBox(width: MediaQuery.of(context).size.width * 0.02), + Icon(Icons.help, color: CustomColors().lightblueColor, size: 15) + ])), + validator: (value) { + if (value == null || value.isEmpty) { + return "Username can't be empty"; + } + if (value.length < 3) { + return "Username must be at least 3 characters"; + } + if (value.length > 50) { + return "Username can't be more than 50 characters"; + } + return null; + }); +} diff --git a/lib/src/features/login/presentation/login_page.dart b/lib/src/features/login/presentation/login_page.dart new file mode 100644 index 00000000..e1464218 --- /dev/null +++ b/lib/src/features/login/presentation/login_page.dart @@ -0,0 +1,231 @@ +import 'package:flutter_starter_base_app/src/common_widgets/action_text_button.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/custom_text_form_field.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'dart:ui' as ui; +import 'package:go_router/go_router.dart'; + +///XXX: only for testing +const String username = String.fromEnvironment('USERNAME'); +const String password = String.fromEnvironment('PASSWORD'); + +class LoginPage extends ConsumerStatefulWidget { + const LoginPage({super.key}); + + @override + ConsumerState createState() => _LoginPageState(); +} + +class _LoginPageState extends ConsumerState { + final _formKey = GlobalKey(); + final TextEditingController usernameController = TextEditingController(text: username); + final TextEditingController passwordController = TextEditingController(text: password); + FocusNode _usernameFocusNode = FocusNode(); + FocusNode _passwordFocusNode = FocusNode(); + ValueNotifier obsecurePassword = ValueNotifier(true); + + @override + void initState() { + super.initState(); + _usernameFocusNode = FocusNode(); + _passwordFocusNode = FocusNode(); + } + + @override + void dispose() { + _usernameFocusNode.dispose(); + _passwordFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => Scaffold( + appBar: CustomAppBar( + titleWidget: Text(LocaleKeys.btn_login.tr()), + leading: _buildAppbarBack(context), + showHamburgerMenu: false, + ), + body: Container( + color: CustomColors().darkGray, + child: Form( + key: _formKey, + child: Padding( + padding: const EdgeInsets.all(16), + child: Column(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [_buildEmailField(context), _buildPasswordField()]), + Column(children: [ + _buildLogin(context), + ActionTextButton( + text: LocaleKeys.btn_forgotPassword.tr(), + onPressed: () => context.pushNamed(AppRoute.forgotPassword.name)) + ]) + ]))))); + + _buildAppbarBack(BuildContext context) { + return InkWell( + onTap: () => context.goNamed(AppRoute.splash.name), + child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ + const Icon(CupertinoIcons.back), + Text(LocaleKeys.common_back.tr(), + style: TextStyle( + color: CustomColors().primaryTextColor, + fontSize: 17, + )) + ])); + } + + _buildLogin(BuildContext context) => PrimaryButton( + text: LocaleKeys.btn_login.tr(), + backgroundColor: CustomColors().lightblueColor, + onPressed: () => _formKey.currentState!.validate() + ? context.pushNamed(AppRoute.loginPageTransition.name, + pathParameters: {'password': passwordController.text, 'username': usernameController.text}) + : null); + + _buildPasswordField() { + return ValueListenableBuilder( + valueListenable: obsecurePassword, + builder: (context, value, child) { + return TextFormField( + controller: passwordController, + focusNode: _passwordFocusNode, + keyboardType: TextInputType.text, + textAlign: TextAlign.right, + maxLines: 1, + style: TextStyle( + overflow: TextOverflow.ellipsis, + color: CustomColors().whitecolor, + ), + decoration: InputDecoration( + contentPadding: const EdgeInsets.all(12.0), + hintMaxLines: 1, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(0.0), + borderSide: BorderSide( + color: CustomColors().grayColor, + )), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: CustomColors().grayColor, width: 0), + borderRadius: BorderRadius.circular(0.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: CustomColors().grayColor, width: 0), + borderRadius: BorderRadius.circular(0.0), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(0.0), + borderSide: BorderSide( + color: CustomColors().red, + width: 1, + ), + ), + errorStyle: TextStyle(color: CustomColors().red), + hintTextDirection: ui.TextDirection.rtl, + floatingLabelBehavior: FloatingLabelBehavior.never, + labelStyle: + TextStyle(color: CustomColors().lightblueColor, fontSize: 17, fontWeight: FontWeight.normal), + fillColor: CustomColors().grayColor, + filled: true, + hintText: LocaleKeys.hint_password.tr(), + hintStyle: TextStyle( + overflow: TextOverflow.ellipsis, + color: CustomColors().lightblueColor, + fontSize: 17, + fontWeight: FontWeight.normal), + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + LocaleKeys.common_password.tr(), + style: TextStyle( + color: CustomColors().whitecolor, + fontWeight: FontWeight.w400, + fontSize: 17, + ), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.02, + ), + Icon( + Icons.help, + color: CustomColors().lightblueColor, + size: 15, + ), + ], + ), + ), + suffixIconConstraints: const BoxConstraints( + minWidth: 30, + minHeight: 30, + )), + obscureText: obsecurePassword.value, + validator: (value) { + if (value!.isEmpty) { + return 'Please enter a password'; + } + // if (!RegExp(r'^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$').hasMatch(value)) { + // return 'At least 8 characters, including one uppercase letter, one number, and one special character'; + // } + return null; + }, + ); + }); + } + + _buildEmailField(BuildContext context) { + return CustomTextFormField( + controller: usernameController, + focusNode: _usernameFocusNode, + textInputType: TextInputType.emailAddress, + hintText: LocaleKeys.hint_emailOrUsername.tr(), + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + LocaleKeys.common_username.tr(), + style: TextStyle( + color: CustomColors().whitecolor, + fontWeight: FontWeight.w400, + fontSize: 17, + ), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.02, + ), + Icon( + Icons.help, + color: CustomColors().lightblueColor, + size: 15, + ), + ], + ), + ), + validator: (value) { + if (value == null || value.isEmpty) { + return "Username can't be empty"; + } + if (value.length < 3) { + return "Username must be at least 3 characters"; + } + if (value.length > 25) { + return "Username can't be more than 15 characters"; + } + return null; + }, + ); + } +} diff --git a/lib/src/features/login/presentation/login_transition.dart b/lib/src/features/login/presentation/login_transition.dart new file mode 100644 index 00000000..9470f8fe --- /dev/null +++ b/lib/src/features/login/presentation/login_transition.dart @@ -0,0 +1,30 @@ +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:go_router/go_router.dart'; + +class LoginPageTransition extends ConsumerWidget { + final String username, password; + const LoginPageTransition({super.key, required this.password, required this.username}); + + @override + Widget build(BuildContext context, WidgetRef ref) => + ref.watch(loginProvider(username: username, password: password)).when( + loading: () => const LoadingAnimation(), + data: (_) { + WidgetsBinding.instance.addPostFrameCallback((_) async { + if (context.mounted) context.goNamed(AppRoute.home.name); + }); + return const LoadingAnimation(); + }, + error: (error, _) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (context.canPop()) context.pop(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(backgroundColor: CustomColors().darkestGrayBG, content: Center(child: Text('$error')))); + }); + return Container(); + }); +} diff --git a/lib/src/features/login/presentation/logout_transition.dart b/lib/src/features/login/presentation/logout_transition.dart new file mode 100644 index 00000000..9f73da94 --- /dev/null +++ b/lib/src/features/login/presentation/logout_transition.dart @@ -0,0 +1,28 @@ +import 'package:flutter_starter_base_app/src/routing/app_router.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:go_router/go_router.dart'; + +class LogoutPageTransition extends ConsumerWidget { + const LogoutPageTransition({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) => ref.watch(logoutProvider).when( + loading: () => const LoadingAnimation(), + data: (_) { + WidgetsBinding.instance.addPostFrameCallback((_) { + ref.read(currentMainRouteIndexProvider.notifier).state = 0; + if (context.mounted) context.goNamed(AppRoute.splash.name); + }); + + return Container(); + }, + error: (error, _) { + WidgetsBinding.instance.addPostFrameCallback((_) => ScaffoldMessenger.of(context).showSnackBar( + SnackBar(backgroundColor: CustomColors().darkestGrayBG, content: Center(child: Text('$error'))))); + return Container(); + }); +} diff --git a/lib/src/features/login/presentation/reset_password_page.dart b/lib/src/features/login/presentation/reset_password_page.dart new file mode 100644 index 00000000..1153676a --- /dev/null +++ b/lib/src/features/login/presentation/reset_password_page.dart @@ -0,0 +1,282 @@ +import 'package:flutter_starter_base_app/src/common_widgets/action_text_button.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/custom_text_form_field.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/features/login/data/providers.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; + +class ResetPasswordView extends ConsumerStatefulWidget { + const ResetPasswordView({ + super.key, + }); + + @override + ConsumerState createState() => _ResetPasswordViewState(); +} + +class _ResetPasswordViewState extends ConsumerState { + final _formKey = GlobalKey(); + final TextEditingController usernameController = TextEditingController(); + final TextEditingController passwordController = TextEditingController(); + final TextEditingController confirmPasswordController = TextEditingController(); + final TextEditingController verificationCodeController = TextEditingController(); + FocusNode _usernameFocusNode = FocusNode(); + FocusNode _passwordFocusNode = FocusNode(); + FocusNode _confirmPasswordFocusNode = FocusNode(); + FocusNode _verificationCodeFocusNode = FocusNode(); + + final ValueNotifier _obscurePassword = ValueNotifier(true); + final ValueNotifier _obscureConfirmPassword = ValueNotifier(true); + + @override + void initState() { + super.initState(); + _usernameFocusNode = FocusNode(); + _passwordFocusNode = FocusNode(); + _confirmPasswordFocusNode = FocusNode(); + _verificationCodeFocusNode = FocusNode(); + } + + @override + void dispose() { + _usernameFocusNode.dispose(); + _passwordFocusNode.dispose(); + _confirmPasswordFocusNode.dispose(); + _verificationCodeFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + titleWidget: Text(LocaleKeys.btn_resetPassword.tr()), + showBackButton: true, + showHamburgerMenu: false, + ), + body: Container( + color: CustomColors().darkGray, + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Form( + key: _formKey, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 17.5, vertical: 16), + child: Text( + LocaleKeys.account_reset_checkYourEmailDesc.tr(), + style: TextStyle( + color: CustomColors().whitecolor, + fontSize: 17, + fontWeight: FontWeight.w400, + ), + ), + ), + textField( + context, + controller: usernameController, + focusNode: _usernameFocusNode, + hintText: LocaleKeys.hint_enter.tr(), + label: LocaleKeys.common_username.tr(), + ), + passwordField( + context, + controller: passwordController, + focusNode: _passwordFocusNode, + hintText: LocaleKeys.hint_enter.tr(), + label: LocaleKeys.common_password.tr(), + obscureNotifier: _obscurePassword, + ), + passwordField( + context, + controller: confirmPasswordController, + focusNode: _confirmPasswordFocusNode, + hintText: LocaleKeys.hint_enter.tr(), + label: LocaleKeys.account_confPassword.tr(), + obscureNotifier: _obscureConfirmPassword, + isConfirm: true, + ), + textField( + context, + controller: verificationCodeController, + focusNode: _verificationCodeFocusNode, + hintText: LocaleKeys.hint_enter.tr(), + label: LocaleKeys.account_verification.tr(), + ), + ], + ), + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + PrimaryButton( + text: 'Update Password', + backgroundColor: CustomColors().lightblueColor, + onPressed: () async { + try { + if (_formKey.currentState!.validate()) { + await ref + .read(resetPasswordProvider( + username: usernameController.text, + newPassword: passwordController.text, + otp: verificationCodeController.text) + .future) + .then((response) { + final message = response.message; + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(message))); + context.goNamed(AppRoute.passwordSuccess.name); + } + }); + } + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Failed to reset password: $e')), + ); + } + }, + ), + const SizedBox(height: 8), + ActionTextButton(onPressed: () => context.canPop() ? context.pop() : null, text: 'Cancel'), + ], + ), + ), + ], + ), + ), + ); + } + + CustomTextFormField textField( + BuildContext context, { + required TextEditingController controller, + required FocusNode focusNode, + required String hintText, + required String label, + }) { + return CustomTextFormField( + autovalidateMode: AutovalidateMode.onUserInteraction, + controller: controller, + focusNode: focusNode, + textInputType: TextInputType.text, + hintText: hintText, + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + label, + style: TextStyle( + color: CustomColors().whitecolor, + fontWeight: FontWeight.w400, + fontSize: 17, + ), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.02, + ), + Icon( + Icons.help, + color: CustomColors().lightblueColor, + size: 15, + ), + ], + ), + ), + validator: (value) { + if (value == null || value.isEmpty) { + return "$label can't be empty"; + } + if (label == "Username") { + if (value.length < 3) { + return "Username must be at least 3 characters"; + } + if (value.length > 15) { + return "Username can't be more than 15 characters"; + } + } + return null; + }, + ); + } + + ValueListenableBuilder passwordField( + BuildContext context, { + required TextEditingController controller, + required FocusNode focusNode, + required String hintText, + required String label, + required ValueNotifier obscureNotifier, + bool isConfirm = false, + }) { + return ValueListenableBuilder( + valueListenable: obscureNotifier, + builder: (context, value, child) { + return CustomTextFormField( + controller: controller, + focusNode: focusNode, + textInputType: TextInputType.text, + autovalidateMode: AutovalidateMode.onUserInteraction, + prefixIcon: Padding( + padding: const EdgeInsets.only(left: 15.0, right: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + label, + style: TextStyle( + color: CustomColors().whitecolor, + fontWeight: FontWeight.w400, + fontSize: 17, + ), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.02, + ), + Icon( + Icons.help, + color: CustomColors().lightblueColor, + size: 15, + ), + ], + ), + ), + hintText: hintText, + validator: (value) { + if (value == null || value.isEmpty) { + return '$label is required'; + } + if (!isConfirm) { + if (!RegExp(r'^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$').hasMatch(value)) { + return 'At least 8 characters, including one uppercase letter, one number, and one special character'; + } + } else { + if (value != passwordController.text) { + return 'Passwords do not match'; + } + } + return null; + }, + ); + }, + ); + } +} diff --git a/lib/src/features/login/presentation/reset_password_success_page.dart b/lib/src/features/login/presentation/reset_password_success_page.dart new file mode 100644 index 00000000..7916a894 --- /dev/null +++ b/lib/src/features/login/presentation/reset_password_success_page.dart @@ -0,0 +1,39 @@ +import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; + +class PasswordUpdateSuccessView extends ConsumerStatefulWidget { + const PasswordUpdateSuccessView({super.key}); + + @override + ConsumerState createState() => _PasswordUpdateSuccessViewState(); +} + +class _PasswordUpdateSuccessViewState extends ConsumerState { + @override + Widget build(BuildContext context) => Scaffold( + appBar: const CustomAppBar( + titleWidget: Text('Reset Password Success'), showBackButton: false, showHamburgerMenu: false), + body: Container( + color: CustomColors().darkGray, + child: Column(children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 17.5, vertical: 16), + child: Text('Your password was updated. Please log in with your new password.', + style: + TextStyle(color: CustomColors().whitecolor, fontSize: 17, fontWeight: FontWeight.w400)))), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column(children: [ + PrimaryButton( + text: 'Go To Log In Page', + backgroundColor: CustomColors().lightblueColor, + onPressed: () => context.mounted ? context.goNamed(AppRoute.signIn.name) : null) + ])) + ]))); +} diff --git a/lib/src/features/login/presentation/startup.dart b/lib/src/features/login/presentation/startup.dart new file mode 100644 index 00000000..84e220e8 --- /dev/null +++ b/lib/src/features/login/presentation/startup.dart @@ -0,0 +1,26 @@ +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:flutter_starter_base_app/src/features/login/data/providers.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter/material.dart'; + +class Startup extends ConsumerWidget { + const Startup({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) => ref.watch(canAuthenticateUserProvider).when( + data: (bool isAuthenticated) { + WidgetsBinding.instance.addPostFrameCallback((_) async { + if (context.mounted) context.pushNamed(isAuthenticated ? AppRoute.checkEULA.name : AppRoute.splash.name); + }); + return const SizedBox(); + }, + error: (error, stackTrace) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (context.mounted) context.goNamed(AppRoute.splash.name); + }); + return const SizedBox(); + }, + loading: () => const LoadingAnimation()); +} diff --git a/lib/src/features/onboarding/data/onboarding_repository.g.dart b/lib/src/features/onboarding/data/onboarding_repository.g.dart deleted file mode 100644 index 9aadad45..00000000 --- a/lib/src/features/onboarding/data/onboarding_repository.g.dart +++ /dev/null @@ -1,27 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'onboarding_repository.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$onboardingRepositoryHash() => - r'c622db9cad2e44cd70e29693d5653c6b22f36b56'; - -/// See also [onboardingRepository]. -@ProviderFor(onboardingRepository) -final onboardingRepositoryProvider = - FutureProvider.internal( - onboardingRepository, - name: r'onboardingRepositoryProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$onboardingRepositoryHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef OnboardingRepositoryRef = FutureProviderRef; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/onboarding/presentation/onboarding_controller.g.dart b/lib/src/features/onboarding/presentation/onboarding_controller.g.dart deleted file mode 100644 index e412ba81..00000000 --- a/lib/src/features/onboarding/presentation/onboarding_controller.g.dart +++ /dev/null @@ -1,27 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'onboarding_controller.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$onboardingControllerHash() => - r'232966a6326a75bb5f5166c8b76bbbb15087adaf'; - -/// See also [OnboardingController]. -@ProviderFor(OnboardingController) -final onboardingControllerProvider = - AutoDisposeAsyncNotifierProvider.internal( - OnboardingController.new, - name: r'onboardingControllerProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$onboardingControllerHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$OnboardingController = AutoDisposeAsyncNotifier; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/features/onboarding/presentation/onboarding_screen.dart b/lib/src/features/onboarding/presentation/onboarding_screen.dart index 1140a38d..ee251046 100644 --- a/lib/src/features/onboarding/presentation/onboarding_screen.dart +++ b/lib/src/features/onboarding/presentation/onboarding_screen.dart @@ -1,3 +1,5 @@ +import 'package:flutter_starter_base_app/src/features/onboarding/presentation/onboarding_controller.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -5,9 +7,7 @@ import 'package:go_router/go_router.dart'; import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; import 'package:flutter_starter_base_app/src/common_widgets/responsive_center.dart'; import 'package:flutter_starter_base_app/src/constants/app_sizes.dart'; -import 'package:flutter_starter_base_app/src/features/onboarding/presentation/onboarding_controller.dart'; import 'package:flutter_starter_base_app/src/localization/string_hardcoded.dart'; -import 'package:flutter_starter_base_app/src/routing/app_router.dart'; class OnboardingScreen extends ConsumerWidget { const OnboardingScreen({super.key}); @@ -42,9 +42,7 @@ class OnboardingScreen extends ConsumerWidget { onPressed: state.isLoading ? null : () async { - await ref - .read(onboardingControllerProvider.notifier) - .completeOnboarding(); + await ref.read(onboardingControllerProvider.notifier).completeOnboarding(); if (context.mounted) { // go to sign in page after completing onboarding context.goNamed(AppRoute.signIn.name); diff --git a/lib/src/features/onboarding/presentation/splash.dart b/lib/src/features/onboarding/presentation/splash.dart new file mode 100644 index 00000000..4ede12d0 --- /dev/null +++ b/lib/src/features/onboarding/presentation/splash.dart @@ -0,0 +1,49 @@ +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class SplashView extends StatelessWidget { + const SplashView({super.key}); + + @override + Widget build(BuildContext context) => Scaffold( + body: Container( + decoration: + const BoxDecoration(image: DecorationImage(image: AssetImage('assets/splash.jpg'), fit: BoxFit.cover)), + child: Stack(children: [ + Align( + alignment: Alignment.bottomCenter, + child: Container( + height: 250, + width: double.infinity, + color: CustomColors().whitecolor, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column(mainAxisAlignment: MainAxisAlignment.end, children: [ + Image.asset('assets/logo.png'), + const SizedBox(height: 20), + PrimaryButton( + text: LocaleKeys.btn_getStarted.tr(), + backgroundColor: CustomColors().lightblueColor, + onPressed: () => context.goNamed(AppRoute.setupSecreen.name)), + const SizedBox(height: 10), + Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + Text('${LocaleKeys.btn_haveAccount.tr()} ', + style: TextStyle( + fontSize: 14, color: CustomColors().lightblueColor, fontWeight: FontWeight.bold)), + TextButton( + onPressed: () => context.pushNamed(AppRoute.signIn.name), + child: Text(LocaleKeys.btn_login.tr(), + style: TextStyle( + fontSize: 14, + color: CustomColors().lightblueColor, + fontWeight: FontWeight.bold))) + ]), + const SizedBox(height: 10) + ])))) + ]))); +} diff --git a/lib/src/features/report/data/report_providers.dart b/lib/src/features/report/data/report_providers.dart new file mode 100644 index 00000000..c2e7c3fc --- /dev/null +++ b/lib/src/features/report/data/report_providers.dart @@ -0,0 +1,20 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:flutter_starter_base_app/src/api/api_facade.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_by.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_frame.dart'; + +part 'report_providers.g.dart'; + +@riverpod +Future> reportData(ReportDataRef ref, {required String timeWindow}) async { + return await (await APIFacade().getApi()).getReportData(timeWindow); +} + + +StateProvider triggerPage = StateProvider((ref) => null); +StateProvider reportBy = StateProvider((ref) => ReportBy.cost); +StateProvider currentTimeWindow = StateProvider((ref) => TimeWindow.values.first); +ReportDataProvider? newReportList = ReportDataProvider(timeWindow: TimeWindow.values.first.timeWindowEum.name); +StateProvider> currentlySelectedVehicleList = StateProvider>((ref) => []); diff --git a/lib/src/features/report/domain/report_by.dart b/lib/src/features/report/domain/report_by.dart new file mode 100644 index 00000000..d519eb40 --- /dev/null +++ b/lib/src/features/report/domain/report_by.dart @@ -0,0 +1 @@ +enum ReportBy { power, cost } diff --git a/lib/src/features/report/domain/report_data.dart b/lib/src/features/report/domain/report_data.dart new file mode 100644 index 00000000..d5ca2980 --- /dev/null +++ b/lib/src/features/report/domain/report_data.dart @@ -0,0 +1,24 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:json_annotation/json_annotation.dart'; +part 'report_data.g.dart'; + +@JsonSerializable(explicitToJson: true) +class ReportData implements Item { + final String label; + final String value; + + final double x; + final double y; + + ReportData({ + required this.label, + required this.value, + required this.x, + required this.y + }); + + factory ReportData.fromJson(Map json) => _$ReportDataFromJson(json); + Map toJson() => _$ReportDataToJson(this); + +} \ No newline at end of file diff --git a/lib/src/features/report/domain/report_frame.dart b/lib/src/features/report/domain/report_frame.dart new file mode 100644 index 00000000..0dd91aab --- /dev/null +++ b/lib/src/features/report/domain/report_frame.dart @@ -0,0 +1,29 @@ +import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:flutter_starter_base_app/src/domain/label_value.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:flutter_starter_base_app/src/utils/string_extension.dart'; +part 'report_frame.g.dart'; + +enum TimeWindowEnum { past31Days, thisWeek, thisMonth, thisYear } + +@JsonSerializable(explicitToJson: true) +class TimeWindow extends LabelValuePair with Item { + final TimeWindowEnum timeWindowEum; + const TimeWindow({required super.value, required super.label, required this.timeWindowEum}); + String get name => value.toString().camelCaseToTitleCase(); + + @override + String get displayText => name; + String get localizationKey => "reports.tw.${timeWindowEum.name}"; + LabelValuePair get toLabelValuePair => LabelValuePair(label: name, value: value); + factory TimeWindow.fromLabelValuePair(LabelValuePair labelValuePair) => TimeWindow( + value: labelValuePair.value, + label: labelValuePair.label, + timeWindowEum: TimeWindowEnum.values.firstWhere((e) => labelValuePair.value == e.name)); + factory TimeWindow.fromJson(String json) => + TimeWindow(value: json, label: json, timeWindowEum: $enumDecode(_$TimeWindowEnumEnumMap, json)); + @override + Map toJson() => _$TimeWindowToJson(this); + static List get values => + TimeWindowEnum.values.map((e) => TimeWindow(value: e.name, label: e.name, timeWindowEum: e)).toList(); +} diff --git a/lib/src/features/report/presentation/bar_background.dart b/lib/src/features/report/presentation/bar_background.dart new file mode 100644 index 00000000..dc08c428 --- /dev/null +++ b/lib/src/features/report/presentation/bar_background.dart @@ -0,0 +1,19 @@ +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter/widgets.dart'; + +class BarBackgroud extends StatelessWidget { + const BarBackgroud({super.key}); + + @override + Widget build(BuildContext context) => Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: List.generate( + 5, + (_) => Expanded( + child: Container( + decoration: BoxDecoration( + border: Border( + left: BorderSide(color: CustomColors().lightGrayText), + bottom: BorderSide(color: CustomColors().lightGrayText), + right: BorderSide(color: CustomColors().lightGrayText))))))); +} diff --git a/lib/src/features/report/presentation/bar_view.dart b/lib/src/features/report/presentation/bar_view.dart new file mode 100644 index 00000000..4a4489ed --- /dev/null +++ b/lib/src/features/report/presentation/bar_view.dart @@ -0,0 +1,85 @@ +import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter_starter_base_app/src/utils/bar_view_calculator.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_by.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/features/report/data/report_providers.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/bar_background.dart'; + +//todo handle multiple unknown vehicles? +class BarView extends ConsumerWidget { + final List reportList; + + const BarView({super.key, required this.reportList}); + @override + Widget build(BuildContext context, WidgetRef ref) { + ref.watch(triggerPage); + bool reportByCost = ref.read(reportBy) == ReportBy.cost; + + final barViewCalculator = BarViewCalculator( + values: reportList + .map((ReportData reportData) => reportData.x + reportData.y) + .toList()); + return Padding( + padding: const EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 45, right: 15, bottom: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: barViewCalculator + .calculateMarkings() + .map((String step) => + Text(step, style: TextStyle(color: CustomColors().lighterGrayText, fontSize: 14))) + .toList())) + ] + + reportList.map((ReportData reportData) { + double homeTotal = reportData.x; + double publicTotal = reportData.y; + double total = homeTotal + publicTotal; + double flexTot = barViewCalculator.calculateFlexValue(total); + double flexHome = total <= 0 ? 0 : flexTot * homeTotal / total; + double flexPublic = total <= 0 ? 0 : flexTot * publicTotal / total; + return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Tooltip( + decoration: + BoxDecoration(color: CustomColors().whitecolor, borderRadius: BorderRadius.circular(40)), + triggerMode: TooltipTriggerMode.tap, + richMessage: + TextSpan( + text: LocaleKeys.reports_viewTrips.tr(), + style: const TextStyle(color: Colors.black), + recognizer: TapGestureRecognizer() + ..onTap = () => context.pushNamed(AppRoute.reportTable.name, extra: reportData.label) + ), + child: SizedBox( + height: 27, + child: Stack(children: [ + const BarBackgroud(), + Row(children: [ + if (flexHome > 0) + Flexible( + flex: (flexHome * 100).toInt(), + child: Container(color: CustomColors().reportBarBlue)), + if (flexPublic > 0) + Flexible( + flex: (flexPublic * 100).toInt(), + child: Container(color: CustomColors().reportBarGray)), + Spacer(flex: (((1 - flexTot)) * 100).toInt()) + ]) + ]))), + const SizedBox(height: 10), + Text(reportData.label, style: DanlawTheme().defaultTextStyle(15)), + const SizedBox(height: 20) + ]); + }).toList())); + } +} diff --git a/lib/src/features/report/presentation/bar_view_legend.dart b/lib/src/features/report/presentation/bar_view_legend.dart new file mode 100644 index 00000000..e3bccc42 --- /dev/null +++ b/lib/src/features/report/presentation/bar_view_legend.dart @@ -0,0 +1,21 @@ +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/report_subtitle.dart'; + +class BarViewLegend extends StatelessWidget { + const BarViewLegend({super.key}); + + @override + Widget build(BuildContext context) => Row(children: [ + Row(children: [ + Container(height: 10, width: 10, color: CustomColors().reportBarBlue), + ReportSubTitle(text:LocaleKeys.reports_bar_legendHome.tr()) + ]), + Row(children: [ + Container(height: 10, width: 10, color: CustomColors().reportBarGray), + ReportSubTitle(text: LocaleKeys.reports_bar_legendpub.tr()) + ]) + ]); +} diff --git a/lib/src/features/report/presentation/elliptic_button.dart b/lib/src/features/report/presentation/elliptic_button.dart new file mode 100644 index 00000000..e20048b3 --- /dev/null +++ b/lib/src/features/report/presentation/elliptic_button.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_by.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/features/report/data/report_providers.dart'; + +class EllipticButton extends ConsumerWidget { + final ReportBy setReportByTo; + final String text; + final bool mirror; + const EllipticButton({super.key, required this.setReportByTo, required this.text, this.mirror = false}); + @override + Widget build(BuildContext context, WidgetRef ref) => Transform.flip( + flipX: mirror, + child: InkWell( + onTap: () { + ref.read(reportBy.notifier).state = setReportByTo; + WidgetsBinding.instance.addPostFrameCallback( + (_) => ref.read(triggerPage.notifier).state = ref.read(currentlySelectedVehicleList)); + }, + child: Container( + height: 30, + width: 60, + decoration: BoxDecoration( + color: ref.watch(reportBy) == setReportByTo ? CustomColors().reportByButtonBG : Colors.transparent, + border: Border.all(color: CustomColors().lightGrayText), + borderRadius: const BorderRadius.only( + topLeft: Radius.elliptical(100, 70), bottomLeft: Radius.elliptical(100, 70))), + child: Transform.flip( + flipX: mirror, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ref.watch(reportBy) == setReportByTo + ? Row(children: [ + Icon(Icons.check, color: CustomColors().whitecolor, size: 15), + const SizedBox(width: 5) + ]) + : Container(), + Text(text, + textAlign: TextAlign.center, + style: TextStyle(color: CustomColors().whitecolor, fontSize: 11)) + ]))))); +} diff --git a/lib/src/features/report/presentation/report_bar_view.dart b/lib/src/features/report/presentation/report_bar_view.dart new file mode 100644 index 00000000..e2f072c9 --- /dev/null +++ b/lib/src/features/report/presentation/report_bar_view.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/features/report/data/report_providers.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/bar_view.dart'; +import 'package:flutter_starter_base_app/src/features/vehicle/domain/report_vehicle.dart'; +import 'package:flutter_starter_base_app/src/features/charger/domain/charger_details.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; + +class ReportBarView extends ConsumerWidget { + final ReportListProvider? reportList; + const ReportBarView({super.key, required this.reportList}); + @override + Widget build(BuildContext context, WidgetRef ref) => reportList == null + ? Padding( + padding: const EdgeInsets.all(20), + child: Text('Select Vehicles to start', style: DanlawTheme().defaultTextStyle(17))) + : ref.watch(reportList!).when( + loading: () => const LoadingAnimation(), + data: (List reportList) => reportList.isEmpty + ? Container() + : BarView( + reportList: reportList + .where((ReportVehicle reportVehicle) => ref + .read(currentlySelectedVehicleList) + .map((BaseSingleSelect singleSelect) => (singleSelect as LabelValuePair).value) + .toList() + .contains(reportVehicle.vin)) + .toList()), + error: (error, stackTrace) { + WidgetsBinding.instance.addPostFrameCallback((_) => ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Center(child: Text('${(error as Exception)}'))))); + return Container(); + }); +} diff --git a/lib/src/features/report/presentation/report_subtitle.dart b/lib/src/features/report/presentation/report_subtitle.dart new file mode 100644 index 00000000..12f73369 --- /dev/null +++ b/lib/src/features/report/presentation/report_subtitle.dart @@ -0,0 +1,11 @@ +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter/material.dart'; + +class ReportSubTitle extends StatelessWidget { + final String text; + const ReportSubTitle({super.key, required this.text}); + @override + Widget build(BuildContext context) => Padding( + padding: const EdgeInsets.all(10), + child: Row(children: [Text(text, style: TextStyle(color: CustomColors().lighterGrayText, fontSize: 11))])); +} diff --git a/lib/src/features/report/presentation/reports_page.dart b/lib/src/features/report/presentation/reports_page.dart new file mode 100644 index 00000000..6065020e --- /dev/null +++ b/lib/src/features/report/presentation/reports_page.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/subsection_title.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_by.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_frame.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/features/report/data/report_providers.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/report_subtitle.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/bar_view_legend.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/elliptic_button.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/report_bar_view.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/time_window_select.dart'; + +class ReportsPage extends ConsumerWidget { + const ReportsPage({super.key}); + + ///todo change trigger future provider by vehicle list => already returns all the vehicles + @override + Widget build(BuildContext context, WidgetRef ref) { + ref.watch(reportBy); + ref.watch(triggerPage); + ref.watch(currentTimeWindow.notifier).stream.listen( + onDone: () => newReportList = null, + (TimeWindow? event) => (ref.read(currentlySelectedVehicleList.notifier).state.isEmpty || event == null) + ? null + : newReportList = ReportDataProvider(timeWindow: event.timeWindowEum.name)); + ref.watch(currentlySelectedVehicleList.notifier).stream.listen(onDone: () => newReportList = null, (_) { + TimeWindow? currentTimeWindowLocal = ref.read(currentTimeWindow); + ref.read(currentlySelectedVehicleList.notifier).state.isEmpty || currentTimeWindowLocal == null + ? newReportList = null + : newReportList = ReportDataProvider(timeWindow: currentTimeWindowLocal.timeWindowEum.name); + }); + return SafeArea( + child: Scaffold( + appBar: CustomAppBar( + titleWidget: Text(LocaleKeys.common_reports.tr(), + style: DanlawTheme().defaultTextStyle(20).copyWith(fontWeight: FontWeight.w500))), + body: CustomScrollView(slivers: [ + SliverFillRemaining( + hasScrollBody: false, + child: Container( + color: CustomColors().darkGray, + child: Column(children: [ + Flexible( + child: Center( + child: Text(LocaleKeys.reports_vehicleEnergyReport.tr(), + style: DanlawTheme().defaultTextStyle(20)))), + Flexible( + flex: 9, + child: Column(children: [ + Padding( + padding: const EdgeInsets.only(left: 10, right: 10), + child: Container( + color: CustomColors().lightGrayColor, + child: Column(children: [ + TimeWindowSingleSelect( + text: LocaleKeys.reports_tw_title.tr(), + description: 'description', + value: ref.watch(currentTimeWindow.notifier).state.displayText), + const Padding( + padding: EdgeInsets.only(left: 10, right: 10), child: PopupMenuDivider()), + Column(children: [ReportBarView(reportList: newReportList)]), + ReportSubTitle(text: LocaleKeys.reports_info_barSelection.tr()), + const Row(children: [ + Row(children: [ + SizedBox(width: 10), + EllipticButton(text: '\$', setReportByTo: ReportBy.cost), + EllipticButton(text: 'KW', mirror: true, setReportByTo: ReportBy.power), + ]), + Spacer(), + BarViewLegend() + ]), + const SizedBox(height: 10) + ])) + ), + ])) + ]))) + ]))); + } +} diff --git a/lib/src/features/report/presentation/time_window_select.dart b/lib/src/features/report/presentation/time_window_select.dart new file mode 100644 index 00000000..3afa8524 --- /dev/null +++ b/lib/src/features/report/presentation/time_window_select.dart @@ -0,0 +1,42 @@ +import 'package:flutter_starter_base_app/src/domain/label_value.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter_starter_base_app/src/constants/colors.dart'; +import 'package:flutter_starter_base_app/src/constants/svg_loader.dart'; +import 'package:flutter_starter_base_app/src/constants/theme_data.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_frame.dart'; +import 'package:flutter_starter_base_app/src/features/report/data/report_providers.dart'; + +class TimeWindowSingleSelect extends ConsumerWidget { + final String text; + final String value; + final String description; + const TimeWindowSingleSelect({super.key, required this.text, required this.value, required this.description}); + @override + Widget build(BuildContext context, WidgetRef ref) => Container( + padding: const EdgeInsets.only(top: 7, bottom: 7, left: 17, right: 17), + child: Row(children: [ + Text(text, style: DanlawTheme().defaultTextStyle(18)), + Tooltip( + message: description, + child: Container(padding: const EdgeInsets.only(left: 10), child: SVGLoader().questionMark)), + const Spacer(), + Text( ref.watch(currentTimeWindow).localizationKey.tr(), + style: DanlawTheme().defaultTextStyle(17).copyWith(color: CustomColors().darkGrayText)), + InkWell( + child: InkWell( + child: Container(padding: const EdgeInsets.only(left: 10), child: SVGLoader().rightArrow), + onTap: () async { + LabelValuePair? labelValuePairOrNull = await context.pushNamed(AppRoute.reportTimeWindowSelect.name, + extra: [text, CustomColors().darkGray, TimeWindow.values, ref.read(currentTimeWindow)]); + if (labelValuePairOrNull != null) { + ref.watch(currentTimeWindow.notifier).state = TimeWindow.fromLabelValuePair(labelValuePairOrNull); + WidgetsBinding.instance.addPostFrameCallback( + (_) => ref.read(triggerPage.notifier).state = ref.read(currentTimeWindow)); + } + })) + ])); +} diff --git a/lib/src/features/report/presentation/vehicle_report_table.dart b/lib/src/features/report/presentation/vehicle_report_table.dart new file mode 100644 index 00000000..c09240ac --- /dev/null +++ b/lib/src/features/report/presentation/vehicle_report_table.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; +import 'package:flutter_starter_base_app/src/utils/format.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/vehicle_event.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/base_trip_event.dart'; + +class ReportTable extends StatelessWidget { + final List reportData; + const ReportTable({super.key, required this.reportData}); + + @override + Widget build(BuildContext context) => DataTable( + border: TableBorder.symmetric(inside: BorderSide(color: CustomColors().whitecolor, width: .5)), + columns: [ + "X",// LocaleKeys.common_vehicle.tr(), + "Label",// LocaleKeys.common_start.tr(), + "Value"// LocaleKeys.common_time.tr(), + ] + .map((header) => DataColumn( + label: Expanded( + child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + Text(header, textAlign: TextAlign.center, style: DanlawTheme().defaultTextStyle(13)) + ])))) + .toList(), + rows: reportData + .map((ReportData reportRow) => DataRow(cells: [ + DataCell(Center(child: Text("Row"))), + DataCell(Center(child: Text(reportRow.label))), + DataCell(Center(child: Text(reportRow.value))) + ])) + .toList()); +} diff --git a/lib/src/home_page.dart b/lib/src/home_page.dart new file mode 100644 index 00000000..ca6f043b --- /dev/null +++ b/lib/src/home_page.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/features/household/domain/providers.dart'; +import 'package:flutter_starter_base_app/src/global_providers/global_providers.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/features/household/domain/household.dart'; +import 'package:flutter_starter_base_app/src/features/household/presentation/household_view.dart'; + +final listItemSelectorProvider = StateProvider((ref) => 0); + +class HomePage extends ConsumerWidget { + const HomePage({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) => RefreshIndicator( + color: CustomColors().primaryTextColor, + backgroundColor: CustomColors().darkGrayBG, + onRefresh: () async => ref.refresh(fetchHouseholdListProvider.future), + child: ref.watch(fetchHouseholdListProvider).when( + error: (Object error, StackTrace stackTrace) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Center(child: Text('$error'))))); + return const Scaffold( + appBar: CustomAppBar(titleWidget: Text('Cannot Load Household')), + ); + }, + loading: () => const Scaffold(body: Directionality(textDirection: TextDirection.ltr, child: SizedBox())), + data: (List householdList) { + List householdViewList = householdList.map((household) => HouseholdView(household: household)).toList(); + WidgetsBinding.instance.addPostFrameCallback((_) => ref.read(currentHousehold.notifier).state == null + ? ref.read(currentHousehold.notifier).state = householdList[0] + : null); + return Scaffold( + appBar: CustomAppBar( + titleWidget: Text(householdList[ref.watch(listItemSelectorProvider)].householdName, + style: DanlawTheme().defaultTextStyle(20).copyWith(fontWeight: FontWeight.w500)), + automaticallyImplyLeading: false), + body: CustomScrollView(primary: true, scrollDirection: Axis.vertical, slivers: [ + SliverFillViewport( + delegate: SliverChildBuilderDelegate( + childCount: 1, + (context, index) => Column(children: [ + Flexible( + child: CarouselSlider( + items: householdViewList, + options: CarouselOptions( + initialPage: ref.watch(listItemSelectorProvider), + viewportFraction: 1, + enableInfiniteScroll: false, + height: MediaQuery.of(context).size.height, + onPageChanged: (index, a) { + ref.read(currentHousehold.notifier).state = householdList[index]; + ref.read(listItemSelectorProvider.notifier).update((_) => index); + }))), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: householdViewList + .asMap() + .entries + .map((entry) => Container( + width: 7.0, + height: 7.0, + margin: const EdgeInsets.symmetric(vertical: 6.0, horizontal: 4.0), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white.withOpacity( + ref.watch(listItemSelectorProvider) == entry.key ? 0.9 : 0.4)))) + .toList()) + ]))), + ])); + })); +} diff --git a/lib/src/localization/asset_handler.dart b/lib/src/localization/asset_handler.dart new file mode 100644 index 00000000..3e572573 --- /dev/null +++ b/lib/src/localization/asset_handler.dart @@ -0,0 +1,89 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter_starter_base_app/src/api/mock_api.dart'; +import 'package:flutter_starter_base_app/src/localization/localization_service.dart'; +import 'package:flutter_starter_base_app/src/utils/translation_storage.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/material.dart'; + +class AssetHandler extends AssetLoader { + static final Map> _cachedData = {}; + static final Set _apiCalledLocales = {}; + + //TODO: Handle multiple calls due to use of fallback translation property + @override + Future> load(String path, Locale locale) async { + final localeKey = _getLocaleString(locale); + + try { + // Check if domain for this locale is already cached in memory + if (_cachedData.containsKey(localeKey)) { + return _cachedData[localeKey]!; + } + + // If API call hasn't been made for this locale, try API + if (!_apiCalledLocales.contains(localeKey)) { + final apiData = await _loadFromApi(locale); + if (apiData != null) { + _cachedData[localeKey] = apiData; + _apiCalledLocales.add(localeKey); + return _cachedData[localeKey]!; + } + } + + final translationStorage = TranslationStorage(locale: locale); + final localFilePath = await translationStorage.localizedFilePath; + final localFile = File('$localFilePath/$localeKey.json'); + + // Try to load from local file + if (await localFile.exists()) { + final localData = await translationStorage.readTranslationFile(); + _cachedData[localeKey] = json.decode(localData); + return _cachedData[localeKey]!; + } + + // Fallback to asset + _cachedData[localeKey] = await _loadFromAsset(path, locale); + return _cachedData[localeKey]!; + } catch (e) { + debugPrint(e.toString()); + // Fallback to fallback language asset + final fallbackLocale = LocalizationService.getFallbackLocale(); + + return await _loadFromAsset(path, fallbackLocale); + } + } + + Future?> _loadFromApi(Locale locale) async { + final localeKey = _getLocaleString(locale); + try { + final data = await APIMock().getInformationText(localeKey); + if (data != null) { + // Save the domain to local storage + final translationStorage = TranslationStorage(locale: locale); + await translationStorage.writeTranslationFile(json.encode(data)); + return data; + } + return null; + } catch (e) { + debugPrint('Error loading from API: $e'); + return null; + } + } + + Future> _loadFromAsset(String path, Locale locale) async { + try { + final assetPath = '$path/${_getLocaleString(locale)}.json'; + final data = await rootBundle.loadString(assetPath); + return json.decode(data); + } catch (e) { + debugPrint(e.toString()); + throw Exception('Failed to load asset file'); + } + } + + String _getLocaleString(Locale locale) { + return '${locale.languageCode}-${locale.countryCode}'; + } +} diff --git a/lib/src/localization/localization_service.dart b/lib/src/localization/localization_service.dart new file mode 100644 index 00000000..aa60a51f --- /dev/null +++ b/lib/src/localization/localization_service.dart @@ -0,0 +1,57 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:easy_localization/easy_localization.dart'; + +class LocalizationService { + static const List _supportedLanguages = [Locale('en', 'US'), Locale('es', 'MX'), Locale('fr', 'CA')]; + static const Locale _fallbackLanguage = Locale('en', 'US'); + + static Locale getDeviceLocale() { + final platformDispatcher = PlatformDispatcher.instance; + final deviceLocales = platformDispatcher.locales; + debugPrint("Raw device locales: $deviceLocales"); + + // Try to find a supported locale + for (var deviceLocale in deviceLocales) { + // Check for exact match + if (_supportedLanguages.contains(deviceLocale)) { + debugPrint("Using device locale: $deviceLocale"); + return deviceLocale; + } + + // Check for language match + final matchingLocale = + _supportedLanguages.where((locale) => locale.languageCode == deviceLocale.languageCode).firstOrNull; + + if (matchingLocale != null) { + debugPrint("Using matched locale: $matchingLocale"); + return matchingLocale; + } + } + + // If no match found, use fallback + debugPrint("Using fallback locale: $_fallbackLanguage"); + return _fallbackLanguage; + } + + static Future setLocaleFromDevice(BuildContext context) async { + final deviceLocale = getDeviceLocale(); + await setLocale(context, deviceLocale); + } + + static setLocale(BuildContext context, Locale locale) async { + await context.setLocale(locale); + } + + static Locale getFallbackLocale() { + return _fallbackLanguage; + } + + static Locale getCurrentLocale(BuildContext context) { + return context.locale; + } + + static List getSupportedLocales() { + return _supportedLanguages; + } +} diff --git a/lib/src/routing/app_router.dart b/lib/src/routing/app_router.dart index c03854d3..46f80825 100644 --- a/lib/src/routing/app_router.dart +++ b/lib/src/routing/app_router.dart @@ -1,230 +1,128 @@ +import 'package:flutter_starter_base_app/src/accounts_page.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:flutter_starter_base_app/src/features/account/presentation/add_account_flow.dart'; +import 'package:flutter_starter_base_app/src/features/account/presentation/eula_transition.dart'; +import 'package:flutter_starter_base_app/src/features/account/presentation/eula_view.dart'; +import 'package:flutter_starter_base_app/src/features/login/presentation/check_eula.dart'; +import 'package:flutter_starter_base_app/src/features/login/presentation/forgot_password_page.dart'; +import 'package:flutter_starter_base_app/src/features/login/presentation/login_page.dart'; +import 'package:flutter_starter_base_app/src/features/login/presentation/login_transition.dart'; +import 'package:flutter_starter_base_app/src/features/login/presentation/logout_transition.dart'; +import 'package:flutter_starter_base_app/src/features/login/presentation/reset_password_page.dart'; +import 'package:flutter_starter_base_app/src/features/login/presentation/reset_password_success_page.dart'; +import 'package:flutter_starter_base_app/src/features/login/presentation/startup.dart'; +import 'package:flutter_starter_base_app/src/features/onboarding/presentation/splash.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/reports_page.dart'; +import 'package:flutter_starter_base_app/src/home_page.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter_starter_base_app/src/setup_screen.dart'; +import 'package:flutter_starter_base_app/src/setup_success_page.dart'; import 'package:flutter/material.dart'; -import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_starter_base_app/src/routing/app_startup.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/presentation/custom_profile_screen.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/presentation/custom_sign_in_screen.dart'; -import 'package:flutter_starter_base_app/src/features/entries/presentation/entries_screen.dart'; -import 'package:flutter_starter_base_app/src/features/entries/domain/entry.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; -import 'package:flutter_starter_base_app/src/features/entries/presentation/entry_screen/entry_screen.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/presentation/job_entries_screen/job_entries_screen.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/presentation/edit_job_screen/edit_job_screen.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/presentation/jobs_screen/jobs_screen.dart'; -import 'package:flutter_starter_base_app/src/features/onboarding/data/onboarding_repository.dart'; -import 'package:flutter_starter_base_app/src/features/onboarding/presentation/onboarding_screen.dart'; -import 'package:flutter_starter_base_app/src/routing/go_router_refresh_stream.dart'; -import 'package:flutter_starter_base_app/src/routing/not_found_screen.dart'; -import 'package:flutter_starter_base_app/src/routing/scaffold_with_nested_navigation.dart'; - +import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'app_router.g.dart'; -// private navigators -final _rootNavigatorKey = GlobalKey(); -final _jobsNavigatorKey = GlobalKey(debugLabel: 'jobs'); -final _entriesNavigatorKey = GlobalKey(debugLabel: 'entries'); -final _accountNavigatorKey = GlobalKey(debugLabel: 'account'); +final currentMainRouteIndexProvider = StateProvider((ref) => 0); +final _rootNavigatorKey = GlobalKey(debugLabel: 'root'); +final _shellNavigatorKey = GlobalKey(debugLabel: 'nav'); -enum AppRoute { - onboarding, - signIn, - jobs, - job, - addJob, - editJob, - entry, - addEntry, - editEntry, - entries, - profile, -} +List get bottomNavRoutes => [AppRoute.home, AppRoute.account, AppRoute.reports]; -@riverpod -GoRouter goRouter(GoRouterRef ref) { - // rebuild GoRouter when app startup state changes - final appStartupState = ref.watch(appStartupProvider); - final authRepository = ref.watch(authRepositoryProvider); - return GoRouter( - initialLocation: '/signIn', - navigatorKey: _rootNavigatorKey, - debugLogDiagnostics: true, - redirect: (context, state) { - // If the app is still initializing, show the /startup route - if (appStartupState.isLoading || appStartupState.hasError) { - return '/startup'; - } - final onboardingRepository = - ref.read(onboardingRepositoryProvider).requireValue; - final didCompleteOnboarding = onboardingRepository.isOnboardingComplete(); - final path = state.uri.path; - if (!didCompleteOnboarding) { - // Always check state.subloc before returning a non-null route - // https://github.com/flutter/packages/blob/main/packages/go_router/example/lib/redirection.dart#L78 - if (path != '/onboarding') { - return '/onboarding'; - } - return null; - } - final isLoggedIn = authRepository.currentUser != null; - if (isLoggedIn) { - if (path.startsWith('/startup') || - path.startsWith('/onboarding') || - path.startsWith('/signIn')) { - return '/jobs'; - } - } else { - if (path.startsWith('/startup') || - path.startsWith('/onboarding') || - path.startsWith('/jobs') || - path.startsWith('/entries') || - path.startsWith('/account')) { - return '/signIn'; - } - } - return null; +/// todo meta objects can be serialized +final routes = [ + GoRoute(name: AppRoute.start.name, path: '/${AppRoute.start.name}', builder: (context, state) => const Startup()), + GoRoute( + name: AppRoute.splash.name, path: '/${AppRoute.splash.name}', builder: (context, state) => const SplashView()), + GoRoute(name: AppRoute.signIn.name, path: '/${AppRoute.signIn.name}', builder: (context, state) => const LoginPage()), + GoRoute( + name: AppRoute.checkEULA.name, + path: '/${AppRoute.checkEULA.name}', + builder: (context, state) => const CheckEULA()), + GoRoute( + name: AppRoute.addAccount.name, + path: '/${AppRoute.addAccount.name}', + builder: (context, state) => const AddAccountFLow()), + GoRoute( + name: AppRoute.resetPassword.name, + path: '/${AppRoute.resetPassword.name}', + builder: (context, state) => const ResetPasswordView()), + GoRoute( + name: AppRoute.passwordSuccess.name, + path: '/${AppRoute.passwordSuccess.name}', + builder: (context, state) => const PasswordUpdateSuccessView()), + GoRoute( + name: AppRoute.setupSecreen.name, + path: '/${AppRoute.setupSecreen.name}', + builder: (context, state) => const SetupScreen()), + GoRoute( + name: AppRoute.logoutPageTransition.name, + path: '/${AppRoute.logoutPageTransition.name}', + builder: (context, state) => const LogoutPageTransition()), + GoRoute( + name: AppRoute.loginPageTransition.name, + path: '/${AppRoute.loginPageTransition.name}/:username/:password', + builder: (context, state) => LoginPageTransition( + username: state.pathParameters['username'] ?? '', password: state.pathParameters['password'] ?? '')), + GoRoute( + name: AppRoute.acceptEULA.name, + path: '/${AppRoute.acceptEULA.name}', + builder: (context, state) => EulaView(isCancellable: false, onEULAAccepted: (bool acceptEULA) {})), + GoRoute( + name: AppRoute.eulaTransition.name, + path: '/${AppRoute.eulaTransition.name}', + builder: (context, state) => const EULATransition()), + GoRoute( + name: AppRoute.setupComplete.name, + path: '/${AppRoute.setupComplete.name}', + builder: (context, state) => const SetupCompletePage()), + GoRoute( + name: AppRoute.forgotPassword.name, + path: '/${AppRoute.forgotPassword.name}', + builder: (context, state) => const ForgotPasswordView()), + GoRoute( + name: AppRoute.stateChooser.name, + path: "/${AppRoute.stateChooser.name}", + parentNavigatorKey: _rootNavigatorKey, + builder: (context, state) { + final extras = state.extra as Map; + return StateChooser( + countryName: extras['countryName'] as String, + initialSelection: extras['initialSelection'] as Item?); }, - refreshListenable: GoRouterRefreshStream(authRepository.authStateChanges()), - routes: [ - GoRoute( - path: '/startup', - pageBuilder: (context, state) => NoTransitionPage( - child: AppStartupWidget( - // * This is just a placeholder - // * The loaded route will be managed by GoRouter on state change - onLoaded: (_) => const SizedBox.shrink(), - ), - ), - ), - GoRoute( - path: '/onboarding', - name: AppRoute.onboarding.name, - pageBuilder: (context, state) => const NoTransitionPage( - child: OnboardingScreen(), - ), - ), - GoRoute( - path: '/signIn', - name: AppRoute.signIn.name, - pageBuilder: (context, state) => const NoTransitionPage( - child: CustomSignInScreen(), - ), - ), - // Stateful navigation based on: - // https://github.com/flutter/packages/blob/main/packages/go_router/example/lib/stateful_shell_route.dart - StatefulShellRoute.indexedStack( - pageBuilder: (context, state, navigationShell) => NoTransitionPage( - child: ScaffoldWithNestedNavigation(navigationShell: navigationShell), - ), - branches: [ - StatefulShellBranch( - navigatorKey: _jobsNavigatorKey, - routes: [ - GoRoute( - path: '/jobs', - name: AppRoute.jobs.name, - pageBuilder: (context, state) => const NoTransitionPage( - child: JobsScreen(), - ), - routes: [ - GoRoute( - path: 'add', - name: AppRoute.addJob.name, - parentNavigatorKey: _rootNavigatorKey, - pageBuilder: (context, state) { - return const MaterialPage( - fullscreenDialog: true, - child: EditJobScreen(), - ); - }, - ), - GoRoute( - path: ':id', - name: AppRoute.job.name, - pageBuilder: (context, state) { - final id = state.pathParameters['id']!; - return MaterialPage( - child: JobEntriesScreen(jobId: id), - ); - }, - routes: [ - GoRoute( - path: 'entries/add', - name: AppRoute.addEntry.name, - parentNavigatorKey: _rootNavigatorKey, - pageBuilder: (context, state) { - final jobId = state.pathParameters['id']!; - return MaterialPage( - fullscreenDialog: true, - child: EntryScreen( - jobId: jobId, - ), - ); - }, - ), - GoRoute( - path: 'entries/:eid', - name: AppRoute.entry.name, - pageBuilder: (context, state) { - final jobId = state.pathParameters['id']!; - final entryId = state.pathParameters['eid']!; - final entry = state.extra as Entry?; - return MaterialPage( - child: EntryScreen( - jobId: jobId, - entryId: entryId, - entry: entry, - ), - ); - }, - ), - GoRoute( - path: 'edit', - name: AppRoute.editJob.name, - pageBuilder: (context, state) { - final jobId = state.pathParameters['id']; - final job = state.extra as Job?; - return MaterialPage( - fullscreenDialog: true, - child: EditJobScreen(jobId: jobId, job: job), - ); - }, - ), - ], - ), - ], - ), - ], - ), - StatefulShellBranch( - navigatorKey: _entriesNavigatorKey, + ), + GoRoute( + name: AppRoute.countryChooser.name, + path: "/${AppRoute.countryChooser.name}", + parentNavigatorKey: _rootNavigatorKey, + builder: (context, state) { + final extras = state.extra as Map?; + return CountryChooser(initialSelection: extras?['initialSelection'] as Item?); + }, + ), + ShellRoute( + navigatorKey: _shellNavigatorKey, + builder: (context, state, child) => CustomNavigationBar(child: child), + routes: [ + GoRoute( + name: AppRoute.account.name, + path: '/${AppRoute.account.name}', + builder: (context, state) => const AccountDetailsPage(), routes: [ - GoRoute( - path: '/entries', - name: AppRoute.entries.name, - pageBuilder: (context, state) => const NoTransitionPage( - child: EntriesScreen(), - ), - ), - ], - ), - StatefulShellBranch( - navigatorKey: _accountNavigatorKey, + ]), + GoRoute( + name: AppRoute.reports.name, + path: '/${AppRoute.reports.name}', + builder: (context, state) => const ReportsPage(), routes: [ GoRoute( - path: '/account', - name: AppRoute.profile.name, - pageBuilder: (context, state) => const NoTransitionPage( - child: CustomProfileScreen(), - ), - ), - ], - ), - ], - ), - ], - errorPageBuilder: (context, state) => const NoTransitionPage( - child: NotFoundScreen(), - ), - ); -} + name: AppRoute.reportTable.name, + path: AppRoute.reportTable.name, + builder: (context, state) => ReportTablePage(vin: state.extra as String)), + ]) + ]), +]; + +@riverpod +GoRouter goRouter(GoRouterRef ref) => GoRouter(debugLogDiagnostics: true, navigatorKey: _rootNavigatorKey, initialLocation: '/start', routes: routes); diff --git a/lib/src/routing/app_router.g.dart b/lib/src/routing/app_router.g.dart deleted file mode 100644 index 75aa9be6..00000000 --- a/lib/src/routing/app_router.g.dart +++ /dev/null @@ -1,24 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'app_router.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$goRouterHash() => r'3e0521496632ca0a69f0f6658ba74bff70cd6629'; - -/// See also [goRouter]. -@ProviderFor(goRouter) -final goRouterProvider = AutoDisposeProvider.internal( - goRouter, - name: r'goRouterProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$goRouterHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef GoRouterRef = AutoDisposeProviderRef; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/routing/app_startup.dart b/lib/src/routing/app_startup.dart index 72ea9a64..ed1af1ea 100644 --- a/lib/src/routing/app_startup.dart +++ b/lib/src/routing/app_startup.dart @@ -1,3 +1,4 @@ +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -41,18 +42,17 @@ class AppStartupLoadingWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: const Center( - child: CircularProgressIndicator(), + return const Scaffold( + // appBar: AppBar(), + body: Center( + child: LoadingAnimation(), ), ); } } class AppStartupErrorWidget extends StatelessWidget { - const AppStartupErrorWidget( - {super.key, required this.message, required this.onRetry}); + const AppStartupErrorWidget({super.key, required this.message, required this.onRetry}); final String message; final VoidCallback onRetry; diff --git a/lib/src/routing/app_startup.g.dart b/lib/src/routing/app_startup.g.dart deleted file mode 100644 index b2f72cbe..00000000 --- a/lib/src/routing/app_startup.g.dart +++ /dev/null @@ -1,24 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'app_startup.dart'; - -// ************************************************************************** -// RiverpodGenerator -// ************************************************************************** - -String _$appStartupHash() => r'3bf56eca0f1cd6b6760eb62ce3ffdd5136af96b2'; - -/// See also [appStartup]. -@ProviderFor(appStartup) -final appStartupProvider = FutureProvider.internal( - appStartup, - name: r'appStartupProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') ? null : _$appStartupHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef AppStartupRef = FutureProviderRef; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/src/routing/go_router_refresh_stream.dart b/lib/src/routing/go_router_refresh_stream.dart deleted file mode 100644 index 8c9c433b..00000000 --- a/lib/src/routing/go_router_refresh_stream.dart +++ /dev/null @@ -1,21 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; - -/// This class was imported from the migration guide for GoRouter 5.0 -class GoRouterRefreshStream extends ChangeNotifier { - GoRouterRefreshStream(Stream stream) { - notifyListeners(); - _subscription = stream.asBroadcastStream().listen( - (dynamic _) => notifyListeners(), - ); - } - - late final StreamSubscription _subscription; - - @override - void dispose() { - _subscription.cancel(); - super.dispose(); - } -} diff --git a/lib/src/routing/not_found_screen.dart b/lib/src/routing/not_found_screen.dart deleted file mode 100644 index 823f0ad2..00000000 --- a/lib/src/routing/not_found_screen.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/empty_placeholder_widget.dart'; - -/// Simple not found screen used for 404 errors (page not found on web) -class NotFoundScreen extends StatelessWidget { - const NotFoundScreen({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(), - body: const EmptyPlaceholderWidget( - message: '404 - Page not found!', - ), - ); - } -} diff --git a/lib/src/routing/routes.dart b/lib/src/routing/routes.dart new file mode 100644 index 00000000..4b7c87af --- /dev/null +++ b/lib/src/routing/routes.dart @@ -0,0 +1,46 @@ +enum AppRoute { + start, + onboarding, + signIn, + profile, + account, + home, + reports, + schedule, + scheduleSetup, + alerts, + chargerAlerts, + vehicleAlerts, + vinPage, + dtcPage, + splash, + chargerDetails, + addCharger, + addVehicle, + addHousehold, + addAccount, + acceptEULA, + checkEULA, + eulaTransition, + vehicleDetails, + householdDetails, + setupSecreen, + setupComplete, + loginPageTransition, + logoutPageTransition, + reportTable, + reportVehicleSelect, + reportTimeWindowSelect, + breakPointSelect, + forgotPassword, + resetPassword, + passwordSuccess, + vehicleIconSelector, + manualSchedulePage, + stateChooser, + countryChooser, + pricingMethodChooser, + utilityChooser, + rateProgramChooser, + rateChooser, +} diff --git a/lib/src/routing/scaffold_with_nested_navigation.dart b/lib/src/routing/scaffold_with_nested_navigation.dart deleted file mode 100644 index 5e5290d5..00000000 --- a/lib/src/routing/scaffold_with_nested_navigation.dart +++ /dev/null @@ -1,134 +0,0 @@ -// ignore_for_file: public_member_api_docs, sort_constructors_first -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - -import 'package:flutter_starter_base_app/src/localization/string_hardcoded.dart'; - -// Stateful navigation based on: -// https://github.com/flutter/packages/blob/main/packages/go_router/example/lib/stateful_shell_route.dart -class ScaffoldWithNestedNavigation extends StatelessWidget { - const ScaffoldWithNestedNavigation({ - Key? key, - required this.navigationShell, - }) : super(key: key ?? const ValueKey('ScaffoldWithNestedNavigation')); - final StatefulNavigationShell navigationShell; - - void _goBranch(int index) { - navigationShell.goBranch( - index, - // A common pattern when using bottom navigation bars is to support - // navigating to the initial location when tapping the item that is - // already active. This example demonstrates how to support this behavior, - // using the initialLocation parameter of goBranch. - initialLocation: index == navigationShell.currentIndex, - ); - } - - @override - Widget build(BuildContext context) { - final size = MediaQuery.sizeOf(context); - if (size.width < 450) { - return ScaffoldWithNavigationBar( - body: navigationShell, - currentIndex: navigationShell.currentIndex, - onDestinationSelected: _goBranch, - ); - } else { - return ScaffoldWithNavigationRail( - body: navigationShell, - currentIndex: navigationShell.currentIndex, - onDestinationSelected: _goBranch, - ); - } - } -} - -class ScaffoldWithNavigationBar extends StatelessWidget { - const ScaffoldWithNavigationBar({ - super.key, - required this.body, - required this.currentIndex, - required this.onDestinationSelected, - }); - final Widget body; - final int currentIndex; - final ValueChanged onDestinationSelected; - - @override - Widget build(BuildContext context) { - return Scaffold( - body: body, - bottomNavigationBar: NavigationBar( - selectedIndex: currentIndex, - destinations: [ - // products - NavigationDestination( - icon: const Icon(Icons.work_outline), - selectedIcon: const Icon(Icons.work), - label: 'Jobs'.hardcoded, - ), - NavigationDestination( - icon: const Icon(Icons.view_headline_outlined), - selectedIcon: const Icon(Icons.view_headline), - label: 'Entries'.hardcoded, - ), - NavigationDestination( - icon: const Icon(Icons.person_outline), - selectedIcon: const Icon(Icons.person), - label: 'Account'.hardcoded, - ), - ], - onDestinationSelected: onDestinationSelected, - ), - ); - } -} - -class ScaffoldWithNavigationRail extends StatelessWidget { - const ScaffoldWithNavigationRail({ - super.key, - required this.body, - required this.currentIndex, - required this.onDestinationSelected, - }); - final Widget body; - final int currentIndex; - final ValueChanged onDestinationSelected; - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Row( - children: [ - NavigationRail( - selectedIndex: currentIndex, - onDestinationSelected: onDestinationSelected, - labelType: NavigationRailLabelType.all, - destinations: [ - NavigationRailDestination( - icon: const Icon(Icons.work_outline), - selectedIcon: const Icon(Icons.work), - label: Text('Jobs'.hardcoded), - ), - NavigationRailDestination( - icon: const Icon(Icons.view_headline_outlined), - selectedIcon: const Icon(Icons.view_headline), - label: Text('Entries'.hardcoded), - ), - NavigationRailDestination( - icon: const Icon(Icons.person_outline), - selectedIcon: const Icon(Icons.person), - label: Text('Account'.hardcoded), - ), - ], - ), - const VerticalDivider(thickness: 1, width: 1), - // This is the main content. - Expanded( - child: body, - ), - ], - ), - ); - } -} diff --git a/lib/src/setup_screen.dart b/lib/src/setup_screen.dart new file mode 100644 index 00000000..e70c0e6b --- /dev/null +++ b/lib/src/setup_screen.dart @@ -0,0 +1,113 @@ +import 'package:flutter_starter_base_app/src/common_widgets/action_text_button.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class SetupScreen extends StatefulWidget { + const SetupScreen({super.key}); + + @override + SetupScreenState createState() => SetupScreenState(); +} + +class SetupScreenState extends State { + int _completedStep = -1; + + @override + void initState() { + super.initState(); + _loadCompletedStep(); + } + + Future _loadCompletedStep() async { + _completedStep = (await SharedPreferences.getInstance()).getInt('completedStep') ?? -1; + setState(() {}); + } + + Future _saveCompletedStep(int step) async => + (await SharedPreferences.getInstance()).setInt('completedStep', step); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + titleWidget: Text(LocaleKeys.oob_setup.tr()), + showHamburgerMenu: false, + ), + body: Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Text(LocaleKeys.oob_setupGuideline.tr(), + style: TextStyle(fontSize: 18, color: CustomColors().whitecolor), textAlign: TextAlign.center)), + const SizedBox(height: 20), + _buildSetupBox(0, LocaleKeys.account_wizard_title.tr(), LocaleKeys.oob_accountWizDesc.tr()), + const SizedBox(height: 10), + _buildSetupBox(1, LocaleKeys.charger_wizard_addChargerTitle.tr(), LocaleKeys.oob_chargerWizDesc.tr()), + const SizedBox(height: 10), + _buildSetupBox(2, LocaleKeys.vehicle_wizard_addVehicleTitle.tr(), LocaleKeys.oob_vehicleWizDesc.tr()), + const Spacer(), + Center( + child: ActionTextButton( + text: LocaleKeys.common_cancel.tr(), onPressed: () => context.goNamed(AppRoute.splash.name))) + ]))); + } + + Widget _buildSetupBox(int index, String title, String subtitle) { + bool isCompleted = index <= _completedStep; + bool isNextStep = index == _completedStep + 1; + Color boxColor; + Color textColor; + IconData icon; + + if (isCompleted) { + boxColor = CustomColors().reportByButtonBG; + textColor = CustomColors().setUpText; + icon = Icons.check; + } else if (isNextStep) { + boxColor = CustomColors().primaryTextColor; + textColor = CustomColors().secondaryButtonTextColor; + icon = Icons.arrow_forward; + } else { + boxColor = CustomColors().lightGrayColor; + textColor = CustomColors().secondaryDark; + icon = Icons.arrow_forward; + } + + return GestureDetector( + onTap: () async { + dynamic result; + switch (index) { + case 0: + result = await context.pushNamed(AppRoute.addAccount.name); + case 1: + result = await context.pushNamed(AppRoute.addCharger.name); + case 2: + result = await context.pushNamed(AppRoute.addVehicle.name); + } + + if (result == true) { + setState(() => _completedStep = index); + _saveCompletedStep(index); + if (index == 2 && mounted) context.pushReplacementNamed(AppRoute.setupComplete.name); + } + }, + child: Container( + padding: const EdgeInsets.all(16.0), + decoration: BoxDecoration(color: boxColor), + child: Row(children: [ + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text(title, style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: textColor)), + const SizedBox(height: 4), + Text(subtitle, style: TextStyle(fontSize: 14, color: textColor)) + ]), + const Spacer(), + Icon(icon, color: textColor, size: 30) + ]))); + } +} diff --git a/lib/src/setup_success_page.dart b/lib/src/setup_success_page.dart new file mode 100644 index 00000000..1c98dec7 --- /dev/null +++ b/lib/src/setup_success_page.dart @@ -0,0 +1,38 @@ +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; +import 'package:flutter_starter_base_app/src/routing/routes.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; + +class SetupCompletePage extends StatelessWidget { + const SetupCompletePage({super.key}); + + @override + Widget build(BuildContext context) => Scaffold( + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: 18), + Text('Setup', + style: TextStyle(fontSize: 34, fontWeight: FontWeight.w400, color: CustomColors().whitecolor), + textAlign: TextAlign.center), + const SizedBox(height: 16), + Text('Congratulations!', + style: TextStyle(fontSize: 28, fontWeight: FontWeight.w400, color: CustomColors().whitecolor), + textAlign: TextAlign.center), + const SizedBox(height: 16), + Image.asset('assets/group.png'), + const SizedBox(height: 16), + Text('Your initial setup is complete.', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.w400, color: CustomColors().whitecolor), + textAlign: TextAlign.center), + const Spacer(), + PrimaryButton( + text: 'Go To App Home', + backgroundColor: CustomColors().lightblueColor, + onPressed: () => context.goNamed(AppRoute.home.name)) + ]))); +} diff --git a/lib/src/utils/alert_dialogs.dart b/lib/src/utils/alert_dialogs.dart index 6c26926c..7c6b3482 100644 --- a/lib/src/utils/alert_dialogs.dart +++ b/lib/src/utils/alert_dialogs.dart @@ -2,11 +2,14 @@ library alert_dialogs; import 'dart:io'; +import 'package:flutter_starter_base_app/src/constants/theme_data.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/services.dart'; +import 'package:go_router/go_router.dart'; part 'show_alert_dialog.dart'; part 'show_exception_alert_dialog.dart'; +part 'package:flutter_starter_base_app/src/common_widgets/confirmation_dialog.dart'; +part 'package:flutter_starter_base_app/src/common_widgets/info_text_dialog.dart'; diff --git a/lib/src/utils/authentication_handler.dart b/lib/src/utils/authentication_handler.dart new file mode 100644 index 00000000..1d08be82 --- /dev/null +++ b/lib/src/utils/authentication_handler.dart @@ -0,0 +1,31 @@ +import 'package:jwt_decode/jwt_decode.dart'; +import 'package:flutter_starter_base_app/src/api/api.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class AuthenticationHandler { + final _usernameKey = 'username'; + final _accessTokenKey = 'access_token'; + final _refreshTokenKey = 'refresh_token'; + final _storage = const FlutterSecureStorage(); + Future clearTokens() async => await _storage.deleteAll(); + Future getUsername() async => await _storage.read(key: _usernameKey); + Future getAccessToken() async => await _storage.read(key: _accessTokenKey); + Future getRefreshToken() async => await _storage.read(key: _refreshTokenKey); + Future saveUsername(String username) async => await _storage.write(key: _usernameKey, value: username); + Future saveTokens(String accessToken, String refreshToken) async => await _storage + .write(key: _accessTokenKey, value: accessToken) + .then((_) async => await _storage.write(key: _refreshTokenKey, value: refreshToken)); + Future isTokenExpired() async { + String? tokenOrNull = await getAccessToken(); + if (tokenOrNull == null || tokenOrNull.isEmpty) return true; + DateTime? expiryDateOrNull = Jwt.getExpiryDate(tokenOrNull); + if (expiryDateOrNull == null) return true; + return DateTime.now().toUtc().isAfter(expiryDateOrNull); + } + + Future canAuthenticateUser() async => await isTokenExpired() + ? (await getUsername()) == null || (await getRefreshToken() == null) + ? false + : await API().refreshToken() + : true; +} diff --git a/lib/src/utils/bar_view_calculator.dart b/lib/src/utils/bar_view_calculator.dart new file mode 100644 index 00000000..204636fc --- /dev/null +++ b/lib/src/utils/bar_view_calculator.dart @@ -0,0 +1,21 @@ +class BarViewCalculator { + late double maximum; + late double minimum; + final List values; + + BarViewCalculator({required this.values}) { + minimum = (values.reduce((curr, next) => curr < next ? curr : next)) * .19; + maximum = (values.reduce((curr, next) => curr > next ? curr : next)) * 1.2; + } + List calculateMarkings() => maximum == minimum + ? List.generate(5, (_) => '') + : List.generate(6, (i) => minimum + i * (maximum - minimum) / 5) + .map((e) => e.toStringAsFixed(2)) + .skip(1) + .toList(); + double calculateFlexValue(double x) => maximum == 0 + ? maximum + : maximum == minimum + ? x / maximum + : (x - minimum) / (maximum - minimum); +} diff --git a/lib/src/utils/error_handler.dart b/lib/src/utils/error_handler.dart new file mode 100644 index 00000000..d2f97ce7 --- /dev/null +++ b/lib/src/utils/error_handler.dart @@ -0,0 +1,28 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter_starter_base_app/src/localization/string_hardcoded.dart'; + +// * Register error handlers. For more info, see: +// * https://docs.flutter.dev/testing/errors +void registerErrorHandlers() { + // * Show some error UI if any uncaught exception happens + FlutterError.onError = (FlutterErrorDetails details) { + FlutterError.presentError(details); + debugPrint(details.toString()); + }; + // * Handle errors from the underlying platform/OS + PlatformDispatcher.instance.onError = (Object error, StackTrace stack) { + debugPrint(error.toString()); + return true; + }; + // * Show some error UI when any widget in the app fails to build + ErrorWidget.builder = (FlutterErrorDetails details) { + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.red, + title: Text('An error occurred'.hardcoded), + ), + body: Center(child: Text(details.toString())), + ); + }; +} diff --git a/lib/src/utils/feature_constraints.dart b/lib/src/utils/feature_constraints.dart new file mode 100644 index 00000000..ecf0d4a5 --- /dev/null +++ b/lib/src/utils/feature_constraints.dart @@ -0,0 +1,102 @@ +import 'package:flutter_starter_base_app/src/features/account/data/account_provider.dart'; +import 'package:flutter_starter_base_app/src/features/household/domain/providers.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +enum FeatureType { + household, + charger, + vehicle, +} + +class FeatureConstraints { + // households threshold + final int _maxHouseholds = 6; + + // chargers threshold + final int _maxChargersPerHousehold = 3; + + // vehicles threshold + final int _maxVehiclesPerAccount = 6; + + Future canCreateFeature(WidgetRef ref, + {required FeatureType featureType, String? householdId, bool overrideThreshold = false}) async { + switch (featureType) { + case FeatureType.household: + return await _canCreateHousehold(ref, overrideThreshold); + case FeatureType.charger: + return await _canCreateCharger(ref, overrideThreshold, householdId: householdId); + case FeatureType.vehicle: + return await _canCreateVehicle(ref, overrideThreshold); + } + } + + Future _canCreateHousehold(WidgetRef ref, bool overrideThreshold) async { + try { + if (overrideThreshold) { + return true; + } else{ + final accountDetails = await ref.watch(fetchAccountDetailsProvider.future); + debugPrint("Total households in the account: ${accountDetails.households?.length}"); + return (accountDetails.households?.length ?? 0) < _maxHouseholds; + } + } catch (e) { + debugPrint(e.toString()); + } + throw Exception("Failed to fetch households list to validate"); + } + + Future _canCreateCharger(WidgetRef ref, bool overrideThreshold, {String? householdId}) async { + try { + if (overrideThreshold) { + return true; + } else { + final chargersList = await ref.watch(fetchHouseholdChargerListProvider.call(householdId: householdId ?? '').future); + debugPrint("Total chargers in the household: ${chargersList.length}"); + return chargersList.length < _maxChargersPerHousehold; + } + } catch (e) { + debugPrint(e.toString()); + } + + throw Exception("Failed to fetch chargers list to validate"); + } + + Future _canCreateVehicle(WidgetRef ref, bool overrideThreshold) async { + try { + if (overrideThreshold) { + return true; + } else { + final accountDetails = await ref.watch(fetchAccountDetailsProvider.future); + debugPrint("Total vehicles in the account: ${accountDetails.vehicles?.length}"); + return (accountDetails.vehicles?.length ?? 0) < _maxVehiclesPerAccount; + } + } catch (e) { + debugPrint(e.toString()); + } + + throw Exception("Failed to fetch vehicles list to validate"); + } + + int getFeatureThreshold(FeatureType featureType) { + switch (featureType) { + case FeatureType.household: + return _maxHouseholds; + case FeatureType.charger: + return _maxChargersPerHousehold; + case FeatureType.vehicle: + return _maxVehiclesPerAccount; + } + } + + Future canDeleteHousehold(WidgetRef ref, String householdId) async { + try { + final chargersList = await ref.watch(fetchHouseholdChargerListProvider.call(householdId: householdId).future); + debugPrint("Total chargers in the household: ${chargersList.length}"); + return chargersList.isNotEmpty; + } catch (e) { + debugPrint(e.toString()); + } + throw Exception("Failed to fetch chargers list"); + } +} diff --git a/lib/src/utils/format.dart b/lib/src/utils/format.dart index ff3371af..1ce200e4 100644 --- a/lib/src/utils/format.dart +++ b/lib/src/utils/format.dart @@ -1,4 +1,5 @@ -import 'package:intl/intl.dart'; +import 'dart:ui'; +import 'package:easy_localization/easy_localization.dart'; class Format { static String hours(double hours) { @@ -12,6 +13,9 @@ class Format { return DateFormat.yMMMd().format(date); } + static String formatForTable(DateTime datetime) => + '${DateFormat.Md(PlatformDispatcher.instance.locale.toStringWithSeparator()).format(datetime)} ${DateFormat.jm(PlatformDispatcher.instance.locale.toStringWithSeparator()).format(datetime)}'; + static String dayOfWeek(DateTime date) { return DateFormat.E().format(date); } @@ -23,4 +27,6 @@ class Format { } return ''; } + + static String formatForSchedule(String time) => DateFormat("h a").format(DateFormat("HH:mm:ss").parse(time)); } diff --git a/lib/src/utils/show_alert_dialog.dart b/lib/src/utils/show_alert_dialog.dart index f60d571d..25eb962a 100644 --- a/lib/src/utils/show_alert_dialog.dart +++ b/lib/src/utils/show_alert_dialog.dart @@ -15,14 +15,8 @@ Future showAlertDialog({ content: content != null ? Text(content) : null, actions: [ if (cancelActionText != null) - TextButton( - child: Text(cancelActionText), - onPressed: () => Navigator.of(context).pop(false), - ), - TextButton( - child: Text(defaultActionText), - onPressed: () => Navigator.of(context).pop(true), - ), + TextButton(child: Text(cancelActionText), onPressed: () => context.canPop() ? context.pop(false) : null), + TextButton(child: Text(defaultActionText), onPressed: () => context.canPop() ? context.pop(true) : null), ], ), ); @@ -35,13 +29,9 @@ Future showAlertDialog({ actions: [ if (cancelActionText != null) CupertinoDialogAction( - child: Text(cancelActionText), - onPressed: () => Navigator.of(context).pop(false), - ), + child: Text(cancelActionText), onPressed: () => context.canPop() ? context.pop(false) : null), CupertinoDialogAction( - child: Text(defaultActionText), - onPressed: () => Navigator.of(context).pop(true), - ), + child: Text(defaultActionText), onPressed: () => context.canPop() ? context.pop(true) : null) ], ), ); diff --git a/lib/src/utils/show_exception_alert_dialog.dart b/lib/src/utils/show_exception_alert_dialog.dart index 515010f4..ecddac28 100644 --- a/lib/src/utils/show_exception_alert_dialog.dart +++ b/lib/src/utils/show_exception_alert_dialog.dart @@ -13,9 +13,6 @@ Future showExceptionAlertDialog({ ); String _message(dynamic exception) { - if (exception is FirebaseException) { - return exception.message ?? exception.toString(); - } if (exception is PlatformException) { return exception.message ?? exception.toString(); } diff --git a/lib/src/utils/string_extension.dart b/lib/src/utils/string_extension.dart new file mode 100644 index 00000000..c7182b87 --- /dev/null +++ b/lib/src/utils/string_extension.dart @@ -0,0 +1,22 @@ +extension StringExtension on String { + String capitalize() { + return "${this[0].toUpperCase()}${substring(1).toLowerCase()}"; + } + + String camelCaseToTitleCase() { + if (isEmpty) return ''; + String titleCase = this[0].toUpperCase(); + for (int i = 1; i < length; i++) { + if (this[i].toUpperCase() == this[i] && !this[i].startsWith(RegExp(r'[0-9]'))) { + titleCase += ' ${this[i]}'; + } else { + if (this[i].startsWith(RegExp(r'[0-9]')) && i - 1 >= 0 && !this[i - 1].startsWith(RegExp(r'[0-9]'))) { + titleCase += ' ${this[i]}'; + } else { + titleCase += this[i]; + } + } + } + return titleCase; + } +} diff --git a/lib/src/utils/translation_storage.dart b/lib/src/utils/translation_storage.dart new file mode 100644 index 00000000..43bab36a --- /dev/null +++ b/lib/src/utils/translation_storage.dart @@ -0,0 +1,32 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:path_provider/path_provider.dart'; + +class TranslationStorage { + final Locale locale; + static const int _cacheExpirationHours = 24; + TranslationStorage({required this.locale}); + Future get localizedFilePath async => (await getApplicationDocumentsDirectory()).path; + Future get _localizedFile async => File('${await localizedFilePath}/${locale.languageCode}-${locale.countryCode}.json'); + + Future readTranslationFile() async { + try { + return await (await _localizedFile).readAsString(); + } catch (e) { + //todo + } + throw Exception('Failed to read localized values'); + } + + Future writeTranslationFile(String translationJson) async { + try { + return (await _localizedFile).writeAsString(translationJson); + } catch (e) { + // todo + } + throw Exception('Failed to write localized values'); + } + + Future isFileOutdated(File file) async => + !await file.exists() || DateTime.now().difference((await file.stat()).modified).inHours >= _cacheExpirationHours; +} diff --git a/lib/src/utils/vin_check.dart b/lib/src/utils/vin_check.dart new file mode 100644 index 00000000..59af4b42 --- /dev/null +++ b/lib/src/utils/vin_check.dart @@ -0,0 +1,57 @@ +/// todo check +bool isValidVIN(String vin) { + vin = vin.replaceAll(RegExp(r'\s'), '').toUpperCase(); + if (vin.length != 17) return false; + + // Define weights for VIN characters + final Map weights = { + 'A': 1, + 'B': 2, + 'C': 3, + 'D': 4, + 'E': 5, + 'F': 6, + 'G': 7, + 'H': 8, + 'J': 1, + 'K': 2, + 'L': 3, + 'M': 4, + 'N': 5, + 'P': 7, + 'R': 9, + 'S': 2, + 'T': 3, + 'U': 4, + 'V': 5, + 'W': 6, + 'X': 7, + 'Y': 8, + 'Z': 9, + '1': 1, + '2': 2, + '3': 3, + '4': 4, + '5': 5, + '6': 6, + '7': 7, + '8': 8, + '9': 9, + '0': 0, + }; + + // Define the positions of the weights in the VIN + final List positions = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2]; + + int sum = 0; + for (int i = 0; i < 17; i++) { + String char = vin[i]; + if (!weights.containsKey(char)) return false; + sum += ((weights[char] ?? 0) * positions[i]); + } + + // Check digit + int checkDigit = sum % 11; + if (checkDigit == 10) return vin[8] == 'X'; + return checkDigit == int.parse(vin[8]); +} diff --git a/mock/countries.json b/mock/countries.json new file mode 100644 index 00000000..8f9a34ac --- /dev/null +++ b/mock/countries.json @@ -0,0 +1,48 @@ +{ + "status": "success", + "message": "Countries retrieved successfully!", + "data": { + "countries": [ + { + "name": "United States", + "code": "US", + "telephoneCode": "+1" + }, + { + "name": "Canada", + "code": "CA", + "telephoneCode": "+1" + }, + { + "name": "United Kingdom", + "code": "UK", + "telephoneCode": "+44" + }, + { + "name": "Germany", + "code": "DE", + "telephoneCode": "+49" + }, + { + "name": "France", + "code": "FR", + "telephoneCode": "+33" + }, + { + "name": "Australia", + "code": "AU", + "telephoneCode": "+61" + }, + { + "name": "Japan", + "code": "JP", + "telephoneCode": "+81" + }, + { + "name": "China", + "code": "CN", + "telephoneCode": "+86" + } + ] + } +} \ No newline at end of file diff --git a/mock/en-US.json b/mock/en-US.json new file mode 100644 index 00000000..e0b59d79 --- /dev/null +++ b/mock/en-US.json @@ -0,0 +1,459 @@ +{ + "status": "success", + "message": "Loaclization values retrieved successfully", + "data": { + "common": { + "name": "Name", + "home": "Home", + "schedule": "Schedule", + "account": "Account", + "reports": "Reports", + "alerts": "Alerts", + "details": "Details", + "start": "Start", + "set": "Set", + "select": "Select", + "next": "Next", + "finish": "Finish", + "cancel": "Cancel", + "back": "Back", + "time": "Time", + "distance": "Distance", + "duration": "Duration", + "cost": "Cost", + "used": "Used", + "remove": "Remove", + "centerQR": "Center QR Code in camera view", + "username": "Username", + "password": "Password", + "vehicle": "Vehicle", + "charger": "Charger", + "add": "Add", + "selected":"Selected" , + "unknonwn": "Unknown" + }, + "btn": { + "ok": "OK", + "getStarted": "Get Started", + "exitSetup": "Exit Setup", + "haveAccount": "Already have an account?", + "tryAgain": "Try Again", + "login": "Log In", + "loggingIn": "Logging In...", + "logout": "Logout", + "forgotPassword": "Forgot Password", + "resetPassword": "Reset Password", + "updatePassword": "Update Password", + "acceptEula": "I have read and accept the EULA", + "tryAnotherSsid": "Try Another SSID", + "openCamera": "Open Camera", + "addVehicleWDongle": "Add Vehicle with Dongle", + "removeVehicle": "Remove Vehicle", + "removeDongle": "Remove Dongle", + "removeCharger": "Remove Charger", + "removeHousehold":"Remove Household", + "changeIcon": "Change Icon", + "addHousehold": "Add Household", + "support": "Support", + "accessaries": "Accessories", + "appHome": "Go To App Home", + "scanQRCode": "Scan QR Code", + "orScanQRCode": "Or Scan QR Code", + "tryAnotherWayToConnect": "Try Another Way To Connect", + "confirm": "Confirm", + "goBack": "Go Back", + "selectDiffNetwork": "Select A Different Network", + "loginPage": "Go to Log In Page" + }, + "hint": { + "choose": "Choose", + "enter": "Enter", + "vehicleName": "Enter Vehicle Name", + "nameYourCharger": "Name Your Charger", + "customRates":"Set Custom Rates", + "optional": "Optional", + "phoneNumber": "Enter Phone Number", + "email": "Enter Email", + "emailOrUsername": "Enter Email or Username", + "password": "Enter Password", + "address": "Enter Address", + "address2": "Address 2 (optional)", + "city": "Enter City", + "zipCode": "Enter Zip Code" + }, + "validation": { + "textfield": { + "username": "Enter username", + "validUsername": "Enter a valid username", + "password": "Enter a password", + "validPassword": "Enter a valid password", + "confPassword": "Entered password doesn't match", + "verificationCode": "Enter verification code", + "validVerificationCode": "Enter a valid verification code", + "chargerName": "Enter a name for your charger", + "validChargerName": "Enter a valid name for your charger", + "vehicleName": "Enter vehicle name", + "validVehicleName": "Enter a valid name for your vehicle", + "householdName": "Enter a valid household name", + "streetAddress": "Enter a valid street address", + "city": "Enter a valid city", + "zipCode": "Enter a valid zip code", + "email": "Enter your email", + "validEmail": "Enter a valid email ID", + "phone": "Enter your phone number", + "validPhone": "Enter a valid phone number", + "lowMilesThreshold": "Enter a valid low miles threshold", + "arrivalAlertTime": "Enter valid time in seconds", + "minimumMilesThreshold": "Enter valid Minimum miles Threshold", + "maxChargeCost": "Enter a maximum charge cost", + "validMaxChargeCost": "Enter a valid maximum charge cost" + }, + "field": { + "breakerSize": "Select a Breaker Size", + "maxChargeCurrent": "Select a Max charge Current", + "reportingUnits": "Select reporting units", + "state": "Select a valid state", + "country": "Select a valid country", + "method": "Select a valid Pricing Method", + "utility": "Select a valid Utility", + "rateProgram": "Select a valid Rate Program", + "rate": "Enter valid rates", + "alertTime": "Please enter a valid alert time" + } + }, + "status": { + "charging": "Charging", + "idle": "Idle", + "pluggedIn": "Plugged in", + "finishedCharging": "Finished Charging", + "scheduled": "Scheduled", + "chargingError": "Charging Error" + }, + + "signalStrength": { + "strong": "Strong", + "moderate": "Moderate", + "weak": "Weak" + }, + + "connectionStatus": { + "connected": "Connected", + "disconnected": "Disconnected" + + }, + + "oob": { + "setup": "Setup", + "setupGuideline": "Follow the guided steps, below, to set up and start using your new charger.", + "accountWizDesc": "Set up address, contact and utility pricing", + "chargerWizDesc": "Install and configure your charger", + "vehicleWizDesc": "Connect dongle and configure your vehicle", + "setupComplete": "Your initial setup is complete", + "congratulations": "Congratulations" + }, + "dialog": { + "exitSetup": "Are you sure you want to exit setup?", + "resourceRemovalDesc": "This {resource} will be removed from your account.", + "removalConfirmation": "{resource} removed from your account" + }, + "charger": { + "wizard": { + "addChargerTitle": "Add Charger", + "pluginYourCharger": "Plug In Your Charger", + "configureCharger": "Configure Charger", + "pluginYourChargerDesc": "Once your charger is plugged in and the red, wifi light is on, you are ready to add it to your account.", + "connectYourCharger": "Connect Your Charger", + "bluetoothConnectionDesc": "Stand close to your charger and use the number on the side to select it from this list of available Bluetooth devices: ", + "bluetoothDevices": "Bluetooth Devices", + "connectYourChargerDesc": "Use your camera to scan the QR code on the size of your charger.", + "wifiSetup": "Set Up Charger WiFi", + "wifiSelectionDesc": "Select a WiFi connection for your charger", + "wifiNetworks": "Networks", + "wifiPasswordTitle": "WiFi Password for {name}", + "confirmConnection": "Confirm Charger Connection", + "confirmConnectionDesc": "The charger WiFi LED will blink Blue when connected to the Internet.", + "connecting": "Charger connecting to WiFi...", + "connected": "Charger Connected", + "failed": "Could not connect charger!" + }, + "startCharging": "Start Charging", + "stopCharging": "Stop Charging", + "scheduledStart": "Scheduled Start", + "scheduleCharging": "Schedule Charging", + "chargeRate": "Charge Rate", + "estChargeTime": "Est. Charge Time", + "estChargeCost": "Est. Charge Cost", + "completeBy": "Complete By", + "info": "Information", + "status": "Status", + "connectedVehicle": "Connected Vehicle", + "breakerSize": "Breaker Size", + "maxChargeCurrent": "Max Charge Current", + "modelNumber": "Model Number", + "serialNumber": "Serial Number", + "softwareVersion": "Software Version", + "panelLedLighting": "Panel LED Lighting", + "wifiSec": "WiFi Settings", + "wifi": { + "ssid": "SSID", + "mac": "MAC", + "connectionStatus": "Connection Status", + "signalStrength": "Signal Strength", + "rssi": "RSSI", + "ipAddress": "IP Address", + "lastContact": "Last Contact" + }, + "authSec": "Authorization", + "auth": { + "none": "None", + "always": "Ask every time", + "devicePresent": "When authorized device present" + }, + "specialOpsSec": "Special Operations", + "manageAlerts": "Manage Device Alerts", + "reboot": "Reboot Charger", + "factoryReset": "Restore Factory Defaults", + "resetFault": "Reset Charger Fault Error" + }, + "schedule": { + "options": "Schedule Options", + "custom": "Custom Schedule", + "onAllDay": "On All Day", + "scheduledCharging": "Scheduled Charging", + "smart": "Smart Schedule", + "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", + "selectHours": "Select the hours when charging is available", + "timeSelection": { + "ampm": "Charging will be available from {morningSession} and {eveningSession}. Please note all hours are in the charger's time zone.", + "am": "Charging will be available from {morningSession}. Please note all hours are in the charger's time zone.", + "pm": "Charging will be available from {eveningSession}. Please note all hours are in the charger's time zone.", + "none": "No charging hours available. Please configure your schedule." + } + }, + + "account": { + "phoneNumber": "Phone Number", + "email": "Email", + "wizard": { + "title": "Create Account", + "welcomeDesc": "Create your account with your home address and select your utility information.", + "createCredentialsDesc": "Create Your Username and Password", + "contactInformationDesc": "Default Contact Information" + }, + "reset": { + "resetPassSuccess":"Reset Password Success", + "forgotPassDesc": "Enter the username for your Danlaw account", + "checkYourEmailDesc": "Please check your email for a message from us with a code to reset your password.", + "resetPassSuccessDesc": "Your password was updated. Please log in with your new password" + }, + "confPassword": "Confirm Password", + "verification": "Verification Code" + }, + "household": { + "title": "Household", + "wizard": { + "title": "Create Household", + "nameYourHouseholdDesc": "Name your Household", + "householdAddressDesc": "Create Your Charger Household Address", + "useMyLocation": "Use my current location", + "pricingMethodDesc": "Select Charge Pricing Method", + "utilityCompanyDesc": "Select Utility Company", + "rateProgramDesc": "Select Rate Program", + "customRatesDesc": "Select Custom Rates", + "customRates": { + "subTitle": "Enter the rates per kWh for these standard rate times", + "weekdayDaytime": "Weekday Daytime Rate", + "weekdayNighttime": "Weekday Nighttime Rate", + "weekendRate": "Weekend Rate" + } + }, + "address": "Address", + "electricityPricing": "Electricity Pricing", + "chargers": "Chargers", + "streetAddress1": "Street Address 1", + "streetAddress2": "Street Address 2", + "city": "City", + "state": "State", + "zipCode": "Zip Code", + "country": "Country", + "pricingMethod": { + "short": "Method", + "long": "Pricing Method", + "chargerEstCost": "Charger Estimates Costs", + "utilityRates": "Utility company-based", + "manual": "Manual" + }, + "utility": "Utility", + "rateProgram": "Rate Program", + "rate": "Rate" + }, + "vehicle": { + "title": "Vehicle", + "wizard": { + "addVehicleTitle": "Add Vehicle", + "addDongle": "Add Dongle", + "connectDongle": "Connect Your Dongle", + "dongleDesc": "Locate the dongle you want to assign to your account", + "vehicleIconDesc": "Choose An Icon For Your Vehicle", + "scanDongleQR": "Scan Dongle QR Code", + "scanDongleQRDesc": "Use your camera to scan the QR code on the dongle.", + "installDongle": "Install Dongle", + "installDongleInVehicle": "Install dongle in your vehicle", + "installDongleInfo": "Once the dongle is plugged into your vehicle the app will confirm your connection.", + "noDongleFound": "No Dongle Found", + "installDongleLEDConf": "Make sure the LED on the dongle lights up. If not, please turn your vehicle on.", + "verifyingComms": "Verifying Communications", + "primaryUserInfo": "Enter Primary User Information", + "contactPhone": "Contact Phone", + "contactEmail": "Contact Email" + }, + "nameVehicle": "Name Your Vehicle", + "lastVehicleInfo": "Last Vehicle Attached Information", + "status": "Status", + "vin": "Vin", + "year": "Year", + "make": "Make", + "model": "Model", + "battery": "Battery", + "stateOfCharge": "State of Charge", + "batteryLife": "Battery Life", + "estMilesAvailable": "Estimated Miles Available", + "failureCodes": "Failure Codes", + "diagnosticsCodes": "Diagnostic Trouble Codes", + "dongleInfo": "Dongle Information", + "dongleId": "Dongle Id", + "lastConnected": "Last Connected", + "alerts": "Alerts", + "manageAlerts": "Manage Vehicle Alerts", + "ass": { + "title": "Active Safety System", + "abs": "Anti-lock Braking System (ABS)", + "esc": "Electronic Stability Control (ESC)", + "tc": "Traction Control", + "tpms": "Tire Pressure Monitory System Type (TPMS)", + "note": "Active Safety System Note" + }, + "eng": { + "title": "Engine", + "numCylinders": "Engine Number of Cylinders", + "displacementCC": "Displacement (CC)", + "displacementCI": "Displacement (CI)", + "displacementL": "Displacement (L)", + "engineModel": "Engine Model" + }, + "body": { + "title": "Exterior/Body", + "bodyClass": "Body Class", + "doors": "Doors", + "windows": "Windows" + } + }, + "reports": { + "vehicleEnergyReport": "Vehicle Energy Report", + "tw": { + "title": "Time Window", + "past31": "Past 31 Days", + "week": "This Week", + "month": "This Month", + "year": "This year" + }, + "info": { + "barSelection": "Select a bar segment to see more details" + }, + "viewTrips": "View Trips", + "trips": "Trips", + "viewEvents": "View Charge Events", + "bar": { + "legendHome": "Home", + "legendpub": "Public", + "unknownVehicles": "Unknown Vehicles" + }, + "settings": "Settings", + "vehiclesInReport": "Vehicles In Report" + }, + "alerts": { + "charger": "Charger Alerts", + "vehicle": "Vehicle Alerts", + "options": "Alert Options", + "usePush": "Use Push Alerts", + "useText": "Send Text Alerts", + "useEmail": "Send Email Alerts", + "recipientPhone": "Recipient Phone", + "recipientEmail": "Recipient Email", + "pluginReminder": "Plug-in Reminder", + "chargingStatus": "Charging Status", + "nightly": "Nightly Alert", + "nightlyLowMiles": "Nightly Low Miles Alert", + "time": "Alert Time", + "lowMilesThreshold": "Low Miles Threshold", + "arrivalTime": "Arrival Alert Time (Seconds)", + "fullyCharged": "Vehicle Fully Charged Alert", + "chargingInterrupted": "Charging Interrupted Alert", + "minimumMilesMet": "Minimum Miles Met", + "minimumMilesThreshold": "Minimum Miles Threshold", + "highCost": "High Cost Alert", + "maxChargeCost": "Maximum Charge Cost" + }, + + "error": { + "noInfo": "No information provided" + }, + + "apiResponse": { + "success": { + "general": "Request successful.", + "fetch": "{resource} retrieved successfully.", + "fetchLoc": "Localized data retrieved successfully.", + "create": "{resource} created successfully.", + "update": "{resource} updated successfully.", + "delete": "{resource} deleted successfully.", + "remove": "{resource} removed successfully", + "auth": { + "login": "Logged in successfully.", + "logout": "Logged out successfully.", + "passwordReset": { + "codeSent": "Reset code sent successfully. Please check your email.", + "passwordUpdated": "Password reset successfully." + } + }, + "eula": { + "fetched": "EULA loaded successfully.", + "submitted": "EULA acceptance submitted successfully." + }, + "qrScanned": "QR code for {resource} scanned successfully.", + "bluetoothConnected": "Connected to {resource} via Bluetooth successfully.", + "operationCompleted": "{operation} on {resource} completed successfully." + }, + "error": { + "general": "An error occurred. Please try again later.", + "fetch": "Failed to retrieve {resource}. Please try again later.", + "fetchLoc": "Failed to retrieve Localized data. Defaulting to English.", + "create": "Failed to create {resource}. Please check your input and try again.", + "update": "Failed to update {resource}. Please check your input and try again.", + "delete": "Failed to delete {resource}. Please try again later.", + "missingParameter": "Oops! {field} is missing. Please provide all necessary information and try again.", + "invalidQR": "Invalid QR code for {resource}. Please try again.", + "limitReached": "You've reached the maximum limit of {limit} for {resource}.", + "unauthorized": "Unauthorized. Please log in again.", + "loginFailed": "Login failed. Please check your credentials and try again.", + "accessDenied": "Access forbidden. You don't have permission to perform this action.", + "notFound": "{Resource} not found. Please check and try again.", + "timeout": "Request timed out. Please try again later.", + "invalidData": "Unable to process the request. Please check your input and try again.", + "serverError": "Server error. Please try again later.", + "serviceUnavailable": "Service unavailable. Please try again later.", + "duplicateEntry": "A {resource} with this information already exists.", + "dependencyIssue": "Unable to perform this action due to dependencies on {resource}." + }, + "networkError": { + "general": "Unable to connect. Please check your internet connection." + } + } +} +} \ No newline at end of file diff --git a/mock/fr-CA.json b/mock/fr-CA.json new file mode 100644 index 00000000..cad4bd63 --- /dev/null +++ b/mock/fr-CA.json @@ -0,0 +1,452 @@ +{ + "status": "success", + "message": "Loaclization values retrieved successfully", + "data": { + "common": { + "name": "Nom", + "home": "Accueil", + "schedule": "Horaire", + "account": "Compte", + "reports": "Rapports", + "alerts": "Alertes", + "details": "Détails", + "start": "Démarrer", + "set": "Définir", + "select": "Sélectionner", + "next": "Suivant", + "finish": "Terminer", + "cancel": "Annuler", + "back": "Retour", + "time": "Temps", + "distance": "Distance", + "duration": "Durée", + "cost": "Coût", + "used": "Utilisé", + "remove": "Supprimer", + "centerQR": "Centrez le code QR dans la vue de la caméra", + "username": "Nom d'utilisateur", + "password": "Mot de passe", + "vehicle": "Véhicule", + "charger": "Chargeur", + "add": "Ajouter", + "selected": "Sélectionné", + "unknonwn": "Inconnu" + }, + "btn": { + "ok": "OK", + "getStarted": "Commencer", + "exitSetup": "Quitter la configuration", + "haveAccount": "Vous avez déjà un compte ?", + "tryAgain": "Réessayer", + "login": "Se connecter", + "loggingIn": "Connexion en cours...", + "logout": "Déconnexion", + "forgotPassword": "Mot de passe oublié", + "resetPassword": "Réinitialiser le mot de passe", + "updatePassword": "Mettre à jour le mot de passe", + "acceptEula": "J'ai lu et j'accepte les conditions d'utilisation", + "tryAnotherSsid": "Essayer un autre SSID", + "openCamera": "Ouvrir la caméra", + "addVehicleWDongle": "Ajouter un véhicule avec un dongle", + "removeVehicle": "Supprimer le véhicule", + "removeDongle": "Supprimer le dongle", + "removeCharger": "Supprimer le chargeur", + "removeHousehold": "Supprimer le foyer", + "changeIcon": "Changer l'icône", + "addHousehold": "Ajouter un foyer", + "support": "Support", + "accessaries": "Accessoires", + "appHome": "Aller à l'accueil de l'application", + "scanQRCode": "Scanner le code QR", + "orScanQRCode": "Ou scanner le code QR", + "tryAnotherWayToConnect": "Essayer une autre méthode de connexion", + "confirm": "Confirmer", + "goBack": "Retour", + "selectDiffNetwork": "Sélectionner un réseau différent", + "loginPage": "Aller à la page de connexion" + }, + "hint": { + "choose": "Choisir", + "enter": "Entrer", + "vehicleName": "Entrez le nom du véhicule", + "nameYourCharger": "Nommez votre chargeur", + "customRates": "Définir des tarifs personnalisés", + "optional": "Optionnel", + "phoneNumber": "Entrez le numéro de téléphone", + "email": "Entrez l'adresse e-mail", + "emailOrUsername": "Entrez l'e-mail ou le nom d'utilisateur", + "password": "Entrez le mot de passe", + "address": "Entrez l'adresse", + "address2": "Adresse 2 (optionnel)", + "city": "Entrez la ville", + "zipCode": "Entrez le code postal" + }, + "validation": { + "textfield": { + "username": "Entrez le nom d'utilisateur", + "validUsername": "Entrez un nom d'utilisateur valide", + "password": "Entrez un mot de passe", + "validPassword": "Entrez un mot de passe valide", + "confPassword": "Le mot de passe entré ne correspond pas", + "verificationCode": "Entrez le code de vérification", + "validVerificationCode": "Entrez un code de vérification valide", + "chargerName": "Entrez un nom pour votre chargeur", + "validChargerName": "Entrez un nom valide pour votre chargeur", + "vehicleName": "Entrez le nom du véhicule", + "validVehicleName": "Entrez un nom valide pour votre véhicule", + "householdName": "Entrez un nom de foyer valide", + "streetAddress": "Entrez une adresse valide", + "city": "Entrez une ville valide", + "zipCode": "Entrez un code postal valide", + "email": "Entrez votre adresse e-mail", + "validEmail": "Entrez une adresse e-mail valide", + "phone": "Entrez votre numéro de téléphone", + "validPhone": "Entrez un numéro de téléphone valide", + "lowMilesThreshold": "Entrez un seuil de kilométrage bas valide", + "arrivalAlertTime": "Entrez un temps valide en secondes", + "minimumMilesThreshold": "Entrez un seuil de kilométrage minimum valide", + "maxChargeCost": "Entrez un coût de charge maximum", + "validMaxChargeCost": "Entrez un coût de charge maximum valide" + }, + "field": { + "breakerSize": "Sélectionnez une taille de disjoncteur", + "maxChargeCurrent": "Sélectionnez un courant de charge maximum", + "reportingUnits": "Sélectionnez les unités de rapport", + "state": "Sélectionnez un état valide", + "country": "Sélectionnez un pays valide", + "method": "Sélectionnez une méthode de tarification valide", + "utility": "Sélectionnez un fournisseur d'énergie valide", + "rateProgram": "Sélectionnez un programme tarifaire valide", + "rate": "Entrez des tarifs valides", + "alertTime": "Veuillez entrer une heure d'alerte valide" + } + }, + "status": { + "charging": "En charge", + "idle": "Inactif", + "pluggedIn": "Branché", + "finishedCharging": "Charge terminée", + "scheduled": "Programmé", + "chargingError": "Erreur de charge" + }, + "signalStrength": { + "strong": "Fort", + "moderate": "Modéré", + "weak": "Faible" + }, + "connectionStatus": { + "connected": "Connecté", + "disconnected": "Déconnecté" + }, + "oob": { + "setup": "Configuration", + "setupGuideline": "Suivez les étapes guidées ci-dessous pour configurer et commencer à utiliser votre nouveau chargeur.", + "accountWizDesc": "Configurez l'adresse, les contacts et les tarifs d'électricité", + "chargerWizDesc": "Installez et configurez votre chargeur", + "vehicleWizDesc": "Connectez le dongle et configurez votre véhicule", + "setupComplete": "Votre configuration initiale est terminée", + "congratulations": "Félicitations" + }, + "dialog": { + "exitSetup": "Êtes-vous sûr de vouloir quitter la configuration ?", + "resourceRemovalDesc": "Ce {resource} sera supprimé de votre compte.", + "removalConfirmation": "{resource} supprimé de votre compte" + }, + "charger": { + "wizard": { + "addChargerTitle": "Ajouter un chargeur", + "pluginYourCharger": "Branchez votre chargeur", + "configureCharger": "Configurer le chargeur", + "pluginYourChargerDesc": "Une fois votre chargeur branché et le voyant Wi-Fi rouge allumé, vous êtes prêt à l'ajouter à votre compte.", + "connectYourCharger": "Connectez votre chargeur", + "bluetoothConnectionDesc": "Tenez-vous près de votre chargeur et utilisez le numéro sur le côté pour le sélectionner dans cette liste d'appareils Bluetooth disponibles :", + "bluetoothDevices": "Appareils Bluetooth", + "connectYourChargerDesc": "Utilisez votre caméra pour scanner le code QR sur le côté de votre chargeur.", + "wifiSetup": "Configurer le Wi-Fi du chargeur", + "wifiSelectionDesc": "Sélectionnez une connexion Wi-Fi pour votre chargeur", + "wifiNetworks": "Réseaux", + "wifiPasswordTitle": "Mot de passe Wi-Fi pour {name}", + "confirmConnection": "Confirmer la connexion du chargeur", + "confirmConnectionDesc": "Le voyant Wi-Fi du chargeur clignotera en bleu lorsqu'il sera connecté à Internet.", + "connecting": "Chargeur en cours de connexion au Wi-Fi...", + "connected": "Chargeur connecté", + "failed": "Impossible de connecter le chargeur !" + }, + "startCharging": "Commencer la charge", + "stopCharging": "Arrêter la charge", + "scheduledStart": "Démarrage programmé", + "scheduleCharging": "Programmer la charge", + "chargeRate": "Taux de charge", + "estChargeTime": "Temps de charge estimé", + "estChargeCost": "Coût de charge estimé", + "completeBy": "Terminé avant", + "info": "Informations", + "status": "Statut", + "connectedVehicle": "Véhicule connecté", + "breakerSize": "Taille du disjoncteur", + "maxChargeCurrent": "Courant de charge maximum", + "modelNumber": "Numéro de modèle", + "serialNumber": "Numéro de série", + "softwareVersion": "Version du logiciel", + "panelLedLighting": "Éclairage LED du panneau", + "wifiSec": "Paramètres Wi-Fi", + "wifi": { + "ssid": "SSID", + "mac": "MAC", + "connectionStatus": "Statut de connexion", + "signalStrength": "Force du signal", + "rssi": "RSSI", + "ipAddress": "Adresse IP", + "lastContact": "Dernier contact" + }, + "authSec": "Autorisation", + "auth": { + "none": "Aucune", + "always": "Demander à chaque fois", + "devicePresent": "Quand un appareil autorisé est présent" + }, + "specialOpsSec": "Opérations spéciales", + "manageAlerts": "Gérer les alertes de l'appareil", + "reboot": "Redémarrer le chargeur", + "factoryReset": "Restaurer les paramètres d'usine", + "resetFault": "Réinitialiser l'erreur de défaut du chargeur" + }, + "schedule": { + "options": "Options de programmation", + "custom": "Programmation personnalisée", + "onAllDay": "Activé toute la journée", + "scheduledCharging": "Charge programmée", + "smart": "Programmation intelligente", + "monday": "Lundi", + "tuesday": "Mardi", + "wednesday": "Mercredi", + "thursday": "Jeudi", + "friday": "Vendredi", + "saturday": "Samedi", + "sunday": "Dimanche", + "selectHours": "Sélectionnez les heures où la charge est disponible", + "timeSelection": { + "ampm": "La charge sera disponible de {morningSession} et {eveningSession}. Veuillez noter que toutes les heures sont dans le fuseau horaire du chargeur.", + "am": "La charge sera disponible de {morningSession}. Veuillez noter que toutes les heures sont dans le fuseau horaire du chargeur.", + "pm": "La charge sera disponible de {eveningSession}. Veuillez noter que toutes les heures sont dans le fuseau horaire du chargeur.", + "none": "Aucune heure de charge disponible. Veuillez configurer votre programmation." + } + }, + "account": { + "phoneNumber": "Numéro de téléphone", + "email": "E-mail", + "wizard": { + "title": "Créer un compte", + "welcomeDesc": "Créez votre compte avec votre adresse domicile et sélectionnez vos informations de fournisseur d'énergie.", + "createCredentialsDesc": "Créez votre nom d'utilisateur et mot de passe", + "contactInformationDesc": "Informations de contact par défaut" + }, + "reset": { + "resetPassSuccess": "Réinitialisation du mot de passe réussie", + "forgotPassDesc": "Entrez le nom d'utilisateur de votre compte Danlaw", + "checkYourEmailDesc": "Veuillez vérifier votre e-mail pour un message de notre part contenant un code pour réinitialiser votre mot de passe.", + "resetPassSuccessDesc": "Votre mot de passe a été mis à jour. Veuillez vous connecter avec votre nouveau mot de passe" + }, + "confPassword": "Confirmer le mot de passe", + "verification": "Code de vérification" + }, + "household": { + "title": "Foyer", + "wizard": { + "title": "Créer un foyer", + "nameYourHouseholdDesc": "Nommez votre foyer", + "householdAddressDesc": "Créez l'adresse de votre foyer pour le chargeur", + "useMyLocation": "Utiliser ma position actuelle", + "pricingMethodDesc": "Sélectionnez la méthode de tarification de la charge", + "utilityCompanyDesc": "Sélectionnez le fournisseur d'énergie", + "rateProgramDesc": "Sélectionnez le programme tarifaire", + "customRatesDesc": "Sélectionnez les tarifs personnalisés", + "customRates": { + "subTitle": "Entrez les tarifs par kWh pour ces périodes tarifaires standard", + "weekdayDaytime": "Tarif en semaine (journée)", + "weekdayNighttime": "Tarif en semaine (nuit)", + "weekendRate": "Tarif du week-end" + } + }, + "address": "Adresse", + "electricityPricing": "Tarification de l'électricité", + "chargers": "Chargeurs", + "streetAddress1": "Adresse 1", + "streetAddress2": "Adresse 2", + "city": "Ville", + "state": "État", + "zipCode": "Code postal", + "country": "Pays", + "pricingMethod": { + "short": "Méthode", + "long": "Méthode de tarification", + "chargerEstCost": "Estimation des coûts par le chargeur", + "utilityRates": "Basée sur le fournisseur d'énergie", + "manual": "Manuelle" + }, + "utility": "Fournisseur d'énergie", + "rateProgram": "Programme tarifaire", + "rate": "Tarif" + }, + "vehicle": { + "title": "Véhicule", + "wizard": { + "addVehicleTitle": "Ajouter un véhicule", + "addDongle": "Ajouter un dongle", + "connectDongle": "Connecter votre dongle", + "dongleDesc": "Localisez le dongle que vous souhaitez attribuer à votre compte", + "vehicleIconDesc": "Choisissez une icône pour votre véhicule", + "scanDongleQR": "Scanner le code QR du dongle", + "scanDongleQRDesc": "Utilisez votre caméra pour scanner le code QR sur le dongle.", + "installDongle": "Installer le dongle", + "installDongleInVehicle": "Installez le dongle dans votre véhicule", + "installDongleInfo": "Une fois le dongle branché dans votre véhicule, l'application confirmera votre connexion.", + "noDongleFound": "Aucun dongle trouvé", + "installDongleLEDConf": "Assurez-vous que la LED du dongle s'allume. Si ce n'est pas le cas, veuillez allumer votre véhicule.", + "verifyingComms": "Vérification des communications", + "primaryUserInfo": "Entrez les informations de l'utilisateur principal", + "contactPhone": "Téléphone de contact", + "contactEmail": "E-mail de contact" + }, + "nameVehicle": "Nommez votre véhicule", + "lastVehicleInfo": "Dernières informations du véhicule connecté", + "status": "Statut", + "vin": "NIV", + "year": "Année", + "make": "Marque", + "model": "Modèle", + "battery": "Batterie", + "stateOfCharge": "État de charge", + "batteryLife": "Durée de vie de la batterie", + "estMilesAvailable": "Kilométrage estimé disponible", + "failureCodes": "Codes de défaillance", + "diagnosticsCodes": "Codes de diagnostic", + "dongleInfo": "Informations du dongle", + "dongleId": "ID du dongle", + "lastConnected": "Dernière connexion", + "alerts": "Alertes", + "manageAlerts": "Gérer les alertes du véhicule", + "ass": { + "title": "Système de sécurité active", + "abs": "Système antiblocage des roues (ABS)", + "esc": "Contrôle électronique de stabilité (ESC)", + "tc": "Contrôle de traction", + "tpms": "Type de système de surveillance de la pression des pneus (TPMS)", + "note": "Note sur le système de sécurité active" + }, + "eng": { + "title": "Moteur", + "numCylinders": "Nombre de cylindres du moteur", + "displacementCC": "Cylindrée (CC)", + "displacementCI": "Cylindrée (CI)", + "displacementL": "Cylindrée (L)", + "engineModel": "Modèle du moteur" + }, + "body": { + "title": "Extérieur/Carrosserie", + "bodyClass": "Classe de carrosserie", + "doors": "Portes", + "windows": "Fenêtres" + } + }, + "reports": { + "vehicleEnergyReport": "Rapport énergétique du véhicule", + "tw": { + "title": "Période", + "past31": "31 derniers jours", + "week": "Cette semaine", + "month": "Ce mois-ci", + "year": "Cette année" + }, + "info": { + "barSelection": "Sélectionnez un segment de barre pour voir plus de détails" + }, + "viewTrips": "Voir les trajets", + "trips": "Trajets", + "viewEvents": "Voir les événements de charge", + "bar": { + "legendHome": "Domicile", + "legendpub": "Public", + "unknownVehicles": "Véhicules inconnus" + }, + "settings": "Paramètres", + "vehiclesInReport": "Véhicules dans le rapport" + }, + "alerts": { + "charger": "Alertes du chargeur", + "vehicle": "Alertes du véhicule", + "options": "Options d'alerte", + "usePush": "Utiliser les notifications push", + "useText": "Envoyer des alertes par SMS", + "useEmail": "Envoyer des alertes par e-mail", + "recipientPhone": "Téléphone du destinataire", + "recipientEmail": "E-mail du destinataire", + "pluginReminder": "Rappel de branchement", + "chargingStatus": "Statut de charge", + "nightly": "Alerte nocturne", + "nightlyLowMiles": "Alerte nocturne de kilométrage bas", + "time": "Heure de l'alerte", + "lowMilesThreshold": "Seuil de kilométrage bas", + "arrivalTime": "Temps d'alerte d'arrivée (secondes)", + "fullyCharged": "Alerte de véhicule complètement chargé", + "chargingInterrupted": "Alerte de charge interrompue", + "minimumMilesMet": "Kilométrage minimum atteint", + "minimumMilesThreshold": "Seuil de kilométrage minimum", + "highCost": "Alerte de coût élevé", + "maxChargeCost": "Coût de charge maximum" + }, + "error": { + "noInfo": "Aucune information fournie" + }, + "apiResponse": { + "success": { + "general": "Requête réussie.", + "fetch": "{resource} récupéré avec succès.", + "fetchLoc": "Données localisées récupérées avec succès.", + "create": "{resource} créé avec succès.", + "update": "{resource} mis à jour avec succès.", + "delete": "{resource} supprimé avec succès.", + "remove": "{resource} retiré avec succès", + "auth": { + "login": "Connexion réussie.", + "logout": "Déconnexion réussie.", + "passwordReset": { + "codeSent": "Code de réinitialisation envoyé avec succès. Veuillez vérifier votre e-mail.", + "passwordUpdated": "Mot de passe réinitialisé avec succès." + } + }, + "eula": { + "fetched": "CLUF chargé avec succès.", + "submitted": "Acceptation du CLUF soumise avec succès." + }, + "qrScanned": "Code QR pour {resource} scanné avec succès.", + "bluetoothConnected": "Connecté à {resource} via Bluetooth avec succès.", + "operationCompleted": "{operation} sur {resource} terminée avec succès." + }, + "error": { + "general": "Une erreur s'est produite. Veuillez réessayer plus tard.", + "fetch": "Échec de la récupération de {resource}. Veuillez réessayer plus tard.", + "fetchLoc": "Échec de la récupération des données localisées. Utilisation de l'anglais par défaut.", + "create": "Échec de la création de {resource}. Veuillez vérifier vos entrées et réessayer.", + "update": "Échec de la mise à jour de {resource}. Veuillez vérifier vos entrées et réessayer.", + "delete": "Échec de la suppression de {resource}. Veuillez réessayer plus tard.", + "missingParameter": "Oups ! {field} est manquant. Veuillez fournir toutes les informations nécessaires et réessayer.", + "invalidQR": "Code QR invalide pour {resource}. Veuillez réessayer.", + "limitReached": "Vous avez atteint la limite maximale de {limit} pour {resource}.", + "unauthorized": "Non autorisé. Veuillez vous reconnecter.", + "loginFailed": "Échec de la connexion. Veuillez vérifier vos identifiants et réessayer.", + "accessDenied": "Accès interdit. Vous n'avez pas la permission d'effectuer cette action.", + "notFound": "{Resource} non trouvé. Veuillez vérifier et réessayer.", + "timeout": "Délai d'attente dépassé. Veuillez réessayer plus tard.", + "invalidData": "Impossible de traiter la requête. Veuillez vérifier vos entrées et réessayer.", + "serverError": "Erreur serveur. Veuillez réessayer plus tard.", + "serviceUnavailable": "Service indisponible. Veuillez réessayer plus tard.", + "duplicateEntry": "Un {resource} avec ces informations existe déjà.", + "dependencyIssue": "Impossible d'effectuer cette action en raison de dépendances sur {resource}." + }, + "networkError": { + "general": "Impossible de se connecter. Veuillez vérifier votre connexion internet." + } + } +} +} \ No newline at end of file diff --git a/mock/states.json b/mock/states.json new file mode 100644 index 00000000..1f9094eb --- /dev/null +++ b/mock/states.json @@ -0,0 +1,28 @@ +{ + "status": "success", + "message": "States retrieved successfully!", + "data": { + "states": [ + { + "name": "Michigan", + "code": "MI" + }, + { + "name": "California", + "code": "CA" + }, + { + "name": "New York", + "code": "NY" + }, + { + "name": "Texas", + "code": "TX" + }, + { + "name": "Florida", + "code": "FL" + } + ] + } +} \ No newline at end of file diff --git a/package-cleanup.sh b/package-cleanup.sh new file mode 100755 index 00000000..cee414ea --- /dev/null +++ b/package-cleanup.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Check if an old package name was provided +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +# Assign command line argument to variable for the old package name +old_package_name="$1" + +# Derive the new package name from the directory the script is located in +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +new_package_name=$(basename "$script_dir") + +# Echo the old and new package names +echo "Old package name: $old_package_name" +echo "New package name: $new_package_name" + +# Update Flutter package names in pubspec.yaml +echo "Updating Flutter package names in pubspec.yaml files..." +find "$script_dir" -type f -name "pubspec.yaml" -exec sh -c ' + sed -i.bak "s/^name:.*/name: $1/" "$2" && echo "Updated $2" && rm "$2.bak" +' _ "$new_package_name" {} \; + +# Update Flutter package imports in Dart files within the /lib directory +echo "Updating Flutter package imports in Dart files..." +lib_path="${script_dir}/lib" +if [ -d "$lib_path" ]; then + find "$lib_path" -type f -name "*.dart" -exec sh -c ' + sed -i.bak "s/package:$2\//package:$1\//g" "$3" && echo "Updated $3" && rm "$3.bak" + ' _ "$new_package_name" "$old_package_name" {} \; +fi + +# Inform user of success +echo "The files have been cleaned to use packages matching $new_package_name" diff --git a/pubspec.lock b/pubspec.lock index 112f68b3..8fd911b6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -9,14 +9,6 @@ packages: url: "https://pub.dev" source: hosted version: "67.0.0" - _flutterfire_internals: - dependency: transitive - description: - name: _flutterfire_internals - sha256: "99b5dec989287c1aca71bf27339e0022b4dc3679225f442fb75790ef44535bf8" - url: "https://pub.dev" - source: hosted - version: "1.3.30" analyzer: dependency: transitive description: @@ -33,6 +25,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.11.3" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" args: dependency: transitive description: @@ -121,6 +129,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.9.2" + carousel_slider: + dependency: "direct main" + description: + name: carousel_slider + sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42" + url: "https://pub.dev" + source: hosted + version: "4.2.1" characters: dependency: transitive description: @@ -161,30 +177,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" - cloud_firestore: - dependency: "direct main" - description: - name: cloud_firestore - sha256: "531a471f7eb9ae57bc8dc727c1fb424f7fe8817e84229fd527246af681bcf01c" - url: "https://pub.dev" - source: hosted - version: "4.17.0" - cloud_firestore_platform_interface: - dependency: transitive - description: - name: cloud_firestore_platform_interface - sha256: "1014ed707aafc41828704eac18bc5ebad37641f66614db334e4f22e57ae7f568" - url: "https://pub.dev" - source: hosted - version: "6.2.0" - cloud_firestore_web: - dependency: transitive - description: - name: cloud_firestore_web - sha256: be74d6d998807afe5bbe67c94ce4379b330c6817b8151488ce534a8c25d2df51 - url: "https://pub.dev" - source: hosted - version: "3.12.0" code_builder: dependency: transitive description: @@ -209,6 +201,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.1" + country_code: + dependency: "direct main" + description: + name: country_code + sha256: f69ccd5163b1ca43011be9632e33ebe7ffac65e49ce2afcd3e3e5228af5d91fc + url: "https://pub.dev" + source: hosted + version: "1.0.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + url: "https://pub.dev" + source: hosted + version: "0.3.4+1" crypto: dependency: transitive description: @@ -217,6 +225,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + csslib: + dependency: transitive + description: + name: csslib + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" cupertino_icons: dependency: "direct main" description: @@ -257,16 +273,32 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.6" - desktop_webview_auth: + dio: + dependency: "direct main" + description: + name: dio + sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5" + url: "https://pub.dev" + source: hosted + version: "5.4.3+1" + easy_localization: + dependency: "direct main" + description: + name: easy_localization + sha256: fa59bcdbbb911a764aa6acf96bbb6fa7a5cf8234354fc45ec1a43a0349ef0201 + url: "https://pub.dev" + source: hosted + version: "3.0.7" + easy_logger: dependency: transitive description: - name: desktop_webview_auth - sha256: c4dce73346a7be7243c90ac3b1a68586d9f0e2c2710e81e07d758e80a6ebd920 + name: easy_logger + sha256: c764a6e024846f33405a2342caf91c62e357c24b02c04dbc712ef232bf30ffb7 url: "https://pub.dev" source: hosted - version: "0.0.15" + version: "0.0.2" email_validator: - dependency: transitive + dependency: "direct main" description: name: email_validator sha256: e9a90f27ab2b915a27d7f9c2a7ddda5dd752d6942616ee83529b686fc086221b @@ -305,124 +337,43 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" - firebase_auth: - dependency: "direct main" - description: - name: firebase_auth - sha256: a35269247d7b23703bab35ecdb50462944ac1fcdfcf359a7071506c4ad830bfb - url: "https://pub.dev" - source: hosted - version: "4.19.2" - firebase_auth_platform_interface: + fixnum: dependency: transitive description: - name: firebase_auth_platform_interface - sha256: "0edf2466247d18cd2111c4784e43bce49d39cc4d052c122e8060630a136b5a09" + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" url: "https://pub.dev" source: hosted - version: "7.2.3" - firebase_auth_web: - dependency: "direct overridden" - description: - path: "packages/firebase_auth/firebase_auth_web" - ref: master - resolved-ref: "2b0860296bf577c99810643bb286b7219ee9291f" - url: "https://github.com/firebase/flutterfire" - source: git - version: "5.11.2" - firebase_core: + version: "1.1.0" + flutter: dependency: "direct main" - description: - name: firebase_core - sha256: "6b1152a5af3b1cfe7e45309e96fc1aa14873f410f7aadb3878aa7812acfa7531" - url: "https://pub.dev" - source: hosted - version: "2.30.0" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63 - url: "https://pub.dev" - source: hosted - version: "5.0.0" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - sha256: c8b02226e548f35aace298e2bb2e6c24e34e8a203d614e742bb1146e5a4ad3c8 - url: "https://pub.dev" - source: hosted - version: "2.15.0" - firebase_dynamic_links: - dependency: transitive - description: - name: firebase_dynamic_links - sha256: e40a96010e550caa69bd5511855d6245758d85446bd0ec8ad974a51d9299d607 - url: "https://pub.dev" - source: hosted - version: "5.5.2" - firebase_dynamic_links_platform_interface: - dependency: transitive - description: - name: firebase_dynamic_links_platform_interface - sha256: "2f1f80fa016d327df49f903a5aa4bbc851aef981a20edf21e85ee85f3de2c165" - url: "https://pub.dev" - source: hosted - version: "0.2.6+30" - firebase_ui_auth: + description: flutter + source: sdk + version: "0.0.0" + flutter_blue_plus: dependency: "direct main" description: - name: firebase_ui_auth - sha256: d138c7a2c53e39fc6b4d5c1bea7a6e4d75a7683ff9dbde1865682de517966a4d + name: flutter_blue_plus + sha256: c762a694c2f67b1f492ef19ead2a30ed3254650bafd852cb8933823d13d7c89f url: "https://pub.dev" source: hosted - version: "1.13.1" - firebase_ui_firestore: + version: "1.32.7" + flutter_i18n: dependency: "direct main" description: - name: firebase_ui_firestore - sha256: "49ef3e157828161cde9aaf1441a7098b6f5d7d360eafe5a588e6350f7f32caf9" + name: flutter_i18n + sha256: "0e88d479c11c4d3d46b2610fb7e94a13ac34fbf5d3adc265afb1645361ec5062" url: "https://pub.dev" source: hosted - version: "1.6.2" - firebase_ui_localizations: - dependency: transitive - description: - name: firebase_ui_localizations - sha256: "816501d26bb9e2a58b5d5f80351d82a50bd2f5c8d4aeb22504c53f91b6c57259" - url: "https://pub.dev" - source: hosted - version: "1.10.2" - firebase_ui_oauth: - dependency: transitive - description: - name: firebase_ui_oauth - sha256: "00003a7ff0b75b081ed9815bad732343e3702d6237f90f1b63b623ba5e8d1410" - url: "https://pub.dev" - source: hosted - version: "1.5.1" - firebase_ui_shared: - dependency: transitive - description: - name: firebase_ui_shared - sha256: f1d07c130a39104d32fba1dab274b7bcb13be2bf4e652624a4ccabb58f9781f1 - url: "https://pub.dev" - source: hosted - version: "1.4.1" - fixnum: - dependency: transitive + version: "0.36.0" + flutter_launcher_icons: + dependency: "direct dev" description: - name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + name: flutter_launcher_icons + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" url: "https://pub.dev" source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" + version: "0.13.1" flutter_lints: dependency: "direct dev" description: @@ -432,10 +383,18 @@ packages: source: hosted version: "3.0.2" flutter_localizations: - dependency: transitive + dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_native_splash: + dependency: "direct main" + description: + name: flutter_native_splash + sha256: edf39bcf4d74aca1eb2c1e43c3e445fd9f494013df7f0da752fefe72020eedc0 + url: "https://pub.dev" + source: hosted + version: "2.4.0" flutter_riverpod: dependency: "direct main" description: @@ -444,6 +403,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.5.1" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "9f3dd2ac3b6875b0fde5b04734789c3ef35ba3965c18e99dd564a7a2f8056df6" + url: "https://pub.dev" + source: hosted + version: "4.2.1" flutter_svg: dependency: "direct main" description: @@ -452,6 +419,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.10+1" + flutter_svg_provider: + dependency: "direct main" + description: + name: flutter_svg_provider + sha256: cda47ab350671ba51ae4605d48f4c82fa5a2c399d22ebda367c1b407234c5048 + url: "https://pub.dev" + source: hosted + version: "1.0.7" flutter_test: dependency: "direct dev" description: flutter @@ -478,6 +453,86 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + geocoding: + dependency: "direct main" + description: + name: geocoding + sha256: d580c801cba9386b4fac5047c4c785a4e19554f46be42f4f5e5b7deacd088a66 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + geocoding_android: + dependency: transitive + description: + name: geocoding_android + sha256: "1b13eca79b11c497c434678fed109c2be020b158cec7512c848c102bc7232603" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + geocoding_ios: + dependency: transitive + description: + name: geocoding_ios + sha256: "94ddba60387501bd1c11e18dca7c5a9e8c645d6e3da9c38b9762434941870c24" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + geocoding_platform_interface: + dependency: transitive + description: + name: geocoding_platform_interface + sha256: "8c2c8226e5c276594c2e18bfe88b19110ed770aeb7c1ab50ede570be8b92229b" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: "149876cc5207a0f5daf4fdd3bfcf0a0f27258b3fe95108fa084f527ad0568f1b" + url: "https://pub.dev" + source: hosted + version: "12.0.0" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: "00c7177a95823dd3ee35ef42fd8666cd27d219ae14cea472ac76a21dff43000b" + url: "https://pub.dev" + source: hosted + version: "4.6.0" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: bc2aca02423ad429cb0556121f56e60360a2b7d694c8570301d06ea0c00732fd + url: "https://pub.dev" + source: hosted + version: "2.3.7" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "386ce3d9cce47838355000070b1d0b13efb5bc430f8ecda7e9238c8409ace012" + url: "https://pub.dev" + source: hosted + version: "4.2.4" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: "7a22f400d831f924a89d931ba126a10e6b8b437f31e6b9311320435f3e1571bd" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "53da08937d07c24b0d9952eb57a3b474e29aae2abf9dd717f7e1230995f13f0e" + url: "https://pub.dev" + source: hosted + version: "0.2.3" glob: dependency: transitive description: @@ -490,10 +545,18 @@ packages: dependency: "direct main" description: name: go_router - sha256: c247a4f76071c3b97bb5ae8912968870d5565644801c5e09f3bc961b4d874895 + sha256: "39dd52168d6c59984454183148dc3a5776960c61083adfc708cc79a7b3ce1ba8" + url: "https://pub.dev" + source: hosted + version: "14.2.1" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 url: "https://pub.dev" source: hosted - version: "12.1.1" + version: "6.2.1" graphs: dependency: transitive description: @@ -502,6 +565,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.1" + hexcolor: + dependency: "direct main" + description: + name: hexcolor + sha256: c07f4bbb9095df87eeca87e7c69e8c3d60f70c66102d7b8d61c4af0453add3f6 + url: "https://pub.dev" + source: hosted + version: "3.0.1" hotreloader: dependency: transitive description: @@ -510,6 +581,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.0" + html: + dependency: transitive + description: + name: html + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" + source: hosted + version: "0.15.4" http: dependency: transitive description: @@ -534,14 +613,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + image: + dependency: transitive + description: + name: image + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" + url: "https://pub.dev" + source: hosted + version: "4.2.0" intl: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" io: dependency: transitive description: @@ -559,37 +646,53 @@ packages: source: hosted version: "0.7.1" json_annotation: - dependency: transitive + dependency: "direct main" description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b + url: "https://pub.dev" + source: hosted + version: "6.8.0" + jwt_decode: + dependency: "direct main" + description: + name: jwt_decode + sha256: d2e9f68c052b2225130977429d30f187aa1981d789c76ad104a32243cfdebfbb + url: "https://pub.dev" + source: hosted + version: "0.3.1" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.0" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" lints: dependency: transitive description: @@ -626,10 +729,10 @@ packages: dependency: transitive description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.12.0" mime: dependency: transitive description: @@ -638,6 +741,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" + mobile_scanner: + dependency: "direct main" + description: + name: mobile_scanner + sha256: b8c0e9afcfd52534f85ec666f3d52156f560b5e6c25b1e3d4fe2087763607926 + url: "https://pub.dev" + source: hosted + version: "5.1.1" mocktail: dependency: "direct dev" description: @@ -670,6 +781,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + url: "https://pub.dev" + source: hosted + version: "2.1.3" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d + url: "https://pub.dev" + source: hosted + version: "2.2.4" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" + source: hosted + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -738,10 +873,10 @@ packages: dependency: transitive description: name: pubspec_parse - sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.3.0" random_string: dependency: "direct dev" description: @@ -750,6 +885,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.1" + reflectable: + dependency: "direct main" + description: + name: reflectable + sha256: cdc1a278a2e9769abafaf9ba54ce1fd3432b2a38360e14b87ea6344f715340de + url: "https://pub.dev" + source: hosted + version: "4.0.6" riverpod: dependency: transitive description: @@ -798,6 +941,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: ef3489a969683c4f3d0239010cc8b7a2a46543a8d139e111c06c558875083544 + url: "https://pub.dev" + source: hosted + version: "9.0.0" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "0f9e4418835d1b2c3ae78fdb918251959106cefdbc4dd43526e182f80e82f6d4" + url: "https://pub.dev" + source: hosted + version: "4.0.0" shared_preferences: dependency: "direct main" description: @@ -818,10 +977,10 @@ packages: dependency: transitive description: name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.4.0" shared_preferences_linux: dependency: transitive description: @@ -870,6 +1029,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + simple_circular_progress_bar: + dependency: "direct main" + description: + name: simple_circular_progress_bar + sha256: e661ca942fbc617298e975b41fde19003d995de73ca6c2a1526c54d52f07151b + url: "https://pub.dev" + source: hosted + version: "1.0.2" sky_engine: dependency: transitive description: flutter @@ -883,6 +1050,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + url: "https://pub.dev" + source: hosted + version: "1.3.4" source_span: dependency: transitive description: @@ -951,10 +1126,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" timing: dependency: transitive description: @@ -963,6 +1138,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + toml: + dependency: transitive + description: + name: toml + sha256: "9968de24e45b632bf1a654fe1ac7b6fe5261c349243df83fd262397799c45a2d" + url: "https://pub.dev" + source: hosted + version: "0.15.0" typed_data: dependency: transitive description: @@ -971,8 +1154,88 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" - uuid: + universal_io: + dependency: transitive + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf + url: "https://pub.dev" + source: hosted + version: "6.3.3" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + 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: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + us_states: + dependency: "direct main" + description: + name: us_states + sha256: "1abc927838eb3db1a7e3f8904400da7b62cd6cd6b21844b2b3f3dbbd1f299475" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + uuid: + dependency: "direct dev" description: name: uuid sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" @@ -1015,10 +1278,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "13.0.0" + version: "14.2.1" watcher: dependency: transitive description: @@ -1028,13 +1291,13 @@ packages: source: hosted version: "1.1.0" web: - dependency: "direct overridden" + dependency: transitive description: name: web - sha256: "4188706108906f002b3a293509234588823c8c979dc83304e229ff400c996b05" + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" url: "https://pub.dev" source: hosted - version: "0.4.2" + version: "0.5.1" web_socket_channel: dependency: transitive description: @@ -1043,14 +1306,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.5" + wifi_scan: + dependency: "direct main" + description: + name: wifi_scan + sha256: cd0b98a611a3206c1bd9e600b9dff3aca27dcc924aa025548b00713e93a27299 + url: "https://pub.dev" + source: hosted + version: "0.4.1" win32: dependency: transitive description: name: win32 - sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" + url: "https://pub.dev" + source: hosted + version: "5.5.0" + world_zipcode_validator: + dependency: "direct main" + description: + name: world_zipcode_validator + sha256: "3b28c56326499531851391d8c1c4fea72fa355b0ad00cdb2bd4146dcaecf2d6d" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "0.0.2" xdg_directories: dependency: transitive description: @@ -1067,6 +1346,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.5.0" + xml2json: + dependency: transitive + description: + name: xml2json + sha256: "52b7c8d350fdce09545b058982c26689ee89f1eb188cc9910d585665bfe27bc0" + url: "https://pub.dev" + source: hosted + version: "6.2.3" yaml: dependency: transitive description: @@ -1076,5 +1363,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.3.0 <4.0.0" - flutter: ">=3.19.0" + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index d14a8103..c81cc3af 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,30 +1,51 @@ name: flutter_starter_base_app -description: A new Flutter project. +description: Danlaw EV Charger -publish_to: 'none' -version: 2.1.0 +publish_to: "none" +version: 1.0.0+7 environment: sdk: ">=3.1.0 <4.0.0" dependencies: - cloud_firestore: ^4.14.0 cupertino_icons: ^1.0.6 equatable: ^2.0.5 - firebase_auth: ^4.16.0 - firebase_core: ^2.24.2 - firebase_ui_auth: ^1.12.0 - firebase_ui_firestore: ^1.6.1 flutter: sdk: flutter + flutter_localizations: + sdk: flutter flutter_riverpod: ^2.4.6 flutter_svg: ^2.0.9 - go_router: 12.1.1 - intl: ^0.18.1 + go_router: ^14.2.1 + intl: ^0.19.0 rxdart: ^0.27.7 shared_preferences: ^2.2.2 - # the annotation package containing @riverpod riverpod_annotation: 2.3.1 + dio: ^5.4.3+1 + json_annotation: ^4.9.0 + world_zipcode_validator: ^0.0.2 + us_states: ^1.2.0 + country_code: ^1.0.0 + hexcolor: ^3.0.1 + carousel_slider: ^4.2.1 + simple_circular_progress_bar: ^1.0.2 + flutter_svg_provider: ^1.0.7 + reflectable: ^4.0.6 + google_fonts: ^6.2.1 + share_plus: ^9.0.0 + mobile_scanner: ^5.1.1 + flutter_blue_plus: ^1.32.7 + wifi_scan: ^0.4.1 + email_validator: ^2.1.17 + flutter_native_splash: ^2.4.0 + path_provider: ^2.1.3 + flutter_i18n: ^0.36.0 + easy_localization: ^3.0.7 + url_launcher: ^6.3.0 + jwt_decode: ^0.3.1 + flutter_secure_storage: ^4.2.1 + geocoding: ^3.0.0 + geolocator: ^12.0.0 dev_dependencies: flutter_test: @@ -32,24 +53,39 @@ dev_dependencies: mocktail: ^1.0.1 random_string: ^2.3.1 flutter_lints: ^3.0.1 - # a tool for running code generators build_runner: ^2.4.8 - # the code generator riverpod_generator: 2.3.6 - # riverpod_lint makes it easier to work with Riverpod riverpod_lint: 2.3.4 - # import custom_lint too as riverpod_lint depends on it custom_lint: 0.5.6 + json_serializable: ^6.7.1 + uuid: ^4.4.0 + flutter_launcher_icons: ^0.13.1 -dependency_overrides: - web: ^0.4.2 - firebase_auth_web: - git: - url: https://github.com/firebase/flutterfire - ref: master - path: packages/firebase_auth/firebase_auth_web +flutter_launcher_icons: + android: "launcher_icon" + ios: true + remove_alpha_ios: true + image_path: "assets/launch_icon.ico" flutter: + generate: true uses-material-design: true assets: - assets/time-tracking.svg + - mock/ + - assets/bottom_navigation_bar/ + - assets/detail_icon/ + - assets/vehicle_icon/ + - assets/charger_icon/ + - assets/charger_icon/large/ + - assets/charger_icon/medium/ + - assets/charger_icon/small/ + - assets/charger_icon/gray/ + - assets/charger_icon/green/ + - assets/charger_icon/blue/ + - assets/charger_icon/red/ + - assets/ + - assets/images/ + - assets/setup_charger/ + - assets/setup_dongle/ + - assets/locale/ diff --git a/test/common_widgets_test/action_text_button_test.dart b/test/common_widgets_test/action_text_button_test.dart new file mode 100644 index 00000000..7ab960db --- /dev/null +++ b/test/common_widgets_test/action_text_button_test.dart @@ -0,0 +1,38 @@ +import 'package:danlaw_charger/src/common_widgets/action_text_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group("action text button", () { + testWidgets("display the text correctly", (WidgetTester tester) async { + const text = "click here"; + + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: ActionTextButton( + text: text, + onPressed: () {}, + ), + ), + )); + expect(find.text(text), findsOneWidget); + }); + + testWidgets("onPressed is Triggered", (WidgetTester tester) async { + bool onpressed = false; + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: ActionTextButton( + text: "Click here", + onPressed: () { + onpressed = true; + }, + ), + ))); + + await tester.tap(find.byType(TextButton)); + await tester.pump(); + expect(onpressed, isTrue); + }); + }); +} diff --git a/test/common_widgets_test/custom_stepper_test.dart b/test/common_widgets_test/custom_stepper_test.dart new file mode 100644 index 00000000..1c0b0a89 --- /dev/null +++ b/test/common_widgets_test/custom_stepper_test.dart @@ -0,0 +1,107 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:danlaw_charger/src/constants/colors.dart'; +import 'package:danlaw_charger/src/common_widgets/custom_stepper.dart'; + +void main() { + group('CustomStepper Widget Tests', () { + testWidgets('renders the correct number of steps', + (WidgetTester tester) async { + const totalSteps = 5; + const curStep = 3; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: CustomStepper( + curStep: curStep, + totalSteps: totalSteps, + stepCompleteColor: Color(0xffD0BCFF), + inactiveColor: Color(0xffbababa), + currentStepColor: CustomColors().whitecolor, + lineWidth: 2.0, + ), + ), + ), + ); + + // Verify the number of step circles + expect(find.byType(GestureDetector), findsNWidgets(totalSteps)); + }); + + // testWidgets('renders correct colors for steps', + // (WidgetTester tester) async { + // const totalSteps = 5; + // const curStep = 3; + + // await tester.pumpWidget( + // MaterialApp( + // home: Scaffold( + // body: CustomStepper( + // curStep: curStep, + // totalSteps: totalSteps, + // stepCompleteColor: Color(0xffD0BCFF), + // inactiveColor: Color(0xffbababa), + // currentStepColor: CustomColors().whitecolor, + // lineWidth: 2.0, + // ), + // ), + // ), + // ); + + // final containers = tester.widgetList(find.byType(Container)); + + // // Verify the colors of the step circles + // BoxDecoration? decoration1 = + // containers.elementAt(0).decoration as BoxDecoration?; + // BoxDecoration? decoration2 = + // containers.elementAt(1).decoration as BoxDecoration?; + // BoxDecoration? decoration3 = + // containers.elementAt(2).decoration as BoxDecoration?; + // BoxDecoration? decoration4 = + // containers.elementAt(3).decoration as BoxDecoration?; + // BoxDecoration? decoration5 = + // containers.elementAt(4).decoration as BoxDecoration?; + + // expect( + // decoration1?.color, + // Color(0xffbababa), + // ); // Step 1 (inactive) + // expect( + // decoration2?.color, + // Color(0xffbababa), + // ); // Step 2 (inactive) + // expect(decoration3?.color, CustomColors().whitecolor); // Step 3 (current) + // expect(decoration4?.color, Color(0xffD0BCFF)); // Step 4 (complete) + // expect(decoration5?.color, Color(0xffD0BCFF)); // Step 5 (complete) + // }); + + // testWidgets('tapping on a step calls jumpToPage', + // (WidgetTester tester) async { + // const totalSteps = 5; + // const curStep = 3; + // final pageController = PageController(); + + // await tester.pumpWidget( + // MaterialApp( + // home: Scaffold( + // body: CustomStepper( + // curStep: curStep, + // totalSteps: totalSteps, + // stepCompleteColor: Color(0xffD0BCFF), + // inactiveColor: Color(0xffbababa), + // currentStepColor: CustomColors().whitecolor, + // lineWidth: 2.0, + // pageController: pageController, + // ), + // ), + // ), + // ); + + // await tester.tap(find.byType(GestureDetector).at(1)); + // await tester.pumpAndSettle(); + + // expect(pageController.page, 1); + // }); + }); +} diff --git a/test/common_widgets_test/custom_textformfield_test.dart b/test/common_widgets_test/custom_textformfield_test.dart new file mode 100644 index 00000000..3859f9dc --- /dev/null +++ b/test/common_widgets_test/custom_textformfield_test.dart @@ -0,0 +1,120 @@ +import 'package:danlaw_charger/src/common_widgets/custom_text_form_field.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +// Adjust this import according to your project structure + +void main() { + group('CustomTextFormField Tests', () { + testWidgets('displays hint text correctly', (WidgetTester tester) async { + final hintText = 'Enter text'; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: CustomTextFormField( + controller: TextEditingController(), + textInputType: TextInputType.text, + hintText: hintText, + ), + ), + ), + ); + + expect(find.text(hintText), findsOneWidget); + }); + + testWidgets('displays prefix icon correctly', (WidgetTester tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: CustomTextFormField( + controller: TextEditingController(), + textInputType: TextInputType.text, + hintText: 'Enter text', + prefixIcon: Icon(Icons.location_on), + ), + ), + ), + ); + + expect(find.byIcon(Icons.location_on), findsOneWidget); + }); + + testWidgets('onTap callback is triggered', (WidgetTester tester) async { + bool tapped = false; + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: CustomTextFormField( + controller: TextEditingController(), + textInputType: TextInputType.text, + hintText: 'Enter text', + onTap: () { + tapped = true; + }, + ), + ), + ), + ); + + await tester.tap(find.byType(TextFormField)); + await tester.pump(); + + expect(tapped, isTrue); + }); + + testWidgets('validator displays error text', (WidgetTester tester) async { + final formKey = GlobalKey(); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Form( + key: formKey, + child: CustomTextFormField( + controller: TextEditingController(), + textInputType: TextInputType.text, + hintText: 'Enter text', + validator: (value) { + if (value == null || value.isEmpty) { + return 'Error text'; + } + return null; + }, + ), + ), + ), + ), + ); + + formKey.currentState?.validate(); + await tester.pump(); + + expect(find.text('Error text'), findsOneWidget); + }); + + testWidgets('readonly field does not accept input', + (WidgetTester tester) async { + final controller = TextEditingController(text: 'Initial text'); + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: CustomTextFormField( + controller: controller, + textInputType: TextInputType.text, + hintText: 'Enter text', + readOnly: true, + ), + ), + ), + ); + + await tester.enterText(find.byType(TextFormField), 'New text'); + await tester.pump(); + + expect(controller.text, 'Initial text'); + }); + }); +} diff --git a/test/common_widgets_test/primary_button_test.dart b/test/common_widgets_test/primary_button_test.dart new file mode 100644 index 00000000..211d80a4 --- /dev/null +++ b/test/common_widgets_test/primary_button_test.dart @@ -0,0 +1,50 @@ +import 'package:danlaw_charger/src/common_widgets/primary_button.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group("Primary Button ", () { + testWidgets("on Pressed is triggered", (WidgetTester tester) async { + bool onpressed = false; + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: PrimaryButton( + onPressed: () { + onpressed = true; + }, + text: "Click Me", + )), + )); + + await tester.tap(find.byType(ElevatedButton)); + await tester.pump(); + expect(onpressed, isTrue); + }); + testWidgets("display the text correctly", (WidgetTester tester) async { + const buttontext = "Click Me"; + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: PrimaryButton(text: buttontext, onPressed: () {})))); + expect(find.text(buttontext), findsOneWidget); + }); + + testWidgets("applies background color correctly", + (WidgetTester tester) async { + const color = Colors.red; + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: PrimaryButton( + text: 'Click Me', + onPressed: () {}, + backgroundColor: color, + ), + ))); + final elevatedButton = + tester.widget(find.byType(ElevatedButton)); + final backgroundColor = + elevatedButton.style?.backgroundColor?.resolve({}); + + expect(backgroundColor, color); + }); + }); +} diff --git a/test/src/features/jobs/domain/job_test.dart b/test/src/features/jobs/domain/job_test.dart deleted file mode 100644 index d626e252..00000000 --- a/test/src/features/jobs/domain/job_test.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_starter_base_app/src/features/jobs/domain/job.dart'; - -void main() { - group('fromMap', () { - test('job with all properties', () { - final job = Job.fromMap(const { - 'name': 'Blogging', - 'ratePerHour': 10, - }, 'abc'); - expect(job, const Job(name: 'Blogging', ratePerHour: 10, id: 'abc')); - }); - - test('missing name', () { - // * If the 'name' is missing, this error will be emitted: - // * _CastError: - // * We can detect it by expecting that the test throws a TypeError - expect( - () => Job.fromMap(const { - 'ratePerHour': 10, - }, 'abc'), - throwsA(isInstanceOf())); - }); - }); - - group('toMap', () { - test('valid name, ratePerHour', () { - const job = Job(name: 'Blogging', ratePerHour: 10, id: 'abc'); - expect(job.toMap(), { - 'name': 'Blogging', - 'ratePerHour': 10, - }); - }); - }); - - group('equality', () { - test('different properties, equality returns false', () { - const job1 = Job(name: 'Blogging', ratePerHour: 10, id: 'abc'); - const job2 = Job(name: 'Blogging', ratePerHour: 5, id: 'abc'); - expect(job1 == job2, false); - }); - test('same properties, equality returns true', () { - const job1 = Job(name: 'Blogging', ratePerHour: 10, id: 'abc'); - const job2 = Job(name: 'Blogging', ratePerHour: 10, id: 'abc'); - expect(job1 == job2, true); - }); - }); -} diff --git a/test/src/mocks.dart b/test/src/mocks.dart deleted file mode 100644 index 8aff4bbc..00000000 --- a/test/src/mocks.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:mocktail/mocktail.dart'; -import 'package:flutter_starter_base_app/src/features/authentication/data/firebase_auth_repository.dart'; -import 'package:flutter_starter_base_app/src/features/onboarding/data/onboarding_repository.dart'; - -class MockAuthRepository extends Mock implements AuthRepository {} - -class MockFirebaseAuth extends Mock implements FirebaseAuth {} - -class MockUserCredential extends Mock implements UserCredential {} - -class MockUser extends Mock implements User {} - -class MockOnboardingRepository extends Mock implements OnboardingRepository {} - -class Listener extends Mock { - void call(T? previous, T? next); -} diff --git a/test/unit_test/dio_interceptor_test.dart b/test/unit_test/dio_interceptor_test.dart new file mode 100644 index 00000000..b5ddfbec --- /dev/null +++ b/test/unit_test/dio_interceptor_test.dart @@ -0,0 +1,148 @@ +import 'package:danlaw_charger/src/constants/keys.dart'; +import 'package:danlaw_charger/src/features/household/domain/pricing_method.dart'; +import 'package:danlaw_charger/src/features/vehicle/domain/vehicle.dart'; +import 'package:danlaw_charger/src/utils/vin_check.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:danlaw_charger/src/api/mock_api.dart'; +import 'package:world_zipcode_validator/world_zipcode_validator.dart'; +import 'package:us_states/us_states.dart'; +import 'package:country_code/country_code.dart'; +import 'package:uuid/uuid.dart'; + +void main() { + setUpAll(() => WidgetsFlutterBinding.ensureInitialized()); + + bool isValidPhoneNumber(String? value) => + RegExp(r'(^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$)').hasMatch(value ?? ''); + bool isValidEmail(String? value) => RegExp(r'[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+ ').hasMatch(value ?? ''); + DateTime convertUnixSeconds(String seconds) => DateTime.fromMillisecondsSinceEpoch(int.parse(seconds) * 1000); + + test('get_household_list', () async { + final response = await APIMock().getHouseholds(); + if (response.length > 1) { + expect(WorldZipcodeValidator.isValid('us', response[0].homeAddress.zipCode), true); + expect(USStates.getAllAbbreviations().contains(response[0].homeAddress.state), true); + expect(PricingMethodType.values.map((e) => e.name).toList().contains(response[0].chargePricingMethod!.type.name), + true); + } + if (response.length > 2) { + expect(WorldZipcodeValidator.isValid('us', response[1].homeAddress.zipCode), true); + expect(USStates.getAllAbbreviations().contains(response[1].homeAddress.state), true); + expect(PricingMethodType.values.map((e) => e.name).toList().contains(response[1].chargePricingMethod!.type.name), + true); + } + }); + test('get_countries', () async { + final response = await APIMock().getCountries(); + if (response.length > 1) { + expect(CountryCode.values.map((e) => e.alpha2).toList().contains(response[0].code), true); + } + if (response.length > 2) { + expect(CountryCode.values.map((e) => e.alpha2).toList().contains(response[1].code), true); + } + }); + test('account_details', () async { + final response = await APIMock().getAccountDetails(); + if ((response.households?.length ?? 0) > 1) { + expect(Uuid.isValidUUID(fromString: response.households![0].householdId), true); + expect(isValidPhoneNumber(response.phoneNumber), true); + expect(isValidEmail(response.emailId), true); + } + if ((response.vehicles?.length ?? 0) > 1) { + expect(isValidVIN(response.vehicles![0].vin), true, reason: Keys.invalidVIN); + } + if ((response.vehicles?.length ?? 0) > 2) { + expect(isValidVIN(response.vehicles![1].vin), true, reason: Keys.invalidVIN); + } + if ((response.vehicles?.length ?? 0) > 3) { + expect(isValidVIN(response.vehicles![2].vin), true, reason: Keys.invalidVIN); + } + if ((response.households?.length ?? 0) > 2) { + expect(Uuid.isValidUUID(fromString: response.households![1].householdId), true); + } + if ((response.households?.length ?? 0) > 3) { + expect(Uuid.isValidUUID(fromString: response.households![2].householdId), true); + } + }); + + /// max 6 vehicles + test('vehicles_for_household', () async { + final response = await APIMock().getVehiclesForHousehold(); + if (response.length > 1) { + expect(int.parse(response[0].range) >= 0, true); + expect(isValidVIN(response[0].vin), true, reason: Keys.invalidVIN); + expect((int.parse(response[0].battery)) >= 0, true, reason: Keys.negativeRange); + expect(VehicleHealth.values.map((e) => e.name).toList().contains(response[0].vehicleHealth.name), true); + expect(VehicleRangeStatus.values.map((e) => e.name).toList().contains(response[0].vehicleStatus.name), true); + } + if (response.length > 2) { + expect(int.parse(response[1].range) >= 0, true); + expect(isValidVIN(response[1].vin), true, reason: Keys.invalidVIN); + expect((int.parse(response[1].battery)) >= 0, true, reason: Keys.negativeRange); + expect(VehicleHealth.values.map((e) => e.name).toList().contains(response[1].vehicleHealth.name), true); + expect(VehicleRangeStatus.values.map((e) => e.name).toList().contains(response[1].vehicleStatus.name), true); + } + if (response.length > 3) { + expect(int.parse(response[0].range) >= 0, true); + expect(isValidVIN(response[2].vin), true, reason: Keys.invalidVIN); + expect((int.parse(response[2].battery)) >= 0, true, reason: Keys.negativeRange); + expect(VehicleHealth.values.map((e) => e.name).toList().contains(response[2].vehicleHealth.name), true); + expect(VehicleRangeStatus.values.map((e) => e.name).toList().contains(response[2].vehicleStatus.name), true); + } + if (response.length > 4) { + expect(int.parse(response[3].range) >= 0, true); + expect(isValidVIN(response[3].vin), true, reason: Keys.invalidVIN); + expect((int.parse(response[3].battery)) >= 0, true, reason: Keys.negativeRange); + expect(VehicleHealth.values.map((e) => e.name).toList().contains(response[3].vehicleHealth.name), true); + expect(VehicleRangeStatus.values.map((e) => e.name).toList().contains(response[3].vehicleStatus.name), true); + } + if (response.length > 5) { + expect(int.parse(response[0].range) >= 0, true); + expect(isValidVIN(response[4].vin), true, reason: Keys.invalidVIN); + expect((int.parse(response[4].battery)) >= 0, true, reason: Keys.negativeRange); + expect(VehicleHealth.values.map((e) => e.name).toList().contains(response[4].vehicleHealth.name), true); + expect(VehicleRangeStatus.values.map((e) => e.name).toList().contains(response[4].vehicleStatus.name), true); + } + if (response.length > 6) { + expect(int.parse(response[0].range) >= 0, true); + expect(isValidVIN(response[5].vin), true, reason: Keys.invalidVIN); + expect((int.parse(response[5].battery)) >= 0, true, reason: Keys.negativeRange); + expect(VehicleHealth.values.map((e) => e.name).toList().contains(response[5].vehicleHealth.name), true); + expect(VehicleRangeStatus.values.map((e) => e.name).toList().contains(response[5].vehicleStatus.name), true); + } + }); + + /// max 3 chargers + test('chargers_for_household', () async { + final response = await APIMock().getChargerForHousehold(); + if (response.length > 1) { + expect((response[0].chargerDetails?.chargerRate?.value ?? 0) > 0, true); + expect( + DateTime.now() + .difference(convertUnixSeconds(response[0].chargerDetails?.estimatedCompleteBy ?? '0')) + .isNegative, + false); + } + if (response.length > 2) { + if (response[1].chargerDetails?.chargerRate?.value != null) { + expect(response[1].chargerDetails!.chargerRate!.value > 0, true); + } + expect( + DateTime.now() + .difference(convertUnixSeconds(response[1].chargerDetails?.estimatedCompleteBy ?? '0')) + .isNegative, + false); + } + if (response.length > 3) { + if (response[2].chargerDetails?.chargerRate?.value != null) { + expect(response[2].chargerDetails!.chargerRate!.value > 0, true); + } + expect( + DateTime.now() + .difference(convertUnixSeconds(response[2].chargerDetails?.estimatedCompleteBy ?? '0')) + .isNegative, + false); + } + }); +} diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 00000000..c70d5cbc --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,27 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + // await tester.pumpWidget(const HomePage()); + + // Verify that our counter starts at 0. + // expect(find.text('0'), findsOneWidget); + // expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + // await tester.tap(find.byIcon(Icons.add)); + // await tester.pump(); + + // Verify that our counter has incremented. + // expect(find.text('0'), findsNothing); + // expect(find.text('1'), findsOneWidget); + }); +} From 22927ebaf3a0e5232b6a06f5eaef489933edc619 Mon Sep 17 00:00:00 2001 From: adam-carbone Date: Fri, 9 Aug 2024 17:44:19 -0400 Subject: [PATCH 5/5] Updates to the base app that represent a new sample app and best practices learned on last project --- lib/main.dart | 10 +- lib/src/api/api.dart | 14 +- lib/src/api/api_endpoints.dart | 3 + lib/src/api/base_api.dart | 9 +- lib/src/api/dio_interceptor.dart | 8 +- lib/src/api/mock_api.dart | 23 +- lib/src/common_widgets/app_bar.dart | 70 +- .../presentation/bluetooth_scanner.dart | 2 +- .../country_select/data/providers.dart | 10 + .../presentation}/country_select.dart | 3 +- lib/src/common_widgets/info_text_dialog.dart | 4 +- lib/src/common_widgets/password_input.dart | 6 +- lib/src/common_widgets/select_builder.dart | 5 +- .../state_select/data/providers.dart | 12 + .../presentation/state_select.dart | 56 ++ lib/src/common_widgets/subsection_title.dart | 2 +- lib/src/common_widgets/text_input.dart | 6 +- lib/src/constants/theme_data.dart | 2 +- .../account/data/account_provider.dart | 4 +- .../presentation/add_account_flow.dart | 645 ------------------ .../account/presentation/eula_transition.dart | 2 +- .../account/presentation/eula_view.dart | 4 +- lib/src/features/login/data/providers.dart | 2 +- .../login/presentation/check_eula.dart | 1 + .../presentation/forgot_password_page.dart | 1 + .../login/presentation/login_transition.dart | 1 + .../login/presentation/logout_transition.dart | 1 + .../report/data/report_providers.dart | 5 +- .../features/report/domain/report_data.dart | 2 +- .../features/report/domain/report_frame.dart | 5 +- .../report/presentation/bar_view.dart | 10 +- .../report/presentation/report_bar_view.dart | 24 +- .../presentation/report_table_page.dart | 46 ++ .../report/presentation/reports_page.dart | 6 +- .../presentation/time_window_select.dart | 6 +- .../presentation/vehicle_report_table.dart | 5 +- lib/src/root/data/providers.dart | 12 + lib/src/{ => root}/domain/account.dart | 0 .../{ => root}/domain/basic_api_response.dart | 0 lib/src/root/domain/contact.dart | 34 + lib/src/{ => root}/domain/country_data.dart | 2 +- lib/src/{ => root}/domain/item.dart | 0 lib/src/{ => root}/domain/label_value.dart | 2 +- lib/src/{ => root}/domain/user.dart | 0 lib/src/{ => root}/domain/wifi_details.dart | 0 .../presentation}/accounts_page.dart | 166 +---- lib/src/root/presentation/contact_view.dart | 29 + .../{ => root/presentation}/home_page.dart | 39 +- .../{ => root/presentation}/setup_screen.dart | 0 .../presentation}/setup_success_page.dart | 0 lib/src/routing/app_router.dart | 23 +- lib/src/utils/feature_constraints.dart | 102 --- mock/contacts.json | 242 +++++++ 53 files changed, 608 insertions(+), 1058 deletions(-) create mode 100644 lib/src/common_widgets/country_select/data/providers.dart rename lib/src/common_widgets/{ => country_select/presentation}/country_select.dart (92%) create mode 100644 lib/src/common_widgets/state_select/data/providers.dart create mode 100644 lib/src/common_widgets/state_select/presentation/state_select.dart delete mode 100644 lib/src/features/account/presentation/add_account_flow.dart create mode 100644 lib/src/features/report/presentation/report_table_page.dart create mode 100644 lib/src/root/data/providers.dart rename lib/src/{ => root}/domain/account.dart (100%) rename lib/src/{ => root}/domain/basic_api_response.dart (100%) create mode 100644 lib/src/root/domain/contact.dart rename lib/src/{ => root}/domain/country_data.dart (92%) rename lib/src/{ => root}/domain/item.dart (100%) rename lib/src/{ => root}/domain/label_value.dart (90%) rename lib/src/{ => root}/domain/user.dart (100%) rename lib/src/{ => root}/domain/wifi_details.dart (100%) rename lib/src/{ => root/presentation}/accounts_page.dart (66%) create mode 100644 lib/src/root/presentation/contact_view.dart rename lib/src/{ => root/presentation}/home_page.dart (60%) rename lib/src/{ => root/presentation}/setup_screen.dart (100%) rename lib/src/{ => root/presentation}/setup_success_page.dart (100%) delete mode 100644 lib/src/utils/feature_constraints.dart create mode 100644 mock/contacts.json diff --git a/lib/main.dart b/lib/main.dart index 57a156d9..296a74f6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,7 +4,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart' show ConsumerWidget, ProviderScope, WidgetRef; -import 'package:flutter_starter_base_app/main.reflectable.dart'; import 'package:flutter_starter_base_app/src/routing/app_router.dart' show goRouterProvider; import 'package:flutter_starter_base_app/src/utils/error_handler.dart'; import 'package:flutter_starter_base_app/src/constants/theme_data.dart'; @@ -13,7 +12,6 @@ void main() async { FlutterNativeSplash.preserve(widgetsBinding: WidgetsFlutterBinding.ensureInitialized()); await EasyLocalization.ensureInitialized(); registerErrorHandlers(); - initializeReflectable(); FlutterNativeSplash.remove(); runApp(ProviderScope( child: EasyLocalization( @@ -25,18 +23,18 @@ void main() async { startLocale: LocalizationService.getDeviceLocale(), saveLocale: false, assetLoader: AssetHandler(), - child: const EVChargerApp()))); + child: const App()))); } -class EVChargerApp extends ConsumerWidget { - const EVChargerApp({super.key}); +class App extends ConsumerWidget { + const App({super.key}); @override Widget build(BuildContext context, WidgetRef ref) => MaterialApp.router( localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, - theme: DanlawTheme().themeData, + theme: DefaultTheme().themeData, debugShowCheckedModeBanner: false, routerConfig: ref.watch(goRouterProvider), ); diff --git a/lib/src/api/api.dart b/lib/src/api/api.dart index 76084296..81c55ee3 100644 --- a/lib/src/api/api.dart +++ b/lib/src/api/api.dart @@ -2,9 +2,10 @@ import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter_starter_base_app/src/domain/account.dart'; -import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; -import 'package:flutter_starter_base_app/src/domain/country_data.dart'; +import 'package:flutter_starter_base_app/src/root/domain/account.dart'; +import 'package:flutter_starter_base_app/src/root/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/root/domain/contact.dart'; +import 'package:flutter_starter_base_app/src/root/domain/country_data.dart'; import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; import 'package:flutter_starter_base_app/src/utils/authentication_handler.dart'; import 'package:flutter_starter_base_app/src/features/account/domain/create_account.dart'; @@ -26,6 +27,12 @@ class API implements BaseAPI { : throw Exception('Cannot Authenticate. Please login again.') : Options(headers: {"Authorization": "No Authorization", "Content-Type": "application/json"}); + @override + Future> getData() { + // TODO: implement getData + throw UnimplementedError(); + } + @override Future login({required String username, required String password}) async { try { @@ -228,5 +235,6 @@ class API implements BaseAPI { } throw Exception('Failed to fetch vehicle report list'); } + } diff --git a/lib/src/api/api_endpoints.dart b/lib/src/api/api_endpoints.dart index d40897bb..8f3ce04e 100644 --- a/lib/src/api/api_endpoints.dart +++ b/lib/src/api/api_endpoints.dart @@ -3,6 +3,9 @@ import 'package:flutter_starter_base_app/src/constants/env_constants.dart'; class APIEndpoint { static const apiPath = "${EnvValues.apiEnv}/${EnvValues.apiVersion}"; + // Example API Endpoint Path + static const String data = '$apiPath/data'; + /// Account static const String auth = '$apiPath/auth/login'; static const String refreshToken = '$apiPath/auth/refresh-token'; diff --git a/lib/src/api/base_api.dart b/lib/src/api/base_api.dart index 22ac6c48..9530d2d6 100644 --- a/lib/src/api/base_api.dart +++ b/lib/src/api/base_api.dart @@ -1,11 +1,14 @@ -import 'package:flutter_starter_base_app/src/domain/account.dart'; -import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; -import 'package:flutter_starter_base_app/src/domain/country_data.dart'; +import 'package:flutter_starter_base_app/src/root/domain/account.dart'; +import 'package:flutter_starter_base_app/src/root/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/root/domain/contact.dart'; +import 'package:flutter_starter_base_app/src/root/domain/country_data.dart'; import 'package:flutter_starter_base_app/src/features/account/domain/eula.dart'; import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; mixin BaseAPI { + Future> getData(); + Future login({required String username, required String password}); Future refreshToken(); diff --git a/lib/src/api/dio_interceptor.dart b/lib/src/api/dio_interceptor.dart index e361e780..5cbb2672 100644 --- a/lib/src/api/dio_interceptor.dart +++ b/lib/src/api/dio_interceptor.dart @@ -13,7 +13,13 @@ class MockInterceptor extends Interceptor { data: await loadData('countries'), )); } - + if (options.path == APIEndpoint.data) { + return handler.resolve(Response( + requestOptions: options, + statusCode: 200, + data: await loadData('contacts'), + )); + } if (options.path == APIEndpoint.accountDetails) { return handler.resolve(Response( requestOptions: options, diff --git a/lib/src/api/mock_api.dart b/lib/src/api/mock_api.dart index 3383e8a9..e737a3f8 100644 --- a/lib/src/api/mock_api.dart +++ b/lib/src/api/mock_api.dart @@ -1,9 +1,12 @@ +import 'dart:convert'; + import 'package:flutter_starter_base_app/src/api/api_endpoints.dart'; import 'package:flutter_starter_base_app/src/api/base_api.dart'; import 'package:flutter_starter_base_app/src/api/dio_interceptor.dart'; -import 'package:flutter_starter_base_app/src/domain/account.dart'; -import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; -import 'package:flutter_starter_base_app/src/domain/country_data.dart'; +import 'package:flutter_starter_base_app/src/root/domain/account.dart'; +import 'package:flutter_starter_base_app/src/root/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/root/domain/contact.dart'; +import 'package:flutter_starter_base_app/src/root/domain/country_data.dart'; import 'package:flutter_starter_base_app/src/features/account/domain/eula.dart'; import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; import 'package:dio/dio.dart'; @@ -18,6 +21,20 @@ class APIMock implements BaseAPI { dio.interceptors.add(MockInterceptor()); } + @override + Future> getData() async { + List data = List.empty(growable: true); + try { + var contactsJson = (await dio.get(APIEndpoint.data)).data; + for (int i = 0; i < contactsJson.length; i++) { + data.add(Contact.fromJson(contactsJson[i])); + } + } catch (e) { + debugPrint(e.toString()); + } + return data; + } + @override Future login({required String username, required String password}) async { try { diff --git a/lib/src/common_widgets/app_bar.dart b/lib/src/common_widgets/app_bar.dart index e0d33636..98e8a897 100644 --- a/lib/src/common_widgets/app_bar.dart +++ b/lib/src/common_widgets/app_bar.dart @@ -8,7 +8,6 @@ import 'package:go_router/go_router.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_starter_base_app/src/constants/svg_loader.dart'; -import 'package:flutter_starter_base_app/src/utils/feature_constraints.dart'; import 'package:flutter_starter_base_app/src/common_widgets/hamburger_menu.dart'; class CustomAppBar extends ConsumerWidget implements PreferredSizeWidget { @@ -51,59 +50,22 @@ class CustomAppBar extends ConsumerWidget implements PreferredSizeWidget { actions: [ if (showHamburgerMenu) SizedBox( - child: HamburgerMenu(menuItemList: [ - HamburgerMenuItem( - title: LocaleKeys.btn_addHousehold.tr(), - function: () async => await FeatureConstraints() - .canCreateFeature(ref, featureType: FeatureType.household, overrideThreshold: true) - .then((validation) { - if (validation) { - context.push('/${AppRoute.addHousehold.name}'); - } else { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("You have reached maximum limit of households"))); - } - })), - HamburgerMenuItem( - title: LocaleKeys.charger_wizard_addChargerTitle.tr(), - function: () async => await FeatureConstraints() - .canCreateFeature(ref, featureType: FeatureType.charger, overrideThreshold: true) - .then((validation) { - if (validation) { - context.push('/${AppRoute.addCharger.name}'); - } else { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("You have reached maximum limit of chargers"))); - } - })), - HamburgerMenuItem( - title: LocaleKeys.vehicle_wizard_addVehicleTitle.tr(), - function: () async => await FeatureConstraints() - .canCreateFeature(ref, featureType: FeatureType.vehicle) - .then((validation) { - if (validation) { - context.push('/${AppRoute.addVehicle.name}'); - } else { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("You have reached maximum limit of vehicles"))); - } - })), - HamburgerMenuItem( - title: LocaleKeys.btn_support.tr(), - tailIcon: Padding(padding: const EdgeInsets.only(right: 6), child: SVGLoader().externalLinkIcon), - function: () async => await launchUrl(Uri.parse('https://www.danlawinc.com/contact-us'), - mode: LaunchMode.externalApplication)), - HamburgerMenuItem( - title: LocaleKeys.btn_accessaries.tr(), - function: () async => - await launchUrl(Uri.parse('https://www.danlawinc.com'), mode: LaunchMode.externalApplication), - tailIcon: Padding(padding: const EdgeInsets.only(right: 6), child: SVGLoader().externalLinkIcon)), - HamburgerMenuItem( - title: LocaleKeys.btn_logout.tr(), - function: () async => WidgetsBinding.instance - .addPostFrameCallback((_) => context.goNamed(AppRoute.logoutPageTransition.name)), - tailIcon: const Icon(Icons.logout)) - ])), + child: HamburgerMenu( + menuItemList: [ + HamburgerMenuItem( + title: "Navigation Example", + function: () async { + if (false) { + context.push('/${AppRoute.addCharger.name}'); + } else { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("You are not able to Navigate there"))); + } + } + ), + ] + ) + ), if (!showHamburgerMenu && customActionIcon != null) IconButton(icon: customActionIcon!, onPressed: onCustomActionPressed) ]); diff --git a/lib/src/common_widgets/bluetooth_scanner/presentation/bluetooth_scanner.dart b/lib/src/common_widgets/bluetooth_scanner/presentation/bluetooth_scanner.dart index 8b08eeaf..342fbfe4 100644 --- a/lib/src/common_widgets/bluetooth_scanner/presentation/bluetooth_scanner.dart +++ b/lib/src/common_widgets/bluetooth_scanner/presentation/bluetooth_scanner.dart @@ -59,7 +59,7 @@ class _BluetoothHandlerState extends ConsumerState { child: Row(children: [ Text(scanResult.advertisementData.advName, overflow: TextOverflow.ellipsis, - style: DanlawTheme().defaultTextStyle(18), + style: DefaultTheme().defaultTextStyle(18), softWrap: false, maxLines: 1), const Spacer(), diff --git a/lib/src/common_widgets/country_select/data/providers.dart b/lib/src/common_widgets/country_select/data/providers.dart new file mode 100644 index 00000000..0da5a833 --- /dev/null +++ b/lib/src/common_widgets/country_select/data/providers.dart @@ -0,0 +1,10 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/root/domain/country_data.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:flutter_starter_base_app/src/api/api_facade.dart'; + +part 'providers.g.dart'; + + +@riverpod +Future> fetchCountryList(FetchCountryListRef ref) async => (await APIFacade().getApi()).getCountries(); diff --git a/lib/src/common_widgets/country_select.dart b/lib/src/common_widgets/country_select/presentation/country_select.dart similarity index 92% rename from lib/src/common_widgets/country_select.dart rename to lib/src/common_widgets/country_select/presentation/country_select.dart index d4e1fa21..087c00c1 100644 --- a/lib/src/common_widgets/country_select.dart +++ b/lib/src/common_widgets/country_select/presentation/country_select.dart @@ -1,11 +1,12 @@ import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; -import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/country_select/data/providers.dart'; import 'package:flutter_starter_base_app/src/common_widgets/select_builder.dart'; import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:flutter_starter_base_app/src/root/domain/item.dart'; import 'package:go_router/go_router.dart'; class CountrySelect extends ConsumerWidget { diff --git a/lib/src/common_widgets/info_text_dialog.dart b/lib/src/common_widgets/info_text_dialog.dart index 783eef5f..d7952b03 100644 --- a/lib/src/common_widgets/info_text_dialog.dart +++ b/lib/src/common_widgets/info_text_dialog.dart @@ -11,9 +11,9 @@ Future showInfoDialog( shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12))), insetPadding: const EdgeInsets.symmetric(horizontal: 40), title: Text(label), - titleTextStyle: DanlawTheme().defaultTextStyle(14), + titleTextStyle: DefaultTheme().defaultTextStyle(14), content: Text(content, maxLines: 5), - contentTextStyle: DanlawTheme().defaultTextStyle(14), + contentTextStyle: DefaultTheme().defaultTextStyle(14), actionsAlignment: MainAxisAlignment.start, actions: [ TextButton(child: const Text("OK"), onPressed: () => context.pop()), diff --git a/lib/src/common_widgets/password_input.dart b/lib/src/common_widgets/password_input.dart index c4d58ba3..0ae4f4c3 100644 --- a/lib/src/common_widgets/password_input.dart +++ b/lib/src/common_widgets/password_input.dart @@ -21,7 +21,7 @@ class PasswordInputField extends ConsumerWidget { flex: 1, fit: FlexFit.tight, child: Row(children: [ - Text(mainText, style: DanlawTheme().defaultTextStyle(18)), + Text(mainText, style: DefaultTheme().defaultTextStyle(18)), Tooltip( message: 'description', child: Container(padding: const EdgeInsets.only(left: 10), child: SVGLoader().questionMark)) @@ -35,7 +35,7 @@ class PasswordInputField extends ConsumerWidget { obscuringCharacter: "*", cursorColor: CustomColors().primaryTextColor, onChanged: (newPassword) => ref.watch(password.notifier).update((state) => newPassword), - style: DanlawTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor), + style: DefaultTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor), decoration: InputDecoration( filled: true, hintText: hintText, @@ -43,6 +43,6 @@ class PasswordInputField extends ConsumerWidget { fillColor: Colors.transparent, hintTextDirection: TextDirection.rtl, hintStyle: - DanlawTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor)))) + DefaultTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor)))) ]))); } diff --git a/lib/src/common_widgets/select_builder.dart b/lib/src/common_widgets/select_builder.dart index bd320335..2ccce43a 100644 --- a/lib/src/common_widgets/select_builder.dart +++ b/lib/src/common_widgets/select_builder.dart @@ -1,7 +1,8 @@ import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import '../domain/item.dart'; +import 'package:flutter_starter_base_app/src/root/domain/item.dart'; + class SelectBuilder extends StatefulWidget { const SelectBuilder({ @@ -46,7 +47,7 @@ class _SelectBuilderState extends State { contentPadding: EdgeInsets.zero, minVerticalPadding: 11, minTileHeight: 11, - title: Text(item.label, style: DanlawTheme().defaultTextStyle(17)), + title: Text(item.label, style: DefaultTheme().defaultTextStyle(17)), trailing: isSelected ? Icon(CupertinoIcons.check_mark, color: CustomColors().primaryTextColor) : null, onTap: () => _onItemTap(item), ); diff --git a/lib/src/common_widgets/state_select/data/providers.dart b/lib/src/common_widgets/state_select/data/providers.dart new file mode 100644 index 00000000..bb8065ae --- /dev/null +++ b/lib/src/common_widgets/state_select/data/providers.dart @@ -0,0 +1,12 @@ +import 'package:flutter_starter_base_app/src/api/api_facade.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/bluetooth_scanner/domain/bluetooth_response.dart'; +import 'package:flutter_starter_base_app/src/root/domain/country_data.dart'; +import 'package:wifi_scan/wifi_scan.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'providers.g.dart'; + +@riverpod +Future> fetchStateList(FetchStateListRef ref, {required String countryName}) async => + (await APIFacade().getApi()).getStates(countryName: countryName); \ No newline at end of file diff --git a/lib/src/common_widgets/state_select/presentation/state_select.dart b/lib/src/common_widgets/state_select/presentation/state_select.dart new file mode 100644 index 00000000..82d88b11 --- /dev/null +++ b/lib/src/common_widgets/state_select/presentation/state_select.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/select_builder.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/state_select/data/providers.dart'; +import 'package:flutter_starter_base_app/src/root/domain/item.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; + +class StateSelect extends ConsumerWidget { + const StateSelect({super.key, required this.countryName, this.initialSelection}); + + final String countryName; + final Item? initialSelection; + + @override + Widget build(BuildContext context, WidgetRef ref) { + void onStateSelection(List choosenItemList) { + if (choosenItemList.length == 1) { + debugPrint("choosen item: ${choosenItemList.first.label}"); + context.pop(choosenItemList.first); + return; + } + context.pop(); + } + + return Scaffold( + appBar: CustomAppBar( + showBackButton: true, + titleWidget: Text(LocaleKeys.household_state.tr()), + showHamburgerMenu: false, + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + child: ref.watch(fetchStateListProvider(countryName: countryName)).when( + data: (List itemList) { + return SelectBuilder( + onSelect: onStateSelection, + items: itemList, + initialSelection: initialSelection != null ? [initialSelection!] : null, + ); + }, + error: (error, stackTrace) { + WidgetsBinding.instance.addPostFrameCallback((_) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Center(child: Text('$error')))); + }); + return Container(); + }, + loading: () => const LoadingAnimation(), + ), + ), + ); + } +} diff --git a/lib/src/common_widgets/subsection_title.dart b/lib/src/common_widgets/subsection_title.dart index ce394400..0ca19f12 100644 --- a/lib/src/common_widgets/subsection_title.dart +++ b/lib/src/common_widgets/subsection_title.dart @@ -9,5 +9,5 @@ class SubSectionTitle extends StatelessWidget { @override Widget build(BuildContext context) => Padding( padding: const EdgeInsets.only(left: 15, right: 10, top: 15, bottom: 5), - child: Text(text, style: DanlawTheme().defaultTextStyle(12).copyWith(color: CustomColors().lightGrayText))); + child: Text(text, style: DefaultTheme().defaultTextStyle(12).copyWith(color: CustomColors().lightGrayText))); } diff --git a/lib/src/common_widgets/text_input.dart b/lib/src/common_widgets/text_input.dart index c5fa518b..a524fc3f 100644 --- a/lib/src/common_widgets/text_input.dart +++ b/lib/src/common_widgets/text_input.dart @@ -30,7 +30,7 @@ class TextInputField extends ConsumerWidget { flex: 1, fit: FlexFit.tight, child: Row(children: [ - Text(mainText, style: DanlawTheme().defaultTextStyle(18)), + Text(mainText, style: DefaultTheme().defaultTextStyle(18)), Tooltip( message: 'description', child: Container(padding: const EdgeInsets.only(left: 10), child: SVGLoader().questionMark)) @@ -42,7 +42,7 @@ class TextInputField extends ConsumerWidget { autofocus: true, cursorColor: CustomColors().primaryTextColor, onChanged: (newPassword) => ref.watch(textProvider.notifier).update((state) => newPassword), - style: DanlawTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor), + style: DefaultTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor), validator: validator, inputFormatters: inputFormatter == null ? [] : [inputFormatter!], decoration: InputDecoration( @@ -52,6 +52,6 @@ class TextInputField extends ConsumerWidget { fillColor: Colors.transparent, hintTextDirection: TextDirection.rtl, hintStyle: - DanlawTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor)))) + DefaultTheme().defaultTextStyle(15).copyWith(color: CustomColors().primaryTextColor)))) ]))); } diff --git a/lib/src/constants/theme_data.dart b/lib/src/constants/theme_data.dart index f4b2f84d..2b5b954c 100644 --- a/lib/src/constants/theme_data.dart +++ b/lib/src/constants/theme_data.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; const primaryColor = Colors.black; -class DanlawTheme { +class DefaultTheme { TextStyle defaultTextStyle(double fontSize) => TextStyle(color: Colors.white, fontSize: fontSize, overflow: TextOverflow.ellipsis); BoxDecoration getColoredBoxDecoration(Color color) => BoxDecoration( diff --git a/lib/src/features/account/data/account_provider.dart b/lib/src/features/account/data/account_provider.dart index 8640dea9..98e76a8d 100644 --- a/lib/src/features/account/data/account_provider.dart +++ b/lib/src/features/account/data/account_provider.dart @@ -1,7 +1,7 @@ import 'package:flutter_starter_base_app/src/api/api.dart'; import 'package:flutter_starter_base_app/src/api/api_facade.dart'; -import 'package:flutter_starter_base_app/src/domain/account.dart'; -import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/root/domain/account.dart'; +import 'package:flutter_starter_base_app/src/root/domain/basic_api_response.dart'; import 'package:flutter_starter_base_app/src/features/account/domain/create_account.dart'; import 'package:flutter_starter_base_app/src/features/account/domain/eula.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; diff --git a/lib/src/features/account/presentation/add_account_flow.dart b/lib/src/features/account/presentation/add_account_flow.dart deleted file mode 100644 index 73f46131..00000000 --- a/lib/src/features/account/presentation/add_account_flow.dart +++ /dev/null @@ -1,645 +0,0 @@ -import 'package:flutter_starter_base_app/src/common_widgets/action_text_button.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/custom_stepper.dart'; -import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; -import 'package:flutter_starter_base_app/src/features/account/domain/create_account.dart'; -import 'package:flutter_starter_base_app/src/features/account/presentation/add_account_page.dart'; -import 'package:flutter_starter_base_app/src/features/account/presentation/username_password_page.dart'; -import 'package:flutter_starter_base_app/src/features/account/presentation/default_contact_info_page.dart'; -import 'package:flutter_starter_base_app/src/features/account/presentation/eula_view.dart'; -import 'package:flutter_starter_base_app/src/utils/authentication_handler.dart'; -import 'package:dio/dio.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; -import 'package:easy_localization/easy_localization.dart'; - -class AddAccountFLow extends ConsumerStatefulWidget { - const AddAccountFLow({super.key}); - - @override - ConsumerState createState() => _AddAccountFLowState(); -} - -class _AddAccountFLowState extends ConsumerState { - List pages = []; - int currentStep = 0; - PageController pageController = PageController(); - bool complete = false; - String title = LocaleKeys.account_wizard_title.tr(); - bool isAccountCreated = false; - bool isHouseholdStepComplete = false; - PricingMethodType? pricingMethod; - String selectedUtility = ""; - String selectedRateProgram = ""; - var selectedCustomRate; - bool pricingMethodavailable = false; - bool utilityrateavailable = false; - bool rateprogrameavailble = false; - bool customrateavailble = false; - bool ispricingSelecte = false; - final GlobalKey _createaccountformKey = GlobalKey(); - final GlobalKey _createaccounthouseholdformKey = GlobalKey(); - final GlobalKey _createaccounthouseholdadressformKey = GlobalKey(); - final GlobalKey _createinfoformKey = GlobalKey(); -// / Controllers for Create Account form - TextEditingController usernameController = TextEditingController(); - TextEditingController passwordController = TextEditingController(); - TextEditingController confirmPasswordController = TextEditingController(); - // Controllers for Create Household form - TextEditingController nameController = TextEditingController(); - // Controllers for Create Household Address form - TextEditingController streetController = TextEditingController(); - TextEditingController street1Controller = TextEditingController(); - TextEditingController cityController = TextEditingController(); - TextEditingController zipCodeController = TextEditingController(); - TextEditingController countryController = TextEditingController(); - TextEditingController stateController = TextEditingController(); - // Controller for Info form - TextEditingController emailController = TextEditingController(); - TextEditingController phoneNumberController = TextEditingController(); - PricingMethodStep currentPricingMethodStep = PricingMethodStep.methodChooser; - @override - void initState() { - super.initState(); - pageController = PageController(initialPage: currentStep); - updateTitle(currentStep); - } - - @override - Widget build(BuildContext context) { - pages = [ - const AddAccountPage(), - UsernameandPasswordPage( - formKey: _createaccountformKey, - usernameController: usernameController, - passwordController: passwordController, - confirmPasswordController: confirmPasswordController, - ), - DefaultContactInfoPage( - formKey: _createinfoformKey, - emailController: emailController, - phoneNumberController: phoneNumberController, - ), - isHouseholdStepComplete - ? CreateHouseholdAddressPage( - formKey: _createaccounthouseholdadressformKey, - streetAccountController: streetController, - street1AccountController: street1Controller, - cityAccountController: cityController, - zipcodeAccountController: zipCodeController, - countryAccountController: countryController, - stateAccountController: stateController, - ) - : CreateHouseHoldNamePage( - formKey: _createaccounthouseholdformKey, - accountnameController: nameController, - ), - getPricingMethodWidget(), - ]; - - return Scaffold( - appBar: AppBar( - automaticallyImplyLeading: false, - centerTitle: false, - title: Text( - title, - style: TextStyle(fontSize: 20, fontWeight: FontWeight.w600, color: CustomColors().whitecolor), - ), - actions: [ - GestureDetector( - child: Container( - height: 24, - width: 24, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - border: Border.all(width: 0), - color: CustomColors().bgCloseIcon, - ), - child: Icon( - Icons.close_rounded, - size: 16, - color: CustomColors().closeIcon, - ), - ), - onTap: () => context.canPop() ? context.pop() : null), - ], - ), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: MediaQuery.of(context).size.width, - child: CustomStepper( - totalSteps: pages.length, - width: MediaQuery.of(context).size.width, - curStep: currentStep + 1, - stepCompleteColor: CustomColors().progressBarFilledColor, - currentStepColor: CustomColors().whitecolor, - inactiveColor: CustomColors().progressBarInactiveColor, - lineWidth: 0.7, - pageController: pageController, - ), - ), - const SizedBox(height: 10), - Expanded( - child: PageView.builder( - physics: const NeverScrollableScrollPhysics(), - controller: pageController, - itemCount: pages.length, - onPageChanged: (index) { - setState(() { - currentStep = index; - updateTitle(currentStep); - }); - }, - itemBuilder: (context, index) { - return pages[index]; - }, - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - currentStep == 0 - ? PrimaryButton( - backgroundColor: CustomColors().lightblueColor, - onPressed: () { - showDialog( - context: context, - builder: (BuildContext context) { - return EulaView( - onEULAAccepted: (bool acceptEULA) { - if (mounted && context.canPop()) context.pop(); - if (acceptEULA) { - goTo(1); // Navigate to the next step - } - }, - ); - }, - ); - }, - text: LocaleKeys.common_start.tr(), - ) - : PrimaryButton( - backgroundColor: CustomColors().lightblueColor, - text: getButtonLabel(), - onPressed: next, - ), - const SizedBox(width: 10), - ActionTextButton( - onPressed: currentStep == 0 ? () => context.pop(true) : back, - text: currentStep == 0 ? LocaleKeys.common_cancel.tr() : LocaleKeys.common_back.tr(), - ), - ], - ), - ), - ], - ), - ), - ); - } - - Widget getPricingMethodWidget() { - switch (currentPricingMethodStep) { - case PricingMethodStep.utilityChooser: - return UtilityChooser( - zipCode: zipCodeController.text, - showappbar: false, - onUtilitySelected: (utility) { - setState(() { - selectedUtility = utility; - ref.read(utilityProvider.notifier).selectUtility(utility); - }); - }, - ); - case PricingMethodStep.rateProgramChooser: - return RateProgramChooser( - showappbar: false, - onRateProgramSelected: (rateProgram) { - setState(() { - selectedRateProgram = rateProgram; - ref.read(rateProgramProvider.notifier).state = rateProgram; - }); - }, - ); - case PricingMethodStep.customRateChooser: - return CustomRateChooser( - onRateEntered: (rate) { - setState(() { - print("Parent received rate: $rate"); // Debug statement - selectedCustomRate = rate; - ref.read(customRateProvider.notifier).state = rate; - }); - }, - ); - default: - return AccountPricingMethodChooser( - onMethodSelected: (PricingMethodType method) { - setState(() { - pricingMethod = method; - }); - }, - onNext: next, - ); - } - } - - void back() { - if (currentStep == 4) { - if (currentPricingMethodStep == PricingMethodStep.utilityChooser) { - setState(() { - currentPricingMethodStep = PricingMethodStep.methodChooser; - }); - } else if (currentPricingMethodStep == PricingMethodStep.rateProgramChooser) { - setState(() { - currentPricingMethodStep = PricingMethodStep.utilityChooser; - }); - } else if (currentPricingMethodStep == PricingMethodStep.customRateChooser) { - setState(() { - currentPricingMethodStep = PricingMethodStep.methodChooser; - }); - } else { - goTo(currentStep - 1); - } - } else if (currentStep > 0) { - if (currentStep == 3 && isHouseholdStepComplete) { - setState(() { - isHouseholdStepComplete = false; - }); - } else { - goTo(currentStep - 1); - } - } - } - - void goTo(int step) { - setState(() { - currentStep = step; - }); - pageController.animateToPage( - step, - duration: const Duration(milliseconds: 500), - curve: Curves.ease, - ); - updateTitle(step); - } - - Future next() async { - bool isValid = true; - - if (currentStep == 1) { - isValid = _createaccountformKey.currentState!.validate(); - if (isValid) { - _createaccountformKey.currentState!.save(); - } - } - if (currentStep == 2) { - isValid = _createinfoformKey.currentState!.validate(); - if (isValid) { - _createinfoformKey.currentState!.save(); - await createAccount(context, ref); - if (!isAccountCreated) { - return; - } - } - } - if (currentStep == 3 && isAccountCreated) { - if (!isHouseholdStepComplete) { - isValid = _createaccounthouseholdformKey.currentState!.validate(); - if (isValid) { - _createaccounthouseholdformKey.currentState!.save(); - setState(() { - isHouseholdStepComplete = true; - }); - return; - } - } else { - isValid = _createaccounthouseholdadressformKey.currentState!.validate(); - if (isValid) { - _createaccounthouseholdadressformKey.currentState!.save(); - goTo(currentStep + 1); - return; - } - } - } - - if (currentStep == 4) { - if (pricingMethod == null) { - isValid = false; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Please select a pricing method.'), - ), - ); - } else { - ispricingSelecte = true; - if (pricingMethod == PricingMethodType.utilityRates) { - if (currentPricingMethodStep == PricingMethodStep.utilityChooser && selectedUtility == '') { - isValid = false; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Please select a utility company.'), - ), - ); - } else if (currentPricingMethodStep == PricingMethodStep.rateProgramChooser && selectedRateProgram == '') { - isValid = false; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Please select a rate program.'), - ), - ); - } - } else if (pricingMethod == PricingMethodType.manual) { - if (currentPricingMethodStep == PricingMethodStep.customRateChooser && selectedCustomRate == null) { - isValid = false; - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Please enter a custom rate.'), - ), - ); - } - } - } - } - if (isValid) { - if (currentStep == 4 && ispricingSelecte) { - if (pricingMethod == PricingMethodType.utilityRates) { - if (currentPricingMethodStep == PricingMethodStep.methodChooser) { - setState(() { - currentPricingMethodStep = PricingMethodStep.utilityChooser; - }); - } else if (currentPricingMethodStep == PricingMethodStep.utilityChooser && selectedUtility.isNotEmpty) { - setState(() { - currentPricingMethodStep = PricingMethodStep.rateProgramChooser; - }); - } else if (currentPricingMethodStep == PricingMethodStep.rateProgramChooser && - selectedRateProgram.isNotEmpty) { - createHouseholdDetails(); - } - } else if (pricingMethod == PricingMethodType.manual) { - if (currentPricingMethodStep == PricingMethodStep.methodChooser) { - setState(() { - currentPricingMethodStep = PricingMethodStep.customRateChooser; - }); - } else if (currentPricingMethodStep == PricingMethodStep.customRateChooser && selectedCustomRate != null) { - createHouseholdDetails(); - } - } else if (pricingMethod == PricingMethodType.chargerEstimatesCost) { - createHouseholdDetails(); - } else { - createHouseholdDetails(); - } - } - if (isValid && (currentStep < pages.length - 1)) { - goTo(currentStep + 1); - } else if (isValid && currentStep == pages.length - 1) { - createHouseholdDetails(); - } - } - } - - String getButtonLabel() { - if (currentStep == 4) { - if (currentPricingMethodStep == PricingMethodStep.methodChooser && pricingMethod == null) { - return pricingMethod == null ? 'Next' : 'Next'; - } else if (pricingMethod == PricingMethodType.utilityRates && - selectedUtility.isEmpty && - selectedRateProgram.isEmpty) { - return 'Next'; - } else if (PricingMethodType == PricingMethodType.utilityRates) { - return 'Next'; - } else if (currentPricingMethodStep == PricingMethodStep.utilityChooser) { - return 'Next'; - } else if (currentPricingMethodStep == PricingMethodStep.rateProgramChooser) { - return 'Finish'; - } else if (currentPricingMethodStep == PricingMethodStep.customRateChooser) { - return 'Finish'; - } else if (pricingMethod == PricingMethodType.manual && selectedCustomRate == null) { - return 'Next'; - } else if (pricingMethod == PricingMethodType.chargerEstimatesCost) { - return 'Finish'; - } - } - return currentStep == pages.length - 1 ? 'Next' : 'Next'; - } - - /// creating account - - Future createAccount(BuildContext context, WidgetRef ref) async { - final username = usernameController.text; - final password = passwordController.text; - final email = emailController.text; - final phoneNumber = phoneNumberController.text; - - final createAccountData = CreateAccountRequest( - username: username, - email: email, - password: password, - phoneNumber: "+${phoneNumber}", - languageCode: "en-US", - ); - - try { - final response = - await ref.read(createAccountProvider(createAccountRequest: createAccountData).future).then((response) { - if (response.status == 'success') { - attemptLogin(context, username: username, password: password); - - clearAccountFields(); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(response.message)), - ); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(response.message)), - ); - } - }); - } catch (e) { - String errorMessage = 'Failed to create account. Please try again.'; - if (e is DioException && e.response != null && e.response?.data != null) { - final responseData = e.response?.data; - print('Error response domain: $responseData'); - - if (responseData is Map && responseData.containsKey('message')) { - final dynamic message = responseData['message']; - errorMessage = message != null ? message.toString() : errorMessage; - } - } - print('Error: $e'); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(errorMessage)), - ); - } - } - - Future attemptLogin(BuildContext context, {required String username, required String password}) async { - try { - await ref.read(loginProvider(username: username, password: password).future); - if (context.mounted && (await AuthenticationHandler().canAuthenticateUser())) { - setState(() => isAccountCreated = true); - if (kDebugMode) print("Login successful"); - } else { - ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Cannot login at this moment.'))); - } - } catch (e) { - String errorMessage = 'Failed to Login. Please try again.'; - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(errorMessage)), - ); -} - } - - Future createHouseholdDetails() async { - final householdName = nameController.text; - final homeAddress = HouseAddress( - streetAddressFirstLine: streetController.text, - streetAddressSecondLine: street1Controller.text, - city: cityController.text, - state: stateController.text, - zipCode: zipCodeController.text, - country: countryController.text, - ); - PricingMethod? chargePricingMethod; - if (pricingMethod == PricingMethodType.utilityRates) { - chargePricingMethod = PricingMethod( - type: PricingMethodType.utilityRates, - utilityCompany: selectedUtility, - rateProgram: selectedRateProgram, - ); - } else if (pricingMethod == PricingMethodType.manual) { - chargePricingMethod = const PricingMethod( - type: PricingMethodType.manual, - ); - } else if (pricingMethod == PricingMethodType.chargerEstimatesCost) { - chargePricingMethod = const PricingMethod( - type: PricingMethodType.chargerEstimatesCost, - ); - } else { - throw Exception("Invalid pricing method selected"); - } - - try { - ref - .read(createHouseholdDetailsProvider( - householdName: householdName, - homeAddress: homeAddress, - chargePricingMethod: chargePricingMethod, - )) - .when( - data: (data) { - if (data.status == 'success') { - if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text('${data.message}'), - ), - ); - clearTextFields(); - clearSelections(); - if (context.canPop()) context.pop(true); - } - } - }, - error: (error, _) { - WidgetsBinding.instance.addPostFrameCallback((_) => ScaffoldMessenger.of(context).showSnackBar( - SnackBar(backgroundColor: CustomColors().darkestGrayBG, content: Center(child: Text('$error'))))); - return Container(); - }, - loading: () => const LoadingAnimation(), - ); - if (context.canPop()) context.pop(true); - } catch (e) { - if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text('Failed to create household. Please try again.'), - ), - ); - } - } - } - - void updateTitle(int step) { - setState(() { - switch (step) { - case 0: - title = LocaleKeys.account_wizard_title.tr(); - break; - case 1: - title = LocaleKeys.account_wizard_title.tr(); - - break; - case 2: - title = LocaleKeys.household_wizard_title.tr(); - break; - case 3: - title = LocaleKeys.household_wizard_title.tr(); - break; - case 4: - title = LocaleKeys.account_wizard_title.tr(); - break; - default: - title = LocaleKeys.account_wizard_title.tr(); - break; - } - }); - } - - void clearAccountFields() { - usernameController.clear(); - passwordController.clear(); - confirmPasswordController.clear(); - emailController.clear(); - phoneNumberController.clear(); - } - - void clearTextFields() { - nameController.clear(); - streetController.clear(); - street1Controller.dispose(); - cityController.clear(); - stateController.clear(); - zipCodeController.clear(); - countryController.clear(); - } - - void clearSelections() { - setState(() { - pricingMethod = null; - selectedUtility = ""; - selectedRateProgram = ""; - selectedCustomRate = null; - ref.read(utilityProvider.notifier).selectUtility(""); - ref.read(rateProgramProvider.notifier).state = null; - ref.read(customRateProvider.notifier).state = {}; - - currentPricingMethodStep = PricingMethodStep.methodChooser; - }); - } - - @override - void dispose() { - pageController.dispose(); - usernameController.dispose(); - passwordController.dispose(); - confirmPasswordController.dispose(); - emailController.dispose(); - phoneNumberController.dispose(); - nameController.dispose(); - streetController.dispose(); - street1Controller.dispose(); - cityController.dispose(); - stateController.dispose(); - countryController.dispose(); - super.dispose(); - } -} diff --git a/lib/src/features/account/presentation/eula_transition.dart b/lib/src/features/account/presentation/eula_transition.dart index 555cab28..68b2912d 100644 --- a/lib/src/features/account/presentation/eula_transition.dart +++ b/lib/src/features/account/presentation/eula_transition.dart @@ -18,7 +18,7 @@ class EULATransition extends ConsumerWidget { }); return Container(); }, - error: (error, stackTrace) => Center(child: Text('Error: $error', style: DanlawTheme().defaultTextStyle(20))), + error: (error, stackTrace) => Center(child: Text('Error: $error', style: DefaultTheme().defaultTextStyle(20))), loading: () => const LoadingAnimation()); } } diff --git a/lib/src/features/account/presentation/eula_view.dart b/lib/src/features/account/presentation/eula_view.dart index 01e0eb1b..4be7d606 100644 --- a/lib/src/features/account/presentation/eula_view.dart +++ b/lib/src/features/account/presentation/eula_view.dart @@ -43,7 +43,7 @@ class EulaView extends ConsumerWidget { return RichText( text: TextSpan( text: 'EULA INFORMATION\n\n', - style: DanlawTheme() + style: DefaultTheme() .defaultTextStyle(18) .copyWith(fontWeight: FontWeight.w600, color: primaryColor), children: [ @@ -54,7 +54,7 @@ class EulaView extends ConsumerWidget { }, error: (error, stackTrace) => Text( 'EULA INFORMATION\n\nCannot fetch EULA at this time. Please try again later.', - style: DanlawTheme().defaultTextStyle(18)), + style: DefaultTheme().defaultTextStyle(18)), loading: () => Container())))), SizedBox( diff --git a/lib/src/features/login/data/providers.dart b/lib/src/features/login/data/providers.dart index 594083d7..8d278a4d 100644 --- a/lib/src/features/login/data/providers.dart +++ b/lib/src/features/login/data/providers.dart @@ -1,5 +1,5 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_starter_base_app/src/domain/basic_api_response.dart'; +import 'package:flutter_starter_base_app/src/root/domain/basic_api_response.dart'; import 'package:flutter_starter_base_app/src/utils/authentication_handler.dart'; import 'package:flutter_starter_base_app/src/api/api.dart'; part 'providers.g.dart'; diff --git a/lib/src/features/login/presentation/check_eula.dart b/lib/src/features/login/presentation/check_eula.dart index c96f48a9..735213a9 100644 --- a/lib/src/features/login/presentation/check_eula.dart +++ b/lib/src/features/login/presentation/check_eula.dart @@ -1,4 +1,5 @@ import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:flutter_starter_base_app/src/features/account/data/account_provider.dart'; import 'package:flutter_starter_base_app/src/routing/routes.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/src/features/login/presentation/forgot_password_page.dart b/lib/src/features/login/presentation/forgot_password_page.dart index 41b3dfa5..1db7f967 100644 --- a/lib/src/features/login/presentation/forgot_password_page.dart +++ b/lib/src/features/login/presentation/forgot_password_page.dart @@ -1,5 +1,6 @@ import 'package:flutter_starter_base_app/src/common_widgets/action_text_button.dart'; import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +import 'package:flutter_starter_base_app/src/features/login/data/providers.dart'; import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; import 'package:flutter_starter_base_app/src/routing/routes.dart'; import 'package:easy_localization/easy_localization.dart'; diff --git a/lib/src/features/login/presentation/login_transition.dart b/lib/src/features/login/presentation/login_transition.dart index 9470f8fe..8c788ec4 100644 --- a/lib/src/features/login/presentation/login_transition.dart +++ b/lib/src/features/login/presentation/login_transition.dart @@ -1,3 +1,4 @@ +import 'package:flutter_starter_base_app/src/features/login/data/providers.dart'; import 'package:flutter_starter_base_app/src/routing/routes.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; diff --git a/lib/src/features/login/presentation/logout_transition.dart b/lib/src/features/login/presentation/logout_transition.dart index 9f73da94..bd50662c 100644 --- a/lib/src/features/login/presentation/logout_transition.dart +++ b/lib/src/features/login/presentation/logout_transition.dart @@ -1,3 +1,4 @@ +import 'package:flutter_starter_base_app/src/features/login/data/providers.dart'; import 'package:flutter_starter_base_app/src/routing/app_router.dart'; import 'package:flutter_starter_base_app/src/routing/routes.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/features/report/data/report_providers.dart b/lib/src/features/report/data/report_providers.dart index c2e7c3fc..510816e6 100644 --- a/lib/src/features/report/data/report_providers.dart +++ b/lib/src/features/report/data/report_providers.dart @@ -1,5 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; +import 'package:flutter_starter_base_app/src/root/domain/item.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_starter_base_app/src/api/api_facade.dart'; import 'package:flutter_starter_base_app/src/features/report/domain/report_by.dart'; @@ -8,7 +9,7 @@ import 'package:flutter_starter_base_app/src/features/report/domain/report_frame part 'report_providers.g.dart'; @riverpod -Future> reportData(ReportDataRef ref, {required String timeWindow}) async { +Future> reportData(ReportDataRef ref, {required String timeWindow}) async { return await (await APIFacade().getApi()).getReportData(timeWindow); } diff --git a/lib/src/features/report/domain/report_data.dart b/lib/src/features/report/domain/report_data.dart index d5ca2980..e7383f55 100644 --- a/lib/src/features/report/domain/report_data.dart +++ b/lib/src/features/report/domain/report_data.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:flutter_starter_base_app/src/root/domain/item.dart'; import 'package:json_annotation/json_annotation.dart'; part 'report_data.g.dart'; diff --git a/lib/src/features/report/domain/report_frame.dart b/lib/src/features/report/domain/report_frame.dart index 0dd91aab..b373b9e1 100644 --- a/lib/src/features/report/domain/report_frame.dart +++ b/lib/src/features/report/domain/report_frame.dart @@ -1,5 +1,5 @@ -import 'package:flutter_starter_base_app/src/domain/item.dart'; -import 'package:flutter_starter_base_app/src/domain/label_value.dart'; +import 'package:flutter_starter_base_app/src/root/domain/item.dart'; +import 'package:flutter_starter_base_app/src/root/domain/label_value.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:flutter_starter_base_app/src/utils/string_extension.dart'; part 'report_frame.g.dart'; @@ -22,6 +22,7 @@ class TimeWindow extends LabelValuePair with Item { timeWindowEum: TimeWindowEnum.values.firstWhere((e) => labelValuePair.value == e.name)); factory TimeWindow.fromJson(String json) => TimeWindow(value: json, label: json, timeWindowEum: $enumDecode(_$TimeWindowEnumEnumMap, json)); + @override Map toJson() => _$TimeWindowToJson(this); static List get values => diff --git a/lib/src/features/report/presentation/bar_view.dart b/lib/src/features/report/presentation/bar_view.dart index 4a4489ed..a706c920 100644 --- a/lib/src/features/report/presentation/bar_view.dart +++ b/lib/src/features/report/presentation/bar_view.dart @@ -14,16 +14,16 @@ import 'package:flutter_starter_base_app/src/features/report/presentation/bar_ba //todo handle multiple unknown vehicles? class BarView extends ConsumerWidget { - final List reportList; + final List reportData; - const BarView({super.key, required this.reportList}); + const BarView({super.key, required this.reportData}); @override Widget build(BuildContext context, WidgetRef ref) { ref.watch(triggerPage); bool reportByCost = ref.read(reportBy) == ReportBy.cost; final barViewCalculator = BarViewCalculator( - values: reportList + values: reportData .map((ReportData reportData) => reportData.x + reportData.y) .toList()); return Padding( @@ -41,7 +41,7 @@ class BarView extends ConsumerWidget { Text(step, style: TextStyle(color: CustomColors().lighterGrayText, fontSize: 14))) .toList())) ] + - reportList.map((ReportData reportData) { + reportData.map((ReportData reportData) { double homeTotal = reportData.x; double publicTotal = reportData.y; double total = homeTotal + publicTotal; @@ -77,7 +77,7 @@ class BarView extends ConsumerWidget { ]) ]))), const SizedBox(height: 10), - Text(reportData.label, style: DanlawTheme().defaultTextStyle(15)), + Text(reportData.label, style: DefaultTheme().defaultTextStyle(15)), const SizedBox(height: 20) ]); }).toList())); diff --git a/lib/src/features/report/presentation/report_bar_view.dart b/lib/src/features/report/presentation/report_bar_view.dart index e2f072c9..9cd20a64 100644 --- a/lib/src/features/report/presentation/report_bar_view.dart +++ b/lib/src/features/report/presentation/report_bar_view.dart @@ -2,31 +2,23 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; import 'package:flutter_starter_base_app/src/features/report/data/report_providers.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; import 'package:flutter_starter_base_app/src/features/report/presentation/bar_view.dart'; -import 'package:flutter_starter_base_app/src/features/vehicle/domain/report_vehicle.dart'; -import 'package:flutter_starter_base_app/src/features/charger/domain/charger_details.dart'; import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; class ReportBarView extends ConsumerWidget { - final ReportListProvider? reportList; - const ReportBarView({super.key, required this.reportList}); + final ReportDataProvider? reportDataProvider; + const ReportBarView({super.key, required this.reportDataProvider}); @override - Widget build(BuildContext context, WidgetRef ref) => reportList == null + Widget build(BuildContext context, WidgetRef ref) => reportDataProvider == null ? Padding( padding: const EdgeInsets.all(20), - child: Text('Select Vehicles to start', style: DanlawTheme().defaultTextStyle(17))) - : ref.watch(reportList!).when( + child: Text('Select Vehicles to start', style: DefaultTheme().defaultTextStyle(17))) + : ref.watch(reportDataProvider!).when( loading: () => const LoadingAnimation(), - data: (List reportList) => reportList.isEmpty + data: (reportData) => reportData.isEmpty ? Container() - : BarView( - reportList: reportList - .where((ReportVehicle reportVehicle) => ref - .read(currentlySelectedVehicleList) - .map((BaseSingleSelect singleSelect) => (singleSelect as LabelValuePair).value) - .toList() - .contains(reportVehicle.vin)) - .toList()), + : BarView(reportData: reportData), error: (error, stackTrace) { WidgetsBinding.instance.addPostFrameCallback((_) => ScaffoldMessenger.of(context) .showSnackBar(SnackBar(content: Center(child: Text('${(error as Exception)}'))))); diff --git a/lib/src/features/report/presentation/report_table_page.dart b/lib/src/features/report/presentation/report_table_page.dart new file mode 100644 index 00000000..ea16305b --- /dev/null +++ b/lib/src/features/report/presentation/report_table_page.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/app_bar.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; +import 'package:flutter_starter_base_app/src/features/report/data/report_providers.dart'; +import 'package:flutter_starter_base_app/src/features/report/domain/report_data.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/vehicle_report_table.dart'; +import 'package:go_router/go_router.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class ReportTablePage extends ConsumerWidget { + const ReportTablePage({super.key}); + @override + Widget build(BuildContext context, WidgetRef ref) => SafeArea( + child: Scaffold( + appBar: + CustomAppBar(showBackButton: true, titleWidget: Text('Trips', style: DefaultTheme().defaultTextStyle(20))), + body: ref + .watch(ReportDataProvider(timeWindow: ref.watch(currentTimeWindow.notifier).state.timeWindowEum.name)) + .when( + loading: () => const LoadingAnimation(), + error: (error, stackTrace) { + if (context.canPop()) context.pop(); + WidgetsBinding.instance.addPostFrameCallback((_) => + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Center(child: Text('$error'))))); + return Container(); + }, + data: (List reportData) => Container( + color: CustomColors().darkGray, + child: SafeArea( + child: Scrollbar( + thickness: 0, + trackVisibility: false, + thumbVisibility: false, + child: SingleChildScrollView( + child: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + Padding( + padding: const EdgeInsets.only(bottom: 15, top: 15), + child: Center( + child: Text(ref.read(currentTimeWindow).displayText, + style: DefaultTheme().defaultTextStyle(20)))), + SizedBox( + height: MediaQuery.of(context).size.height, + child: ReportTable(reportData: reportData)) + ])))))))); +} diff --git a/lib/src/features/report/presentation/reports_page.dart b/lib/src/features/report/presentation/reports_page.dart index 6065020e..d5e898c0 100644 --- a/lib/src/features/report/presentation/reports_page.dart +++ b/lib/src/features/report/presentation/reports_page.dart @@ -36,7 +36,7 @@ class ReportsPage extends ConsumerWidget { child: Scaffold( appBar: CustomAppBar( titleWidget: Text(LocaleKeys.common_reports.tr(), - style: DanlawTheme().defaultTextStyle(20).copyWith(fontWeight: FontWeight.w500))), + style: DefaultTheme().defaultTextStyle(20).copyWith(fontWeight: FontWeight.w500))), body: CustomScrollView(slivers: [ SliverFillRemaining( hasScrollBody: false, @@ -46,7 +46,7 @@ class ReportsPage extends ConsumerWidget { Flexible( child: Center( child: Text(LocaleKeys.reports_vehicleEnergyReport.tr(), - style: DanlawTheme().defaultTextStyle(20)))), + style: DefaultTheme().defaultTextStyle(20)))), Flexible( flex: 9, child: Column(children: [ @@ -61,7 +61,7 @@ class ReportsPage extends ConsumerWidget { value: ref.watch(currentTimeWindow.notifier).state.displayText), const Padding( padding: EdgeInsets.only(left: 10, right: 10), child: PopupMenuDivider()), - Column(children: [ReportBarView(reportList: newReportList)]), + Column(children: [ReportBarView(reportDataProvider: newReportList)]), ReportSubTitle(text: LocaleKeys.reports_info_barSelection.tr()), const Row(children: [ Row(children: [ diff --git a/lib/src/features/report/presentation/time_window_select.dart b/lib/src/features/report/presentation/time_window_select.dart index 3afa8524..4a6413cd 100644 --- a/lib/src/features/report/presentation/time_window_select.dart +++ b/lib/src/features/report/presentation/time_window_select.dart @@ -1,4 +1,4 @@ -import 'package:flutter_starter_base_app/src/domain/label_value.dart'; +import 'package:flutter_starter_base_app/src/root/domain/label_value.dart'; import 'package:flutter_starter_base_app/src/routing/routes.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -19,13 +19,13 @@ class TimeWindowSingleSelect extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) => Container( padding: const EdgeInsets.only(top: 7, bottom: 7, left: 17, right: 17), child: Row(children: [ - Text(text, style: DanlawTheme().defaultTextStyle(18)), + Text(text, style: DefaultTheme().defaultTextStyle(18)), Tooltip( message: description, child: Container(padding: const EdgeInsets.only(left: 10), child: SVGLoader().questionMark)), const Spacer(), Text( ref.watch(currentTimeWindow).localizationKey.tr(), - style: DanlawTheme().defaultTextStyle(17).copyWith(color: CustomColors().darkGrayText)), + style: DefaultTheme().defaultTextStyle(17).copyWith(color: CustomColors().darkGrayText)), InkWell( child: InkWell( child: Container(padding: const EdgeInsets.only(left: 10), child: SVGLoader().rightArrow), diff --git a/lib/src/features/report/presentation/vehicle_report_table.dart b/lib/src/features/report/presentation/vehicle_report_table.dart index c09240ac..ea59f28c 100644 --- a/lib/src/features/report/presentation/vehicle_report_table.dart +++ b/lib/src/features/report/presentation/vehicle_report_table.dart @@ -4,8 +4,7 @@ import 'package:flutter_starter_base_app/src/features/report/domain/report_data. import 'package:flutter_starter_base_app/src/utils/format.dart'; import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; -import 'package:flutter_starter_base_app/src/features/report/domain/vehicle_event.dart'; -import 'package:flutter_starter_base_app/src/features/report/domain/base_trip_event.dart'; + class ReportTable extends StatelessWidget { final List reportData; @@ -22,7 +21,7 @@ class ReportTable extends StatelessWidget { .map((header) => DataColumn( label: Expanded( child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - Text(header, textAlign: TextAlign.center, style: DanlawTheme().defaultTextStyle(13)) + Text(header, textAlign: TextAlign.center, style: DefaultTheme().defaultTextStyle(13)) ])))) .toList(), rows: reportData diff --git a/lib/src/root/data/providers.dart b/lib/src/root/data/providers.dart new file mode 100644 index 00000000..02ebc15a --- /dev/null +++ b/lib/src/root/data/providers.dart @@ -0,0 +1,12 @@ +import 'package:flutter_starter_base_app/src/root/domain/contact.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:flutter_starter_base_app/src/api/api.dart'; +part 'providers.g.dart'; + +@riverpod +Future> getData(GetDataRef ref) async { + return await API().getData(); +} + + + diff --git a/lib/src/domain/account.dart b/lib/src/root/domain/account.dart similarity index 100% rename from lib/src/domain/account.dart rename to lib/src/root/domain/account.dart diff --git a/lib/src/domain/basic_api_response.dart b/lib/src/root/domain/basic_api_response.dart similarity index 100% rename from lib/src/domain/basic_api_response.dart rename to lib/src/root/domain/basic_api_response.dart diff --git a/lib/src/root/domain/contact.dart b/lib/src/root/domain/contact.dart new file mode 100644 index 00000000..f66fb541 --- /dev/null +++ b/lib/src/root/domain/contact.dart @@ -0,0 +1,34 @@ +import 'package:json_annotation/json_annotation.dart'; +part 'contact.g.dart'; + +@JsonSerializable() +class Contact { + final String id; + final String firstname; + final String lastname; + final String email; + final String phoneNumber; + final String address; + final String city; + final String state; + final String zipcode; + final String company; + + Contact({ + required this.id, + required this.firstname, + required this.lastname, + required this.email, + required this.phoneNumber, + required this.address, + required this.city, + required this.state, + required this.zipcode, + required this.company + }); + + factory Contact.fromJson(Map json) => + _$ContactFromJson(json); + Map toJson() => _$ContactToJson(this); +} + \ No newline at end of file diff --git a/lib/src/domain/country_data.dart b/lib/src/root/domain/country_data.dart similarity index 92% rename from lib/src/domain/country_data.dart rename to lib/src/root/domain/country_data.dart index f7cd6b2e..8856960c 100644 --- a/lib/src/domain/country_data.dart +++ b/lib/src/root/domain/country_data.dart @@ -1,4 +1,4 @@ -import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:flutter_starter_base_app/src/root/domain/item.dart'; import 'package:json_annotation/json_annotation.dart'; part 'country_data.g.dart'; diff --git a/lib/src/domain/item.dart b/lib/src/root/domain/item.dart similarity index 100% rename from lib/src/domain/item.dart rename to lib/src/root/domain/item.dart diff --git a/lib/src/domain/label_value.dart b/lib/src/root/domain/label_value.dart similarity index 90% rename from lib/src/domain/label_value.dart rename to lib/src/root/domain/label_value.dart index 01ecbe09..78c49bf5 100644 --- a/lib/src/domain/label_value.dart +++ b/lib/src/root/domain/label_value.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:flutter_starter_base_app/src/domain/item.dart'; +import 'package:flutter_starter_base_app/src/root/domain/item.dart'; import 'package:json_annotation/json_annotation.dart'; part 'label_value.g.dart'; diff --git a/lib/src/domain/user.dart b/lib/src/root/domain/user.dart similarity index 100% rename from lib/src/domain/user.dart rename to lib/src/root/domain/user.dart diff --git a/lib/src/domain/wifi_details.dart b/lib/src/root/domain/wifi_details.dart similarity index 100% rename from lib/src/domain/wifi_details.dart rename to lib/src/root/domain/wifi_details.dart diff --git a/lib/src/accounts_page.dart b/lib/src/root/presentation/accounts_page.dart similarity index 66% rename from lib/src/accounts_page.dart rename to lib/src/root/presentation/accounts_page.dart index 5e80c5a9..4600db7d 100644 --- a/lib/src/accounts_page.dart +++ b/lib/src/root/presentation/accounts_page.dart @@ -2,9 +2,9 @@ import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer. import 'package:flutter_starter_base_app/src/common_widgets/circular_loading_animation.dart'; import 'package:flutter_starter_base_app/src/common_widgets/primary_button.dart'; import 'package:flutter_starter_base_app/src/common_widgets/subsection_title.dart'; +import 'package:flutter_starter_base_app/src/features/account/data/account_provider.dart'; import 'package:flutter_starter_base_app/src/localization/generated/locale_keys.g.dart'; import 'package:flutter_starter_base_app/src/routing/routes.dart'; -import 'package:flutter_starter_base_app/src/utils/feature_constraints.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:email_validator/email_validator.dart'; import 'package:flutter/material.dart'; @@ -60,7 +60,7 @@ class _AccountDetailsPageState extends ConsumerState { return Scaffold( appBar: CustomAppBar( titleWidget: Text(LocaleKeys.common_account.tr(), - style: DanlawTheme().defaultTextStyle(20).copyWith(fontWeight: FontWeight.w500))), + style: DefaultTheme().defaultTextStyle(20).copyWith(fontWeight: FontWeight.w500))), body: accountDetailsAsync.when( loading: () => const Scaffold( body: Directionality( @@ -268,82 +268,17 @@ class _AccountDetailsPageState extends ConsumerState { ), ), ), - SubSectionTitle(text: LocaleKeys.household_title.tr().toUpperCase()), - ...?accountDetails.households?.map((household) => Container( - height: 44, - decoration: BoxDecoration( - color: CustomColors().grayColor, - border: Border( - bottom: BorderSide( - color: CustomColors().grayColor, - width: 1.0, - ), - ), - ), - child: Padding( - padding: const EdgeInsets.only(left: 16.0, right: 16), - child: Row( - children: [ - Text( - household.householdName, - style: TextStyle( - color: CustomColors().whitecolor, - fontSize: 17, - ), - ), - Padding( - padding: const EdgeInsets.only(left: 10.0), - child: Icon( - Icons.help_rounded, - color: CustomColors().lightblueColor, - size: 15, - ), - ), - const Spacer(), - Expanded( - child: Text( - '${household.homeAddress.streetAddressFirstLine} ${household.homeAddress.city} ${household.homeAddress.state} ${household.homeAddress.zipCode}', - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: CustomColors().secondaryDark, - fontSize: 17, - ), - ), - ), - GestureDetector( - onTap: () async { - final response = await context.pushNamed(AppRoute.householdDetails.name, - pathParameters: {"householdId": household.householdId}); - if (response == true) { - ref.invalidate(fetchAccountDetailsProvider); - } - }, - child: Icon( - Icons.chevron_right, - color: CustomColors().lightblueColor, - ), - ), - ], - ), - ), - )), InkWell( onTap: () async { - await FeatureConstraints() - .canCreateFeature(ref, featureType: FeatureType.household, overrideThreshold: true) - .then((validation) async { - if (validation) { - final result = await context.push( - '/${AppRoute.addHousehold.name}', - ); + final result = await context.push( + '/${AppRoute.addHousehold.name}', + ); - if (result == true) { - ref.invalidate(fetchAccountDetailsProvider); - ref.read(fetchAccountDetailsProvider); - debugPrint("refresh = "); - } - } - }); + if (result == true) { + ref.invalidate(fetchAccountDetailsProvider); + ref.read(fetchAccountDetailsProvider); + debugPrint("refresh = "); + } }, child: Container( height: 44, @@ -371,82 +306,17 @@ class _AccountDetailsPageState extends ConsumerState { ), ), ), - SubSectionTitle(text: LocaleKeys.vehicle_title.tr().toUpperCase()), - ...?accountDetails.vehicles?.map((vehicle) => Container( - height: 44, - decoration: BoxDecoration( - color: CustomColors().grayColor, - border: Border( - bottom: BorderSide( - color: CustomColors().grayColor, - width: 1.0, - ), - ), - ), - child: Padding( - padding: const EdgeInsets.only(left: 16.0, right: 16), - child: Row( - children: [ - Text( - vehicle.vehicleName, - style: TextStyle( - color: CustomColors().whitecolor, - fontSize: 17, - ), - ), - Padding( - padding: const EdgeInsets.only(left: 10.0), - child: Icon( - Icons.help_rounded, - color: CustomColors().lightblueColor, - size: 15, - ), - ), - const Spacer(), - Expanded( - child: Text( - '${vehicle.year} ${vehicle.make} ${vehicle.model}', - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: CustomColors().secondaryDark, - fontSize: 17, - ), - ), - ), - GestureDetector( - onTap: () { - context.pushNamed(AppRoute.vehicleDetails.name, - pathParameters: {"vin": vehicle.vin}); - }, - child: Icon( - Icons.chevron_right, - color: CustomColors().lightblueColor, - ), - ), - ], - ), - ), - )), InkWell( onTap: () async { - await FeatureConstraints() - .canCreateFeature(ref, featureType: FeatureType.vehicle) - .then((validation) async { - if (validation) { - final result = await context.push( - '/${AppRoute.addVehicle.name}', - ); + final result = await context.push( + '/${AppRoute.addVehicle.name}', + ); - if (result == true) { - ref.invalidate(fetchAccountDetailsProvider); - ref.read(fetchAccountDetailsProvider); - debugPrint("refresh = "); - } - } else { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text("You have reached maximum limit of vehicles"))); - } - }); + if (result == true) { + ref.invalidate(fetchAccountDetailsProvider); + ref.read(fetchAccountDetailsProvider); + debugPrint("refresh = "); + } }, child: Container( height: 44, diff --git a/lib/src/root/presentation/contact_view.dart b/lib/src/root/presentation/contact_view.dart new file mode 100644 index 00000000..dae8c3b2 --- /dev/null +++ b/lib/src/root/presentation/contact_view.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; +import 'package:flutter_starter_base_app/src/root/data/providers.dart'; +import 'package:flutter_starter_base_app/src/root/domain/contact.dart'; + +final listItemSelectorProvider = StateProvider((ref) => 0); + +class ContactView extends ConsumerWidget { + final Contact contact; + + const ContactView({super.key, required this.contact}); + + @override + Widget build(BuildContext context, WidgetRef ref) => + Center(child: + Column( + children: [ + Text("First Name:" + contact.firstname + " Lastname: " + + contact.lastname), + Text("Address:"), + Text(contact.address), + Text(contact.city + ", " + contact.state + " " + contact.zipcode) + ], + ) + ); + +} diff --git a/lib/src/home_page.dart b/lib/src/root/presentation/home_page.dart similarity index 60% rename from lib/src/home_page.dart rename to lib/src/root/presentation/home_page.dart index ca6f043b..35788bcd 100644 --- a/lib/src/home_page.dart +++ b/lib/src/root/presentation/home_page.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_starter_base_app/src/features/household/domain/providers.dart'; -import 'package:flutter_starter_base_app/src/global_providers/global_providers.dart'; import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; -import 'package:flutter_starter_base_app/src/features/household/domain/household.dart'; -import 'package:flutter_starter_base_app/src/features/household/presentation/household_view.dart'; +import 'package:flutter_starter_base_app/src/root/data/providers.dart'; +import 'package:flutter_starter_base_app/src/root/domain/contact.dart'; +import 'package:flutter_starter_base_app/src/root/presentation/contact_view.dart'; final listItemSelectorProvider = StateProvider((ref) => 0); @@ -16,26 +15,24 @@ class HomePage extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) => RefreshIndicator( color: CustomColors().primaryTextColor, backgroundColor: CustomColors().darkGrayBG, - onRefresh: () async => ref.refresh(fetchHouseholdListProvider.future), - child: ref.watch(fetchHouseholdListProvider).when( + onRefresh: () async => ref.refresh(getDataProvider.future), + child: ref.watch(getDataProvider).when( error: (Object error, StackTrace stackTrace) { WidgetsBinding.instance.addPostFrameCallback( (_) => ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Center(child: Text('$error'))))); return const Scaffold( - appBar: CustomAppBar(titleWidget: Text('Cannot Load Household')), + appBar: CustomAppBar(titleWidget: Text('Cannot Load')), ); }, - loading: () => const Scaffold(body: Directionality(textDirection: TextDirection.ltr, child: SizedBox())), - data: (List householdList) { - List householdViewList = householdList.map((household) => HouseholdView(household: household)).toList(); - WidgetsBinding.instance.addPostFrameCallback((_) => ref.read(currentHousehold.notifier).state == null - ? ref.read(currentHousehold.notifier).state = householdList[0] - : null); + loading: () { + return const Scaffold(body: Directionality(textDirection: TextDirection.ltr, child: SizedBox())); + }, + data: (List contact) { return Scaffold( appBar: CustomAppBar( - titleWidget: Text(householdList[ref.watch(listItemSelectorProvider)].householdName, - style: DanlawTheme().defaultTextStyle(20).copyWith(fontWeight: FontWeight.w500)), - automaticallyImplyLeading: false), + titleWidget: Text("Contacts", + style: DefaultTheme().defaultTextStyle(20).copyWith(fontWeight: FontWeight.w500)), + automaticallyImplyLeading: false), body: CustomScrollView(primary: true, scrollDirection: Axis.vertical, slivers: [ SliverFillViewport( delegate: SliverChildBuilderDelegate( @@ -43,19 +40,15 @@ class HomePage extends ConsumerWidget { (context, index) => Column(children: [ Flexible( child: CarouselSlider( - items: householdViewList, + items: contact.map((e) => ContactView(contact: e)).toList(), options: CarouselOptions( initialPage: ref.watch(listItemSelectorProvider), viewportFraction: 1, enableInfiniteScroll: false, - height: MediaQuery.of(context).size.height, - onPageChanged: (index, a) { - ref.read(currentHousehold.notifier).state = householdList[index]; - ref.read(listItemSelectorProvider.notifier).update((_) => index); - }))), + height: MediaQuery.of(context).size.height))), Row( mainAxisAlignment: MainAxisAlignment.center, - children: householdViewList + children: contact .asMap() .entries .map((entry) => Container( diff --git a/lib/src/setup_screen.dart b/lib/src/root/presentation/setup_screen.dart similarity index 100% rename from lib/src/setup_screen.dart rename to lib/src/root/presentation/setup_screen.dart diff --git a/lib/src/setup_success_page.dart b/lib/src/root/presentation/setup_success_page.dart similarity index 100% rename from lib/src/setup_success_page.dart rename to lib/src/root/presentation/setup_success_page.dart diff --git a/lib/src/routing/app_router.dart b/lib/src/routing/app_router.dart index 46f80825..35173a76 100644 --- a/lib/src/routing/app_router.dart +++ b/lib/src/routing/app_router.dart @@ -1,7 +1,6 @@ -import 'package:flutter_starter_base_app/src/accounts_page.dart'; import 'package:flutter_starter_base_app/src/common_widgets/basic_page_importer.dart'; -import 'package:flutter_starter_base_app/src/domain/item.dart'; -import 'package:flutter_starter_base_app/src/features/account/presentation/add_account_flow.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/country_select/presentation/country_select.dart'; +import 'package:flutter_starter_base_app/src/common_widgets/state_select/presentation/state_select.dart'; import 'package:flutter_starter_base_app/src/features/account/presentation/eula_transition.dart'; import 'package:flutter_starter_base_app/src/features/account/presentation/eula_view.dart'; import 'package:flutter_starter_base_app/src/features/login/presentation/check_eula.dart'; @@ -13,11 +12,13 @@ import 'package:flutter_starter_base_app/src/features/login/presentation/reset_p import 'package:flutter_starter_base_app/src/features/login/presentation/reset_password_success_page.dart'; import 'package:flutter_starter_base_app/src/features/login/presentation/startup.dart'; import 'package:flutter_starter_base_app/src/features/onboarding/presentation/splash.dart'; +import 'package:flutter_starter_base_app/src/features/report/presentation/report_table_page.dart'; import 'package:flutter_starter_base_app/src/features/report/presentation/reports_page.dart'; -import 'package:flutter_starter_base_app/src/home_page.dart'; +import 'package:flutter_starter_base_app/src/root/domain/item.dart'; +import 'package:flutter_starter_base_app/src/root/presentation/accounts_page.dart'; +import 'package:flutter_starter_base_app/src/root/presentation/setup_screen.dart'; +import 'package:flutter_starter_base_app/src/root/presentation/setup_success_page.dart'; import 'package:flutter_starter_base_app/src/routing/routes.dart'; -import 'package:flutter_starter_base_app/src/setup_screen.dart'; -import 'package:flutter_starter_base_app/src/setup_success_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; @@ -40,10 +41,6 @@ final routes = [ name: AppRoute.checkEULA.name, path: '/${AppRoute.checkEULA.name}', builder: (context, state) => const CheckEULA()), - GoRoute( - name: AppRoute.addAccount.name, - path: '/${AppRoute.addAccount.name}', - builder: (context, state) => const AddAccountFLow()), GoRoute( name: AppRoute.resetPassword.name, path: '/${AppRoute.resetPassword.name}', @@ -87,7 +84,7 @@ final routes = [ parentNavigatorKey: _rootNavigatorKey, builder: (context, state) { final extras = state.extra as Map; - return StateChooser( + return StateSelect( countryName: extras['countryName'] as String, initialSelection: extras['initialSelection'] as Item?); }, @@ -98,7 +95,7 @@ final routes = [ parentNavigatorKey: _rootNavigatorKey, builder: (context, state) { final extras = state.extra as Map?; - return CountryChooser(initialSelection: extras?['initialSelection'] as Item?); + return CountrySelect(initialSelection: extras?['initialSelection'] as Item?); }, ), ShellRoute( @@ -119,7 +116,7 @@ final routes = [ GoRoute( name: AppRoute.reportTable.name, path: AppRoute.reportTable.name, - builder: (context, state) => ReportTablePage(vin: state.extra as String)), + builder: (context, state) => const ReportTablePage()), ]) ]), ]; diff --git a/lib/src/utils/feature_constraints.dart b/lib/src/utils/feature_constraints.dart deleted file mode 100644 index ecf0d4a5..00000000 --- a/lib/src/utils/feature_constraints.dart +++ /dev/null @@ -1,102 +0,0 @@ -import 'package:flutter_starter_base_app/src/features/account/data/account_provider.dart'; -import 'package:flutter_starter_base_app/src/features/household/domain/providers.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -enum FeatureType { - household, - charger, - vehicle, -} - -class FeatureConstraints { - // households threshold - final int _maxHouseholds = 6; - - // chargers threshold - final int _maxChargersPerHousehold = 3; - - // vehicles threshold - final int _maxVehiclesPerAccount = 6; - - Future canCreateFeature(WidgetRef ref, - {required FeatureType featureType, String? householdId, bool overrideThreshold = false}) async { - switch (featureType) { - case FeatureType.household: - return await _canCreateHousehold(ref, overrideThreshold); - case FeatureType.charger: - return await _canCreateCharger(ref, overrideThreshold, householdId: householdId); - case FeatureType.vehicle: - return await _canCreateVehicle(ref, overrideThreshold); - } - } - - Future _canCreateHousehold(WidgetRef ref, bool overrideThreshold) async { - try { - if (overrideThreshold) { - return true; - } else{ - final accountDetails = await ref.watch(fetchAccountDetailsProvider.future); - debugPrint("Total households in the account: ${accountDetails.households?.length}"); - return (accountDetails.households?.length ?? 0) < _maxHouseholds; - } - } catch (e) { - debugPrint(e.toString()); - } - throw Exception("Failed to fetch households list to validate"); - } - - Future _canCreateCharger(WidgetRef ref, bool overrideThreshold, {String? householdId}) async { - try { - if (overrideThreshold) { - return true; - } else { - final chargersList = await ref.watch(fetchHouseholdChargerListProvider.call(householdId: householdId ?? '').future); - debugPrint("Total chargers in the household: ${chargersList.length}"); - return chargersList.length < _maxChargersPerHousehold; - } - } catch (e) { - debugPrint(e.toString()); - } - - throw Exception("Failed to fetch chargers list to validate"); - } - - Future _canCreateVehicle(WidgetRef ref, bool overrideThreshold) async { - try { - if (overrideThreshold) { - return true; - } else { - final accountDetails = await ref.watch(fetchAccountDetailsProvider.future); - debugPrint("Total vehicles in the account: ${accountDetails.vehicles?.length}"); - return (accountDetails.vehicles?.length ?? 0) < _maxVehiclesPerAccount; - } - } catch (e) { - debugPrint(e.toString()); - } - - throw Exception("Failed to fetch vehicles list to validate"); - } - - int getFeatureThreshold(FeatureType featureType) { - switch (featureType) { - case FeatureType.household: - return _maxHouseholds; - case FeatureType.charger: - return _maxChargersPerHousehold; - case FeatureType.vehicle: - return _maxVehiclesPerAccount; - } - } - - Future canDeleteHousehold(WidgetRef ref, String householdId) async { - try { - final chargersList = await ref.watch(fetchHouseholdChargerListProvider.call(householdId: householdId).future); - debugPrint("Total chargers in the household: ${chargersList.length}"); - return chargersList.isNotEmpty; - } catch (e) { - debugPrint(e.toString()); - } - throw Exception("Failed to fetch chargers list"); - } -} diff --git a/mock/contacts.json b/mock/contacts.json new file mode 100644 index 00000000..9cc27c98 --- /dev/null +++ b/mock/contacts.json @@ -0,0 +1,242 @@ +[ + { + "id": "c190d3ed-dfaa-4de2-bb97-5bd8a13bfc0b", + "firstname": "FirstName1", + "lastname": "LastName1", + "email": "contact1@example.com", + "phoneNumber": "555-00001", + "address": "100 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10000", + "company": "Company1" + }, + { + "id": "8f4bf447-1452-4121-87d8-96756f331dc7", + "firstname": "FirstName2", + "lastname": "LastName2", + "email": "contact2@example.com", + "phoneNumber": "555-00011", + "address": "101 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10001", + "company": "Company2" + }, + { + "id": "fc5cfde5-6463-4cb2-aaad-a3a26d6f31b2", + "firstname": "FirstName3", + "lastname": "LastName3", + "email": "contact3@example.com", + "phoneNumber": "555-00021", + "address": "102 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10002", + "company": "Company3" + }, + { + "id": "e32a9f82-57d5-46a6-81f3-32f09e1ad357", + "firstname": "FirstName4", + "lastname": "LastName4", + "email": "contact4@example.com", + "phoneNumber": "555-00031", + "address": "103 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10003", + "company": "Company4" + }, + { + "id": "d911c9a1-79e3-4a3a-afec-f45bd8882c90", + "firstname": "FirstName5", + "lastname": "LastName5", + "email": "contact5@example.com", + "phoneNumber": "555-00041", + "address": "104 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10004", + "company": "Company5" + }, + { + "id": "aac3420e-d9f3-44ed-95b9-4793652749d8", + "firstname": "FirstName6", + "lastname": "LastName6", + "email": "contact6@example.com", + "phoneNumber": "555-00051", + "address": "105 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10005", + "company": "Company6" + }, + { + "id": "f58f76bd-081f-4cc0-97e2-1559d82d47ca", + "firstname": "FirstName7", + "lastname": "LastName7", + "email": "contact7@example.com", + "phoneNumber": "555-00061", + "address": "106 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10006", + "company": "Company7" + }, + { + "id": "41e99135-68e1-4ffd-bf6e-2b5e089e4bec", + "firstname": "FirstName8", + "lastname": "LastName8", + "email": "contact8@example.com", + "phoneNumber": "555-00071", + "address": "107 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10007", + "company": "Company8" + }, + { + "id": "303651da-7e92-45e4-a2b0-404a0488041a", + "firstname": "FirstName9", + "lastname": "LastName9", + "email": "contact9@example.com", + "phoneNumber": "555-00081", + "address": "108 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10008", + "company": "Company9" + }, + { + "id": "1598b82f-3da1-4510-90b5-2d7fa5c4906e", + "firstname": "FirstName10", + "lastname": "LastName10", + "email": "contact10@example.com", + "phoneNumber": "555-00091", + "address": "109 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10009", + "company": "Company10" + }, + { + "id": "9649e19c-333d-4bb4-81eb-b273e49739af", + "firstname": "FirstName11", + "lastname": "LastName11", + "email": "contact11@example.com", + "phoneNumber": "555-00101", + "address": "110 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10010", + "company": "Company11" + }, + { + "id": "4071dbe4-5bc4-493e-ba0c-71464b3c6f68", + "firstname": "FirstName12", + "lastname": "LastName12", + "email": "contact12@example.com", + "phoneNumber": "555-00111", + "address": "111 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10011", + "company": "Company12" + }, + { + "id": "d09496bd-cba4-4a0a-9eb2-83e88a91e796", + "firstname": "FirstName13", + "lastname": "LastName13", + "email": "contact13@example.com", + "phoneNumber": "555-00121", + "address": "112 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10012", + "company": "Company13" + }, + { + "id": "3515cfb9-4f74-4009-8282-e8325146834d", + "firstname": "FirstName14", + "lastname": "LastName14", + "email": "contact14@example.com", + "phoneNumber": "555-00131", + "address": "113 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10013", + "company": "Company14" + }, + { + "id": "5f2a57dc-85f7-4d1e-a63a-553a48ca606f", + "firstname": "FirstName15", + "lastname": "LastName15", + "email": "contact15@example.com", + "phoneNumber": "555-00141", + "address": "114 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10014", + "company": "Company15" + }, + { + "id": "a4d3352f-468a-4027-9b49-47febf5564d0", + "firstname": "FirstName16", + "lastname": "LastName16", + "email": "contact16@example.com", + "phoneNumber": "555-00151", + "address": "115 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10015", + "company": "Company16" + }, + { + "id": "046065c7-3726-4491-93b9-e781cd9e74a3", + "firstname": "FirstName17", + "lastname": "LastName17", + "email": "contact17@example.com", + "phoneNumber": "555-00161", + "address": "116 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10016", + "company": "Company17" + }, + { + "id": "e4f28337-e46d-40e4-b435-14a617c65e49", + "firstname": "FirstName18", + "lastname": "LastName18", + "email": "contact18@example.com", + "phoneNumber": "555-00171", + "address": "117 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10017", + "company": "Company18" + }, + { + "id": "f7912b03-f082-453e-905a-1d2415af443a", + "firstname": "FirstName19", + "lastname": "LastName19", + "email": "contact19@example.com", + "phoneNumber": "555-00181", + "address": "118 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10018", + "company": "Company19" + }, + { + "id": "03db1b40-7a62-412f-b25a-8d4882a07c2b", + "firstname": "FirstName20", + "lastname": "LastName20", + "email": "contact20@example.com", + "phoneNumber": "555-00191", + "address": "119 Example St", + "city": "CityName", + "state": "StateName", + "zipcode": "10019", + "company": "Company20" + } +] \ No newline at end of file

+pvN|W{R>KMx9B|QJ^ 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:XR;>WsJe!Pg)W1gPo4>IkOM&paaZjt5H_bj8 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 + + diff --git a/assets/setup_charger/connection_fail.svg b/assets/setup_charger/connection_fail.svg new file mode 100644 index 00000000..415a3d61 --- /dev/null +++ b/assets/setup_charger/connection_fail.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/setup_charger/connection_success.svg b/assets/setup_charger/connection_success.svg new file mode 100644 index 00000000..37458d06 --- /dev/null +++ b/assets/setup_charger/connection_success.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/setup_charger/empty_circle_large.svg b/assets/setup_charger/empty_circle_large.svg new file mode 100644 index 00000000..1df6b4d8 --- /dev/null +++ b/assets/setup_charger/empty_circle_large.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/setup_charger/phone.png b/assets/setup_charger/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..1e035494a3f53318e0064fe2a00bc15db75c5f40 GIT binary patch literal 10200 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 Nt}L%1S1AJt`X6EAUyuL* literal 0 HcmV?d00001 diff --git a/assets/setup_charger/phone_background.png b/assets/setup_charger/phone_background.png new file mode 100644 index 0000000000000000000000000000000000000000..631d9826b440723499b5efe35ec66ba9e10668c2 GIT binary patch literal 29024 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/setup_charger/qr_charger.png b/assets/setup_charger/qr_charger.png new file mode 100644 index 0000000000000000000000000000000000000000..1a5742d63e71e4a551da867daab6253354288009 GIT binary patch literal 16556 zcmV)*K#9MJP)6G1eBCJ{bBjOL4)#5Tr6C4SLKVq(-uVls)ZVJ1G3 z2#x{FOjM$g3}`?T6V2x&z=#4$G$=>}1-fY(M5J%uZkm4FQ?vf6T2-rR*FI;T+xuSB zWPRU0`&GMk?RD1UU#n`@Ci-`J{K#5s=-5cxo^)NRpE_VHy~S^;_TiR)cM9t=fOPLFQoSe zmZtTNR!K02nc{Zkd|)2E_{A@F%T-rhg|#au=R!HG^uAVot0npefu{71FanZv?X}m^ zS!bO^*IjoVwg>mzbC1Eorw0cge6V@skw?tBb?e;v_~VZ!J~uf1^wZ6@ZQIPojT_Cb zUAyR^haNJQTylx48-L2#XP=Fgs~d-c)YA7mMM=a1iG&16qT6n}%^ko)gF(E|V~;&% zZn@(Q-|uU0)bOtE zAQRLS>dH(ov$L}X%-OSNkJ-O}zgzCR?>tXj2d zi1msUE8IR9dh*F9gQ@1qE3X`?wtU~JdB#LMgs3zgl9>o;GAwBWFb*nvz!N5*UO}RCg$=5l?9dyt^7R(IlEK)giqUakS#|s&IZK zFUy(fhvHh6(t~+_88dS!udyuQWtt@(c6kc-#Zq9=?+ej%HZgeP%vQ0q{W`BUhTZL~ zuAk%e4Om#3Zl~~&%a<>wxw$#4ElVq5pVv@REN0)neU{H#mQp8SEY()jec7^Q_FLcj zmWAD9>4d|v(1hU4-SyuODjxBi!g|ijvh(-`B_@`%g_qB>%3jF~y77=h4$}RXxshlNr=9{%g5N}-NX)P$Pfs{z^u7Y?;My2=3>p#ILCI> zF_xv#mEmiLkW6@X@#r`XTl$u_yd^U5d(o3;(FCLs4(0aSZ=d4zzf!v-Mq10vT)S=q z{qrs0BY~ms<>f~5(h7zS1M{5Zv4jp+u3R~{W5(?E%;a$9WJuiR6%SQf_mOT3Cqf6MvVwq;u zpJo#Pr?P~B`V`yDXsKhKNe9F+Q&3du{nKDkWLZ=xB-v7jF)@JOX)<*EnnSczkJ(+ z_FumKZF}n-57`Uf@jiRh`lE5~Cici@@%mV{e;ZlNH}G;4GjlB;djc;2n}-LOv_hZ} zd-8+O9(Ftt62bZL_8_bu_asMD4-ng-0iqLtYqm?UiN{P*+38PzCjHq5K2GdVcrk7b zNyqjze|-i0>3iQvTkqR^H8byE&Q>m6x^#}0As`XF zIJa>KC=}Z5yt%-$$IDg@L?r+x&_Fr>I_vE7-C7>Tdt}s2^rD~ndHdPx{)Jxqx;MRu z)%Tw`g#1mun7N=gw(nAT(hbD$WaRB;#>jzAe<5o#UwZQKCzIq5 zV4hNfmne_iaNOH3R&o09Uww+6amJ6mmKpdFKDiO z@7=o>uxE<#qf3y$dxvK*p<9C%lbo&zBVlJiEQK^FJ@skNL`{xq`XPjYvQ}}rQ|irKz(`1BNMN`=pFpItK?_O)`Nt4aNtng= zJ%(0oB)1%NSf`4f`m{5n-P6oWw$L9hvN9&9yR(z$J?AG`D*t{3M?LRlm3;*>(y2Bx zYdSLCA;314#W(N?@Q+k~pzVRvk}kQidNI z?ioyU;z|FBK6>Tfvzj0CCT8TXLkijHEP-lcn*lncatV9xD3QTNx=<0Bc%Tf4Y8Hbs zn;6x3LVD7ZPm)b#(M{%1v~3I$YVvcbFf)*@xa!kb|0*-+r`hQ^m4-xOf#g9dA(6n6 zu#xPwosC4W0E8hK`o+jcN+#LeOd^3v>GadjtQ_@O{#*jn11U@wC01+1`VAZH6(9SI zUAgkG3mM*=0VeWcXCtxZeJ~cD+l7E&GSn`}_KB)FWNB6#B7sG6bP0Gn@LRX(dHA#LhH{ zEc$TIB^XFK6O%Jbupm^~$l6_RQ(+~sZZDJE6)RWKA7A{x=oLTzQ%`%s6P}>bZ26xg zbxPtx(?T#16d?`_@O)xt?qjhf))bP6C6FoBB-pU9nbmqgXFl`U^iwa~M4LBn77*Q7 z%4-&b2H}RWM{QD@7%-yAZFUy1*fIo6WGcs0Emnt-o__O({!cxGNCwNRXmsui;~3SI~1YRM@jGIv69Zo|>X&?{f{E3{?HmUs?oI!-bd zk}{hZx=TC50Cbm9;6!jB3QpMQAY38;UqyT8Lp`yjwa7y7BgysADY2)f4}IWLCynf> z8%(P)PuH()XCE{uE5e{7>PV185~OU0rtIfPo>x3%)8Mr|cw4xJa-8X*bI*I8lg82x zj*`G4DM5YFz#KqqxyDOkAQPe!Yf=>Ar6-SMyp8nda)_fPw@x;ed+|$t5wZSQTeuh$ zae$~I0BYBZ;hD+lU9?$797&6pH4?F;hqO^b1H-8nx#Y~Xbmp_pqSdR9AkHr~B&=o^ zyGr_eXkgU{SwNf#)j0rk;Y(snY0o^xxL7?zlFS6MYaTmdP?A6C#Xt9p#2r}STH8q~ z7s6XhKG6{p5R*WhwQG+e)wbfVRRGb*eqB0k98i@@Xd+==e*H698Zof6je(1$;)B>q zqKQ*s%U575r<1_QK-d7SfN5ZDm`;h@67fEaGf*S#$-iGjnyPl%4kBC2X;}HDYyIf#wEqK2g1mH zmrv}f&={vE{Ug}d_7#+p32rZ*S2;tkpsrqs&RnL{82&t}V;e_WNRP z_C{4mKv;S~r)xR0vNFrSc(uv1I5{)qVO0EAq4HY&tX5@uaPE{-P9^SFq4`j65sTh| zclKLz*V6-EnxW0tGH~2py)Z;8(wqu2v|8(jFPT!>tK50ClP|Dh)hZ0MuQFsYoC*k% zXvB8FJ9Bn>u;4GyD{6ik>nFG(rV+zjbkr_Bw8y{Osb)NT}o7tHY6&j64u$K#MY7t z8senmt5zPCsq`qoUBjOTN{t*kAdbA3H}>K|12pSxA7gl|Xv#7gQ)($5{amGknw%C& z5~DgxZy(;{8+YLv4*7D>T&CyABye0tEsgOpw%jZe4vCs}t+u_GlqDeKjry)b>q`5T zj%!AUQTL~kREjf+I}KY`Vn~uI3Yyum9okcE%VJPApeaC{PV$aiqNsDJhAFdMCLMe) zU%NN1fnwWw-j^ZTF_SZK6lpKs7fp*Kf|KDD+K!Du7o;^)Q%%W{P*5Z>XL7EtIeZc3 zYEvy?V0>>$mCYGANvNk29S6$Lfm9NvEWnG3co}GHtvTM4P%rMAv~87o3xl&xb$P64 zKTG?n?~^h;{`{6L_aFyKd0nI0ZAb3Uha$uQDV#X=Le(`OUf58PvGF~8SloyR8ypL1 z$D&nMJE9UpYU%QSj9>4Vndz*`3q|t2vwMn7n>M*tGEN-pT(ncHoOKNJ>K+eT!HP{N zl#&%*(!^etRa;6Xq8Z(EQR9W6n3R>91LAb?&WA2v5w|4_D~)!tg(gCtT)j=q0{QEj zU|Y%wr82d?nDGo;2qrhcHeQkK8nI~72HG<($B?RI%|puA?IKZ8maC7xjdz*QzV(_4 z(;f})g>;cbLqX?A8~k)OZ>ZjP*29!w8lC^LO=PIqC6HiIYnwVcmcFG?&jH~Q5Zsq* zA2{ki{?|))ZeR5nAHQPPEN!0K*SL_o2BLamD4WTLVe4jxb%Zn~m!=fTL3nef{>{Pxh!`Mp_P<&ea1Xww3#I4 zQlIGYa4MiU@EwFvrJcJ>i{T=^3YqDyESl|(`TK3E3>FUgvevUmGHT}Oqj zS+l-@^V+g3h2$8McbS$fZ+P7{-nh26#P4miP~O=!1HFA1_}*0#RgzUnBv}F2sf=Jj zwbGEkQrHaz7${8 zg=2v_cX2Fh+-R_Bn6g$wJ(@8xb{+xY4hxI55G=0G1|rncrmI2>p&=Gwy^*w zPO8o!?Pc4gAf?EfImE=VB#})jB{y>{w!GhHS}2I)?hkdwlrCX%iVmcQ!kOwTU%vYw zb3mq1iENB`IPFw)W+)S2>K;4mvVAZ$ro!NzRIBuN(XPRZuyd}p6_B0^0MNi+(u z=jTbCw^d0T#h7v4dOj2#iw(7Pjac$DmS95-L!8t_bE!PEI3p{nSvnDEQ`)Z?zb=xy zI27~h0x-HVQRn)as!@h+@m)TnV1*HB6=>6T4}n5S(kxBnQFKctghE{?;zZ1MjVb@S zybQE+ryI)VoZDB-%-T5>;}G3*j`n(6s!!DgnU< z_Kdt}=j;xwl)f1ev*3Y!G*X0dk;fu>o;jY^WoTDQxX)Ya0q}J+P%?5c7&}loK|A4? zZLP2}eL>7ECg>zsGD)qdx=2}GrKtjIcQ*cA?rLfyeQg`q?iD9m^_7cB5)i6`$#}_2 zI8e?fNh&?;s0Yvk;A>??<(qYkle#vB9w@bplpRk&_2d<_5}y?1G7nq@=Is)e7$!kM ztf=5)ikueNJDWJ!x^c6=p?jd)rQ#$^CUtVM?s9$CDXtAu447m?MQYn1jo4gLsWY0G zYN+BsNq4b1>i$Mm*_fCK@}e1|6YY^x=ev;q0|vHK&;0q44-*?Z+9b5J*q8-Lg$dZ6 z$4niiM-Y!2ht7%nu&M4$HN8DBq%%BKNzvD9Nz^n+$fwKq60zuxD$pcv-isGiImFOF z!F{fjI;Ugc)JrIJB`M1(k6uV6aV?R;s9k6w(qZ~lU7D2SlF}(yo23P;J}0Ck%}O2G zgO{q8q_1FtZEIWoc@`oa79ERj-GA767v{YmGaah7Ya*2m5FG4dR8a6O5XToDU7sJ$-F(EE_j&>~Lv6DUNem1*!yu*B42QKOfexH#5C*olrM^lD%B6HNYMO%srz`=1b@x6N?@S60XG>Uu zyrR6SQI9md7UZd~#(iX~6XUutr%$zxGc@7dKJ>A`CU$WwO_lV{L1uUdSxea*Ig+Ri z*K7Dw!X6FWiDE~8n#VhI`d8aDO3HK@nc40@9gKv1cGB5^Lj)8Kv40 zn~F4BiHoU{#nEaWt|6+V)y6SHYfWDm5j5@ZEpe7+v*mKYs%XlA7%_2=nk2Yp@L zA{i;$rzAFPNT-4C%BE51a7tj>l?Wl8+YZ-6JShnZD<)FTdnp|h_mV9?uG=4LLYzrF zZm-^1RT}$Px`cftY|(#eQtu+;LYh%tm30Ov*~C25QxZH;{9L1i08IZ()O{?IzN(v? zi!_u>UHYWB&!p$xG-t4eHBtvpJgbeD7p>f7{h)4Len_+eCAm_<9D6Cy%Zpvz+0nH8?6K$g|7auaI zdi46K?v5JSC%7&to5^#M4}Eb5etgCxk+lSD#E%-2c)2wtC@-%qDYu*9P`c9ukxHLx zJ7A{OApE;e!J&K;&uvEti#!qDosP(-B_PRt8r(ngf2eJbOAsS9bTPWAOe*=IQC z`;Dr4gA()fU|Yy_=r9gAWBqW0qC+%R5G(U zH-ydr^}&F?CDB!=KmXeWCnk?fnL66)^nYT=M5U5<&a*y=nI-PjaEj7xTiVv0L47bY z&WnR5pLFU!eg6_vOA*0<`ElEjNTT|y7ddGLHl?w&d%lgPXtSwab0Czx3rgKNaou?zPmiRMNecnCiQc0>Y`J4L+>&dmIrGColpAYqx3d0Yc zME9|DQRi)L6hvxF*&btxQJ@(ZH-+kJNR+&}&bVml%Ng2T9sA5?YihhS4#xs@?w;LF z!>F`fuKI7+)H9DIjUmy3TWuQaILJHG+EHzae$Dp#4s<-Zel!`Jm>9+?w-WJya`k$`Rb8q1@Xyj+sx`9A-NC!XlW-pIF4LACFlmV~jIci(;Y$TD%BZJpWf zG%+txMT+9K)sA44+T>}jSaaiUNlJ4JIgU_n$&w|G8Tf7sK0ETd*S(IO_q^x11>gSr z>Q}!?C!KVX+s65mPd?eLvFzBfW9&WRY$VcA)isM_s_8E6tuy;b1qf)wu8G;n<<=aP z^-m*kOm!t+(Fl>c*_dU-`;cT)CTWx`|Fb^;CM#d)`C4 zckiZWJmVRzES&5(%KBIYCw59e$Z$gih*LNhA6iVVVn&p-nD{V8zQwE$YYA>lGaa`z z)udC7z2hD4ppSm^qp_ZMzVn@Ko1Z)03-gR$aKQyMGc!XEJn(?aY+ZBBH8hU0*V3fR zv@A+p+_Eh#7P-c`0~py zr#tSrgI@507dS>@edLixx@+{8*xE=>{pSuKcJ5*mbvpxe$Ry5W)B1&jL1NXFRFomg zA`^9K^>|U;2*QW8Kl|CwI;Onwjc=qg&Nu_ZW*h^BaTi~Fu`B!f*T0_L|Ni$oiA9-l z6kox>Y$QTmlMf(c(&yI`HY{KGFcUH78^Q!8j(a7gI#QO1#@fWt zY*ULEYal$Ata!{O=GrVn6G|4>CUs87$2V0zrhVRd=Q#-kz2-Hqagqne0;~uX21W#Z z@Pi+8jt11lu}rJhI`0fdPNL4Hl9dVJpiRAaDMRC9U?*kn0}m9!Q%h(jfn&p+hR!v7~dtv}TWBIf$vWD8lIR@pE}C)ES}OZ~yjh z(>K2H4SMyfU+p9ibmNUTI>>_v1s)pT00a}E>QMa`zVL-Kj-u5>#KN{<(Dn1g8VghS z^G!v+Ozm}iZzqcvoJ*5n8V*I<%u&)sbI(23f$l4=xPq>}`fBHq zAvjng)B}UTOgNSsZn(io@F<(KD&_ zF2;=9A4kB5mtJ})z4^^=rcZwIll1bJzuZ9_fj3|rq!7p8R3Mq>pMQQ->2WlmsE+ub(_qorx>;w9YBMrwbOQMm9G{#AzOkqG2(^xU|)9*FsA)71if7KL$+FK`F*<@A@lVbIq2uWFF zvd=l^99q44wUf53Tes4M7hV{1ir9bJ)1KzG*)KSZh_-+8o8KH+w`O8&PWO<{Lm7cM zN;Qp^8nJU_S3*!flbBpaJ+Zz}kNh`EYKufjjqt@?*g0*Z=OfW=lugWwssAP!vrVM) zhvncTTddOwiS^_;(w8VbgYxIoqaYFxCu(+gc8#U`rtI@d6pT~%h(%_cOG$(>Au7Fe z;eRqZwWGYP5ov8oNb<-v=4R>K38X7!IZ7hxouqp}ktnf#rNWlcg~~U!wpcuH zNji1bfIstm{x&!?ADYg?FTdGU5`*L@Cz9GoF{Czup=4~4K2+Cvmr;c;xgBgu+vqG# zpSG`!svpVjN&(kJRV>biwV%vQM!r0B&K*QI*$`pb8#=f|YBwAp-UV2Y0_z_E0F zdmwDJXhcots#ELx5}mZlM0M6l+)-3EE+K|~#^HeU^aXA#4kj0xtdGS`P_{8yhS3jI z+Qc?Vk;rB~)Yh4GAfz3O3;Vjhs#}t&e83@WMepp7CoVN1ir&`UtMMpxY|Gel<@!Kq zkg_b3zuO1W5^1vj<*ZNI!59)g<_{3BX@-cFYB(|DeM=nO-rii&`;f?NHWI9%&hXBY zP)dafgEUrjC0ZrW7Vp4NBYSPKbLyVqB5EG%NWIxat%jn`lTh-mu2~gB?vBS^J%6n6 zUNp(|a!tW#xl-d!3eo16_AL^`na_=ofJipW7GarmK*eKutYJyz8`Ci&Lv38qsjzg+ zWRh5utTyl5Cq4a;cL0Rlvhc(TREq{*4__&neU+N+-#r2b^W1p}_lYZZM;@SnO zxu49orAgGJTzlh_ss;(A8hGzRfEI#*ApI@ViITFRQBMEba)36UorEY$CZtb|gwm=U zW!t)3jlqvM#qY78w~xC^UGpZziMeg`%u30I+7q|M!Q;w}9@x1UPNYWe&3nmFVH@6= zQ|I=syYA|6d77Edqz^Z!n7SOT;N7WYvP)dpw43Q`LGq?mvagdfOaw;n_magSiUZ$` z41Dj}+h@aD1IgR!`LIbfR$t?OqqC@IZ3e0I4{U8YX$4ec@6{((|-EHdyN zHnB?r!Z$`1LzS@4wNraiWAbmE7PYDMs7#HvtwX9wWGQWJ=lUZ3$+>v2`}76z^GZ}Y z2Gba$)Bdm~els8ytAth2YO_?Y?d*eu=mL~R0&S*aTSg?E|NWSkp!PI~1A^a53(*K;) zR!f>+`!R_L_vK019PZQ}Sl3xnP0HF6yZuRI97ZAy?fN~IowKvLF_|hWJSZs9=FW$T zRw0~`cLzx#WytbhN+O&Cbt-|vWqBbe*B`Ist z`*`tS7fB=|Fe4-jvo=O}5mYz5t`@wwl}M!NWSS#p%dUd?Jb1G!!uAKYwy(T2JLwN;zAU8Shy1exKa~v9kHhMq;hJecxu-@tf3}C^1v1u^IO~31EBb zDn)G_Q@ukRRE`9M9PA#kz_tynhAE-BMI)n1Q!GHaBhoQ;QMTfo(%V{-P|47~NRP#_ zXPbJC-&SDgEN>%QQ zkP+yQBY!f zifU{%3eoFOFSSu$FeiJr4{MpmperR0TJ@L>Pi$1|tdHAlUfE{cEs=^z)}U2&$9Z9a zNWFgO3j|5TS1@RvlpZqs^m+i+S}JqLV~Wp@G*wun-EGk*>I$TF*Fztad1pLvc=Nt< z1>#|Cd;=gs#1O?qsq^c`^(L3H@%Ky97mP384wd>N{etAgVW0A*fl-u6RjFRu35DZX z`Q|po>(n)4kLPW))$LK&OiJ>Cq@CY@Car$ju_Q-eR92^S2E*YnlhSsT&AqdZ$4S}H zNvXF41Z7R}neDFcJ2yS8eptbX-jA5daAY0U<#4BZH=<(HnJo`JPLxf|iz!{g3zD6r zvQ*DJ{PPbvH8l`(tKL&FRbU>xcZK2~5$~JUlW}n&>|!>}71m)+*@-1F)Iy~4e5eu~ zQ&QHee1lOYU6)j~J*`%%;b^8Tlrzy3Guyz27!`)^v25)0$+^<7Pm9LOzS5`z)xD zfDj2K$|n*^$VMj$YIjKvDurqkk5NmXOVvj*TN51CQO5~%@<^N0O^{ET>7WO5>ZmoRi zYm)wz@Nib;0S)E7e^wlVjZ+vjr6GCa8rF<=t2BTbbuC6BR#Tjz$*4PbpDWC24_nM` z9GPMg5Z2wSv5r_)!kzxugcN|)+(l-hMQ;kx6m5@lGW0Fcz_4sl+ z{%+&PC>*FWN4<9sfFvn9N$0)x$`m7&vYg5Cj;sW5HY6l$@n80Q$fjgSM3m zlEo2okBND^Ml7>Cr32sZSL~rmE<_uo<7f{uZEfO>`UCseyFT?_%{!OWrOc!>utlm0 zN!iY+umXMYNWpsC5R(9lA6^{Ouc$%$w^`U#BjV@)0AqZkS_K?#|O^iV^XoO zKAvo+tecWj6T8q9Gd>y_g&z-uVwWj~8zXjJv0_E{d2y`X$iEIL$Ab+EIMA07*pb|HBVbDUrpez*zoY?gv*&w_)o3BRZDKmu^om$#5Q6c4<^>mk>#qiPt_0TcwgCtHuCLgq9iSoCo zd>Qu}i=;eaWSD7-zx8!#KQpV9YozYF2k$krt@DX;u=6+jf=?>4H_6WynQUP~x}Upu zm<}dqZ0Vh~_fAWlMlooiA&zS%AWrAE2Pip&QqoeDf@vsQQxqrpzH>fFZyWedUb)hq z4iIOdz;=9cWVQiuCW%;L%x5!@O^GSxL%6cSQpMB=AO(zP_)vs;6c1_)swIDwHuOSq z7DrS*kJvdn1z!hcURE<$jt6F|a;^kXCCyc5imq$^p1Dto-WfP?l995$HEFYk69n_vx3(?GL-Ek118Ihd3!}az>CCp<#M0F!ZgXEu6IfG5DG~|}RQ)oMh7Sit zW&P_GHE;a(z3l{$9DJm;5HS_ZR^4?bXwia%|?Com)Py3EMre3lMW(GXv5$f2$}x$p zOZHH%*};;yWXY07ZHr+Gg|fE?geG|zNUMa+Uk1v`2^Q4Xsk23`%_t**@LZj@Y`NEc zLbI)Hc^wO58)MifNm*=n4f|}i(qvkWXJFeVDb@*ETfLK(Y^{Zm#Hpz%s^6>Wt+f~L zi}bsFao~Gb3Xa7DNr^VkpS9w5)HxZ<8GMS#2RS8>t!-j*I5h-NI+k(prf;AP%KDur znbJiF6KAMwj4d3CNsuP0yVdqiQwsOeehI2oY4>~E*Zzf8tXNUBX|(G0Es5EbE_kB~ z)8 zOynaGMPk&lxH_nPA+~J~Yzokw9K&s2yLBYcUMxDG&igfMkHSiSK7>-F5+%vlI2b;5 zLKzd^hpyLMW?OPk>yK^Oe7E~%{V39^Th`SVWpCb3N^93TNtAdvqhPmevVRnuN_v@G zUlY0w)b;fT*88{JcB@n88r9Ug26_6R#&`R=(vzNilD;&mYB;2zjyoO`gI4uV>qw{O zNVH9CKDVJS+;CmynM>zVGHVihISJ`ciA3w&#j$u*);)V^Kqr1NaS%YT@X3|1I&jjJZUHMg&VGQs$BETT^Q7-N)Ob7$+rhO)qdQQPExqfSYeKhqrLJe^97cO zhYirkY8yI=%7^~K=dYiaXI==WGc6AQ{zet9k@_^mk(3yic*GG$#P*0ZmQuMG6sL%m`4jP$X%}@q?zj`9bcsDv($bo_ zPhLBoju+@uSAI>(;(+ekvYEbk(+#wG_3Gvg)J@wMyAX~gbFCP&J#LWa8urR-Jw^oC zJl1WtQ{rdj|C9-ov*ChxY1Nx5EXq=N9de&khIiwnP}kchBjZcspspW;ebSSl%29QV zjv_o||AE!cg(#n`Gm-Ydd8Q=+Z2u=*^?&}Np~{+?-rqFt*Q;ZZ3UMQOk7Zmw@mW89 zt_tzeS1L^U^t(oY$}{JUA2ob9SHDn`1;DHA_+k^-ffk;?TCxSZ4Zr{^-IOrL?JVn~kL6S^FYA8wn(FIPL;K zn}89OXD*|SCMQHv!$a%u6-aCy+mUal)Yz8I_t1@O51;tNC$>6^Hi=wF%3^1kTxiq? zi1UBqMR8l&7jR!Zt|d`>V_`Z`dLziHIcF2|j(KkeWR%43F3BIzNB)3$_T-jjyYni)n^6eN-uY^utDdtk0JIUl?7 z!!%b&p=rT@U6|P?P3xN>>;uecb1W~v;I-tLlBXe+_cRFy>W4@%w!&yuB_qQ2AgfOZ zJ$md=wr$w3;ZGiX@WJgYb#tsObG+Wq-KAL1JvJQv$zaKn^?ck+aTn^6rAu80))dFq zh_9#lmM*O@9}lr zl3)vuT(gc8J`5f?_BvUkhaOV)`h_W^C!P~7hrfY{nt=Gf{N^uX_0b0&c;FwIiTinb z|K7cO_iL7BZ2zH$9=dP+@y8SQKARqnWjB7si-IYA^zM&e|#Z(D}+S+#Y)9io%;xF+Z3{oU|!Dl&wKO zo6Q8DnJ~!?ZM|yInxb{-T0d@RBxM~G!6rtge()ooW+_|`Ct?JG$cJm%!cQram}3ekBqktDp(=Ii z`tG}Lvw7*yo{!D<^Rjj6(xqVF+_GiM_B*EWvU~UL{rsoT&CbpaBjOMLqRDUO1t3VA zJm5gt>5ROc%4g3U!^G@myzuRT=q1H#YFt;Mf5qT<2+;_eoY-7>q{OVmYM7lRot$7(*>;Ej1zE`4esLhJe zs)1`dsh(ARfI#Nuc0g~{P|7KrQ2`2^$Om( zY~Q|pa3cGI1Ug3o2ErqQKkNkN2BLBzbz+DMCRq(W)BQ!OV39>NYgsPkYH_>})r zc~p{ckAia`awxP1PWcI(mhaq-`QF{ z#wH8fNZ~oxRw-A#$v{i7KI4yn{r0cY%UvC3XLI zzx!P$na3S>TzFJ%5(r%$s@t67s4GI|%992L>u8I;L_iasPL|^PM4U%p3#l zA*52nk^=DuXO`haVH6b}IH^xiXX-%H0yFf0CduNcaE=NbS9)X;sG`HS(5}qh_%Szz zfC1n1Tfag#-}t$I<-@OM$-^l62&9>Tz=00N1ja&r=irIKK$JnEgxhS0m8QuD4+QUDb}TRs+b)rSBm(xCc>vH3`;m7Vj)A;bVIcp>Lr7nk ziCIjL`xj4m>Qkd}mS?g#h>o^spg?S+3{hu?5}BA((+_?}=RM~X(ceNUW1|@7|43Xj zJ3B)+{J+ndJOA}|y8gOGYYb&w*f5Ut3!@?c$N@(3{owufo8P>{@S47P=hx{gU%r_h*mfUq#m&r!n});T7kT^Z{J`#Fs4MCK z<2c?0TyeR8VDp^x1&Oqrg>kl#8E82If%56Jr5IKPClbMJ zH156-WvKAJ|GeckQHIJ9hxbeT^Bmh1YlR z`bJ)FWhPBAlaS0cSO8#~wT6#eF{u zObm5u`&*;vShA= zS%w=^J9g}t;s->eGvEg{k3RY+q|DtDok)QkQ#jianF#xahi1vLih))o4~85ATe%iv zZKNMu23slhm3tJdGcl7B$);Di8e*o7sX9IXeB@)gN@C!lHO1$NKf(5Bz|u9~WWZo< zZVn4EBZ(P_hZ}&IP)%JS$F`Q8gkuJr0;F1!1vt-H7rb;dWKZq(Me^iJZNPqbDG5>s ztq2TE0ep>lnhB3CZz$d|uh(}A-~l=(WkWqaNe1ghiANCI42LxzF!sDcqP8#A5L=prHz4FQ{ zMJl7`G-Dz$>*L+%D6}ev%$R(ECt^lbzm6VaQkEuQqKb#DQ)z@#EJZj4Xkpf`U+=y> z3I?!5S_~+{K4((EDB`udA;t`XVZ84o3SO2OM^II97UFHeJV;&u%@qDT3Jh#YNDDpl zdCxnQZP3Q0Y>TsH*)oGQZ1h1ZRuF3qdhc8hAO2|Eg7+J#dv>cD1@7I;~w_w3wh_CES3wrMXfSU<)BgyqqhnQO+~UuQJpzI2~rXbIE{Z=bSM!uuNb zzU~|%8kWvMZO94K6j2W(PO>Z-Itf^Yy-T>)j`O%9>CE%ayNLUWU&qo%OL$qDFZQ5A z4l#$aG>U|=#{}s19r_}LvM=kw;45#r;DXb}-MesPdT>!n4g&gM&C)WE*cxjvwN@!4 z4eO9yF`}+AQ3sf)Fy2^O*M-hF>#U7~Wy|iy$cM;C-d-Y1WCU>tm>8HefYXrBFEDK& z+uos|Bmb3ef6Z$yA9wFs>x~R5OyE`KRfnOV4sl1OxqIVH=k*{5oX$a&PZo1Hniwd77D?iTA$i4R3g2m;1JgfIyzW z$b`s?>qRv|67}eHt?E7`uSQN9mn^wkF_5MqnY@6B2Qz@5Lf97~m_e?(-q8dpUIH#nr6DR8wMhM2c*|=*)A@xro*9b<<%`6Xu5iBb|q4Cb|Jk#tp@b z>8Bu(X@4-d=aRR-y^|DzrbnGLX$)c3U#tXEu$QPqk(gUt27-3a&As&yqGxk<<5Wp? z0rBm_fF}0XY8<1{jMVm#nfkU#?z#9+xd;Tc-nW1Mm#3$u4g-3?=q`k)%UBwN4a}X2 zpK!-9lFNSRst + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/setup_dongle/dongle.png b/assets/setup_dongle/dongle.png new file mode 100644 index 0000000000000000000000000000000000000000..549d3a0560b362114ce24c038c965940bab7ef95 GIT binary patch literal 11514 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