From 065af4fd7f7685fe347bfa6f4ae4928327df626e Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Tue, 3 Feb 2026 12:59:44 -0500 Subject: [PATCH] Integrate Google Maps Places Autocomplete for hub address validation; update demo plan and Firebase configurations --- apps/demo plans/MILESTONE 3_DEMO_PLAN.md | 52 +++++++++++-------- apps/mobile/NEXT_SPRINT_TASKS.md | 1 + .../client/android/app/google-services.json | 8 +++ apps/mobile/apps/client/firebase.json | 1 + .../ios/Runner/GoogleService-Info.plist | 2 +- .../apps/client/lib/firebase_options.dart | 6 ++- .../staff/android/app/google-services.json | 8 +++ .../staff/ios/Runner/GoogleService-Info.plist | 2 +- .../apps/staff/lib/firebase_options.dart | 10 ++-- .../otp_verification_header.dart | 2 +- 10 files changed, 64 insertions(+), 28 deletions(-) create mode 100644 apps/mobile/apps/client/firebase.json diff --git a/apps/demo plans/MILESTONE 3_DEMO_PLAN.md b/apps/demo plans/MILESTONE 3_DEMO_PLAN.md index fbd9d8c7..228e0637 100644 --- a/apps/demo plans/MILESTONE 3_DEMO_PLAN.md +++ b/apps/demo plans/MILESTONE 3_DEMO_PLAN.md @@ -1,7 +1,7 @@ # KROW Workforce Platform — Feature Demo Plan for Milestone 3 **Version:** Milestone 3 (v3.0) -**Date:** February 2, 2026 +**Date:** February 3, 2026 **Audience:** Business Stakeholders, Customer Engineers, Sales Teams **Duration:** 25-30 minutes @@ -28,33 +28,41 @@ This demo showcases the progress of the milestone 3. ### Required Test Accounts **Client Account (Business User):** -- Email: `google_payment@gmail.com` +- Email: `legendary@krowd.com` - Password: `Demo2026!` -- Client Name: "Google Payements" +- Client Name: "Krow" **Staff Account (Worker):** -- Phone: `+1 (555) 123-4567` +- Phone: `+1 (555) 765-4321` - OTP Code: `123456` (demo mode) -- Name: "Alex Martinez" +- Name: "Mariana Torres" ### Prerequisites 1. ✅ Both apps installed on demo devices (or simulators) 2. ✅ Network connection stable 3. ✅ Seed data is ready to be populated - the database should be empty. - - remove unnecessary users from the firebase authetication. ### Pre-Demo Data Seeding Tracked in : - https://github.com/Oloodi/krow-workforce/issues/345 -- This should be easily populated and de-populated by the demonstrator to show the empty states in the apps. - At the start the database should be empty. +- Commands to use: + - `make dataconnect-clean` + - To clean the database before seeding. + - `make dataconnect-seed` + - To populate the database with seed data for demo. + --- ## 3️⃣ Demo Flows +**Note:** +To start the demo you should clean the database running the next command: + - make dataconnect-clean + ### Demo 0: Show Empty Database **Purpose:** Demonstrate the starting point before any data exists **Action:** Show the empty database in Firebase console @@ -64,9 +72,9 @@ Tracked in : ### Demo 1: Register Business & Show Empty States (Client App) **Purpose:** Show the client onboarding experience and empty states **Steps:** -1. Open Client App → Tap "Create Account" -2. Enter business details (email, password, company name) -3. Complete sign up and navigate to home page +1. Open Client App → Tap "Register" +2. Enter business email, and password. +3. Navigate to home page 4. **Point out:** Empty dashboard, no orders, no workers, clean slate --- @@ -74,16 +82,18 @@ Tracked in : ### Demo 2: Register Staff & Show Empty States (Staff App) **Purpose:** Show the worker onboarding experience and empty states **Steps:** -1. Open Staff App → Tap "Sign Up" +1. Open Staff App → Tap "Register" 2. Enter phone number and verify with OTP code -3. Complete profile setup wizard (skip detailed sections for speed) -4. Navigate to home page -5. **Point out:** Empty shifts list, no available work yet +3. Navigate to home page +4. **Point out:** Empty shifts list, no available work yet --- > **🔄 PAUSE HERE:** Populate the database with seed data (run seeding script) +- Potulate database with the next comand : + - make dataconnect-seed + --- ### Demo 3: Client Logs In with Existing Account @@ -93,7 +103,7 @@ Tracked in : 1. Restart Client App 2. Tap "Sign In" button 3. Enter credentials: - - Email: `google_payment@gmail.com` + - Email: `legendary@krowd.com` - Password: `Demo2026!` 4. Tap "Sign In" @@ -133,13 +143,13 @@ Tracked in : > ``` >Client Posts Shift [O1] > ↓ ->*Vendor Accepts the Shift (This Part is missing for now)* [O2] +>*Vendor Accepts the Shift (This Part is missing for now)/ Vendor is selected by client* [O2] > ↓ >Worker Searches for a Shift [O3] > ↓ >Worker Applies [O4] > ↓ ->Confirmation [O5] +>Confirmation (This Part is missing for now, for now is confirmed)*[O5] > ↓ >Worker Checks In [O6] > ↓ @@ -157,12 +167,12 @@ Tracked in : - Order name: "Spring Gala 2026" - Date: [Select upcoming date] - Location: [Select existing hub] -- Add position: Server, Count: 3, Hours: 5PM-11PM +- Add position: Server, Count: 3, Hours: 5PM-9PM --- ### Demo 7: Client Views Order Details -**Purpose:** Show detailed shift information and worker assignments +**Purpose:** Show detailed shift information and worker assignments (this second part is missing for now) **Screen:** Orders Tab → Tap on any order card **Action:** Expand order to see full details @@ -244,7 +254,7 @@ Tracked in : --- -### Demo 14: Staff Checks In to Shift (Day of Event) - [O6] +### Demo 14: Staff Checks In to Shift (Day of Event) [O6] **Purpose:** Demonstrate the check-in process **Screen:** Home or My Shifts → Shift Card → "Check In" button **Action:** Simulate checking in to an active shift @@ -267,7 +277,7 @@ Tracked in : --- -### Demo 16: Staff Checks Out of Shift - [O7] +### Demo 16: Staff Checks Out of Shift - - (this is under fixing)[O7] **Purpose:** Demonstrate the check-out process and shift completion **Screen:** Home or My Shifts → Shift Card → "Check Out" button diff --git a/apps/mobile/NEXT_SPRINT_TASKS.md b/apps/mobile/NEXT_SPRINT_TASKS.md index 0b758f51..babe1f19 100644 --- a/apps/mobile/NEXT_SPRINT_TASKS.md +++ b/apps/mobile/NEXT_SPRINT_TASKS.md @@ -13,3 +13,4 @@ - Fix the location field in CoverageShiftRole to use the correct fallback logic. - line 125 remove redundant location values. - Need to clarify the difference b/w `case dc.ApplicationStatus.ACCEPTED` and `case dc.ApplicationStatus.CONFIRMED`. +- Update the dataconnect docs. diff --git a/apps/mobile/apps/client/android/app/google-services.json b/apps/mobile/apps/client/android/app/google-services.json index 20ad2e48..fcd3c0e0 100644 --- a/apps/mobile/apps/client/android/app/google-services.json +++ b/apps/mobile/apps/client/android/app/google-services.json @@ -85,6 +85,14 @@ } }, "oauth_client": [ + { + "client_id": "933560802882-fbqg2icq24bmci3f84evjrbth5huh87f.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.krowwithus.client", + "certificate_hash": "c3efbe1642239c599c16ad04c7fac340902fe280" + } + }, { "client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com", "client_type": 3 diff --git a/apps/mobile/apps/client/firebase.json b/apps/mobile/apps/client/firebase.json new file mode 100644 index 00000000..09f707ae --- /dev/null +++ b/apps/mobile/apps/client/firebase.json @@ -0,0 +1 @@ +{"flutter":{"platforms":{"android":{"default":{"projectId":"krow-workforce-dev","appId":"1:933560802882:android:da13569105659ead7757db","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"krow-workforce-dev","appId":"1:933560802882:ios:d2b6d743608e2a527757db","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"krow-workforce-dev","configurations":{"android":"1:933560802882:android:da13569105659ead7757db","ios":"1:933560802882:ios:d2b6d743608e2a527757db","web":"1:933560802882:web:173a841992885bb27757db"}}}}}} \ No newline at end of file diff --git a/apps/mobile/apps/client/ios/Runner/GoogleService-Info.plist b/apps/mobile/apps/client/ios/Runner/GoogleService-Info.plist index fbbfcc69..86d280e1 100644 --- a/apps/mobile/apps/client/ios/Runner/GoogleService-Info.plist +++ b/apps/mobile/apps/client/ios/Runner/GoogleService-Info.plist @@ -7,7 +7,7 @@ REVERSED_CLIENT_ID com.googleusercontent.apps.933560802882-jqpv1l3gjmi3m87b2gu1iq4lg46lkdfg ANDROID_CLIENT_ID - 933560802882-ikdfv3o5f47g36qqgvfq55o4m19n7gk4.apps.googleusercontent.com + 933560802882-fbqg2icq24bmci3f84evjrbth5huh87f.apps.googleusercontent.com API_KEY AIzaSyDyEXkzZAWpXXe4dAesYaZflt5BEtMn9tA GCM_SENDER_ID diff --git a/apps/mobile/apps/client/lib/firebase_options.dart b/apps/mobile/apps/client/lib/firebase_options.dart index 08a57ddc..f703aa10 100644 --- a/apps/mobile/apps/client/lib/firebase_options.dart +++ b/apps/mobile/apps/client/lib/firebase_options.dart @@ -53,6 +53,7 @@ class DefaultFirebaseOptions { projectId: 'krow-workforce-dev', authDomain: 'krow-workforce-dev.firebaseapp.com', storageBucket: 'krow-workforce-dev.firebasestorage.app', + measurementId: 'G-9S7WEQTDKX', ); static const FirebaseOptions android = FirebaseOptions( @@ -69,6 +70,9 @@ class DefaultFirebaseOptions { messagingSenderId: '933560802882', projectId: 'krow-workforce-dev', storageBucket: 'krow-workforce-dev.firebasestorage.app', + androidClientId: '933560802882-fbqg2icq24bmci3f84evjrbth5huh87f.apps.googleusercontent.com', + iosClientId: '933560802882-jqpv1l3gjmi3m87b2gu1iq4lg46lkdfg.apps.googleusercontent.com', iosBundleId: 'com.krowwithus.client', ); -} + +} \ No newline at end of file diff --git a/apps/mobile/apps/staff/android/app/google-services.json b/apps/mobile/apps/staff/android/app/google-services.json index 5718b28d..fcd3c0e0 100644 --- a/apps/mobile/apps/staff/android/app/google-services.json +++ b/apps/mobile/apps/staff/android/app/google-services.json @@ -129,6 +129,14 @@ } }, "oauth_client": [ + { + "client_id": "933560802882-ikdfv3o5f47g36qqgvfq55o4m19n7gk4.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.krowwithus.staff", + "certificate_hash": "ac917ae8470ab29f1107c773c6017ff5ea5d102d" + } + }, { "client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com", "client_type": 3 diff --git a/apps/mobile/apps/staff/ios/Runner/GoogleService-Info.plist b/apps/mobile/apps/staff/ios/Runner/GoogleService-Info.plist index 4a0f6b5d..7fc4d7e6 100644 --- a/apps/mobile/apps/staff/ios/Runner/GoogleService-Info.plist +++ b/apps/mobile/apps/staff/ios/Runner/GoogleService-Info.plist @@ -7,7 +7,7 @@ REVERSED_CLIENT_ID com.googleusercontent.apps.933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh ANDROID_CLIENT_ID - 933560802882-ikdfv3o5f47g36qqgvfq55o4m19n7gk4.apps.googleusercontent.com + 933560802882-fbqg2icq24bmci3f84evjrbth5huh87f.apps.googleusercontent.com API_KEY AIzaSyDyEXkzZAWpXXe4dAesYaZflt5BEtMn9tA GCM_SENDER_ID diff --git a/apps/mobile/apps/staff/lib/firebase_options.dart b/apps/mobile/apps/staff/lib/firebase_options.dart index 343d9f5e..3945a3a2 100644 --- a/apps/mobile/apps/staff/lib/firebase_options.dart +++ b/apps/mobile/apps/staff/lib/firebase_options.dart @@ -48,16 +48,17 @@ class DefaultFirebaseOptions { static const FirebaseOptions web = FirebaseOptions( apiKey: 'AIzaSyBqRtZPMGU-Sz5x5UnRrunKu5NSWYyPRn8', - appId: '1:933560802882:web:4508ef1ee6d4e6907757db', + appId: '1:933560802882:web:173a841992885bb27757db', messagingSenderId: '933560802882', projectId: 'krow-workforce-dev', authDomain: 'krow-workforce-dev.firebaseapp.com', storageBucket: 'krow-workforce-dev.firebasestorage.app', + measurementId: 'G-9S7WEQTDKX', ); static const FirebaseOptions android = FirebaseOptions( apiKey: 'AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4', - appId: '1:933560802882:android:d49b8c0f4d19e95e7757db', + appId: '1:933560802882:android:1ae05d85c865f77c7757db', messagingSenderId: '933560802882', projectId: 'krow-workforce-dev', storageBucket: 'krow-workforce-dev.firebasestorage.app', @@ -69,6 +70,9 @@ class DefaultFirebaseOptions { messagingSenderId: '933560802882', projectId: 'krow-workforce-dev', storageBucket: 'krow-workforce-dev.firebasestorage.app', + androidClientId: '933560802882-fbqg2icq24bmci3f84evjrbth5huh87f.apps.googleusercontent.com', + iosClientId: '933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com', iosBundleId: 'com.krowwithus.staff', ); -} + +} \ No newline at end of file diff --git a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_header.dart b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_header.dart index 50837e68..ec4ff79c 100644 --- a/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_header.dart +++ b/apps/mobile/packages/features/staff/authentication/lib/src/presentation/widgets/phone_verification_page/otp_verification/otp_verification_header.dart @@ -28,7 +28,7 @@ class OtpVerificationHeader extends StatelessWidget { .code_sent_message, style: UiTypography.body2r.textSecondary, children: [ - TextSpan(text: '+1 $phoneNumber', style: UiTypography.body2b), + TextSpan(text: phoneNumber, style: UiTypography.body2b), TextSpan( text: t .staff_authentication