diff --git a/.vscode/launch.json b/.vscode/launch.json index 437dd654..9205497b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,41 +1,127 @@ { "version": "0.2.0", "configurations": [ + // ===================== Client App ===================== { - "name": "Client (Dev) - Android", + "name": "Client [DEV] - Android", "request": "launch", "type": "dart", "program": "apps/mobile/apps/client/lib/main.dart", "args": [ + "--flavor", "dev", "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.dev.json" ] }, { - "name": "Client (Dev) - iOS", + "name": "Client [DEV] - iOS", "request": "launch", "type": "dart", "program": "apps/mobile/apps/client/lib/main.dart", "args": [ + "--flavor", "dev", "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.dev.json" ] }, { - "name": "Staff (Dev) - Android", + "name": "Client [STG] - Android", + "request": "launch", + "type": "dart", + "program": "apps/mobile/apps/client/lib/main.dart", + "args": [ + "--flavor", "stage", + "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.stage.json" + ] + }, + { + "name": "Client [STG] - iOS", + "request": "launch", + "type": "dart", + "program": "apps/mobile/apps/client/lib/main.dart", + "args": [ + "--flavor", "stage", + "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.stage.json" + ] + }, + { + "name": "Client [PROD] - Android", + "request": "launch", + "type": "dart", + "program": "apps/mobile/apps/client/lib/main.dart", + "args": [ + "--flavor", "prod", + "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.prod.json" + ] + }, + { + "name": "Client [PROD] - iOS", + "request": "launch", + "type": "dart", + "program": "apps/mobile/apps/client/lib/main.dart", + "args": [ + "--flavor", "prod", + "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.prod.json" + ] + }, + // ===================== Staff App ===================== + { + "name": "Staff [DEV] - Android", "request": "launch", "type": "dart", "program": "apps/mobile/apps/staff/lib/main.dart", "args": [ + "--flavor", "dev", "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.dev.json" ] }, { - "name": "Staff (Dev) - iOS", + "name": "Staff [DEV] - iOS", "request": "launch", "type": "dart", "program": "apps/mobile/apps/staff/lib/main.dart", "args": [ + "--flavor", "dev", "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.dev.json" ] + }, + { + "name": "Staff [STG] - Android", + "request": "launch", + "type": "dart", + "program": "apps/mobile/apps/staff/lib/main.dart", + "args": [ + "--flavor", "stage", + "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.stage.json" + ] + }, + { + "name": "Staff [STG] - iOS", + "request": "launch", + "type": "dart", + "program": "apps/mobile/apps/staff/lib/main.dart", + "args": [ + "--flavor", "stage", + "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.stage.json" + ] + }, + { + "name": "Staff [PROD] - Android", + "request": "launch", + "type": "dart", + "program": "apps/mobile/apps/staff/lib/main.dart", + "args": [ + "--flavor", "prod", + "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.prod.json" + ] + }, + { + "name": "Staff [PROD] - iOS", + "request": "launch", + "type": "dart", + "program": "apps/mobile/apps/staff/lib/main.dart", + "args": [ + "--flavor", "prod", + "--dart-define-from-file=${workspaceFolder}/apps/mobile/config.prod.json" + ] } ] -} \ No newline at end of file +} diff --git a/apps/mobile/melos.yaml b/apps/mobile/melos.yaml index ae2cce43..4320c631 100644 --- a/apps/mobile/melos.yaml +++ b/apps/mobile/melos.yaml @@ -14,15 +14,14 @@ scripts: echo " 🚀 KROW WORKFORCE CUSTOM COMMANDS 🚀" echo "============================================================" echo " BUILD COMMANDS:" - echo " - melos run build:client : Build Client App (APK)" - echo " - melos run build:staff : Build Staff App (APK)" + echo " - melos run build:client -- -- --flavor --dart-define-from-file=../../config..json" + echo " - melos run build:staff -- -- --flavor --dart-define-from-file=../../config..json" echo " - melos run build:design-system : Build Design System Viewer" echo "" echo " DEBUG/START COMMANDS:" - echo " - melos run start:client -- -d : Run Client App" - echo " - melos run start:staff -- -d : Run Staff App" + echo " - melos run start:client -- -d --flavor --dart-define-from-file=../../config..json" + echo " - melos run start:staff -- -d --flavor --dart-define-from-file=../../config..json" echo " - melos run start:design-system : Run DS Viewer" - echo " (e.g., melos run start:client -- -d chrome)" echo "" echo " CODE GENERATION:" echo " - melos run gen:l10n : Generate Slang l10n" @@ -49,32 +48,30 @@ scripts: packageFilters: dependsOn: build_runner + # Single-line scripts so that melos run arg forwarding works via -- + # Usage: melos run build:client -- apk --release --flavor dev --dart-define-from-file=../../config.dev.json build:client: - run: | - melos run gen:l10n --filter="core_localization" - melos run gen:build --filter="core_localization" - melos exec --scope="krowwithus_client" -- "flutter build apk" - description: "Build the Client app (Android APK by default)." + run: melos exec --scope="krowwithus_client" -- flutter build + description: "Build the Client app. Pass args via --: -- --flavor --dart-define-from-file=../../config..json" build:staff: - run: | - melos run gen:l10n --filter="core_localization" - melos run gen:build --filter="core_localization" - melos exec --scope="krowwithus_staff" -- "flutter build apk" - description: "Build the Staff app (Android APK by default)." + run: melos exec --scope="krowwithus_staff" -- flutter build + description: "Build the Staff app. Pass args via --: -- --flavor --dart-define-from-file=../../config..json" build:design-system-viewer: - run: melos exec --scope="design_system_viewer" -- "flutter build apk" + run: melos exec --scope="design_system_viewer" -- flutter build apk description: "Build the Design System Viewer app (Android APK by default)." + # Single-line scripts so that melos run arg forwarding works via -- + # Usage: melos run start:client -- -d android --flavor dev --dart-define-from-file=../../config.dev.json start:client: - run: melos exec --scope="krowwithus_client" -- "flutter run" - description: "Start the Client app. Pass platform using -- -d , e.g. -d chrome" + run: melos exec --scope="krowwithus_client" -- flutter run + description: "Start the Client app. Pass args via --: -d --flavor --dart-define-from-file=../../config..json" start:staff: - run: melos exec --scope="krowwithus_staff" -- "flutter run" - description: "Start the Staff app. Pass platform using -- -d , e.g. -d chrome" + run: melos exec --scope="krowwithus_staff" -- flutter run + description: "Start the Staff app. Pass args via --: -d --flavor --dart-define-from-file=../../config..json" start:design-system-viewer: - run: melos exec --scope="design_system_viewer" -- "flutter run" + run: melos exec --scope="design_system_viewer" -- flutter run description: "Start the Design System Viewer app. Pass platform using -- -d , e.g. -d chrome" diff --git a/codemagic.yaml b/codemagic.yaml index f391b001..1dd6fac4 100644 --- a/codemagic.yaml +++ b/codemagic.yaml @@ -40,10 +40,12 @@ distribute-android-script: &distribute-android-script name: 🚀 🤖 Distribute Android to Firebase App Distribution script: | # Distribute Android APK - # Note: With flavors the APK is in a flavor-specific subdirectory - APP_PATH=$(find apps/mobile/apps -name "app-${ENV}-release.apk" -o -name "app-release.apk" | head -n 1) + # With flavors the APK is at: build/app/outputs/apk//release/app--release.apk + APP_PATH=$(find apps/mobile/apps -name "app-${ENV}-release.apk" | head -n 1) if [ -z "$APP_PATH" ]; then - echo "No APK found!" + echo "❌ No APK found matching app-${ENV}-release.apk — was --flavor ${ENV} applied during build?" + echo "Listing all APKs found:" + find apps/mobile/apps -name "*.apk" -type f exit 1 fi echo "Found APK at: $APP_PATH" diff --git a/makefiles/mobile.mk b/makefiles/mobile.mk index 4b1e3dee..de6dbc0d 100644 --- a/makefiles/mobile.mk +++ b/makefiles/mobile.mk @@ -53,9 +53,9 @@ mobile-client-build: dataconnect-generate-sdk $(eval MODE ?= release) @echo "--> Building client app for $(PLATFORM) in $(MODE) mode (env: $(ENV))..." @cd $(MOBILE_DIR) && \ - melos exec --scope="core_localization" -- "dart run slang" && \ - melos exec --scope="core_localization" -- "dart run build_runner build --delete-conflicting-outputs" && \ - melos exec --scope="krowwithus_client" -- "flutter build $(PLATFORM) --$(MODE) --flavor $(ENV) --dart-define-from-file=../../config.$(ENV).json" + melos run gen:l10n && \ + melos run gen:build && \ + melos run build:client -- $(PLATFORM) --$(MODE) --flavor $(ENV) --dart-define-from-file=../../config.$(ENV).json # --- Staff App --- mobile-staff-dev-android: dataconnect-generate-sdk @@ -69,9 +69,9 @@ mobile-staff-build: dataconnect-generate-sdk $(eval MODE ?= release) @echo "--> Building staff app for $(PLATFORM) in $(MODE) mode (env: $(ENV))..." @cd $(MOBILE_DIR) && \ - melos exec --scope="core_localization" -- "dart run slang" && \ - melos exec --scope="core_localization" -- "dart run build_runner build --delete-conflicting-outputs" && \ - melos exec --scope="krowwithus_staff" -- "flutter build $(PLATFORM) --$(MODE) --flavor $(ENV) --dart-define-from-file=../../config.$(ENV).json" + melos run gen:l10n && \ + melos run gen:build && \ + melos run build:staff -- $(PLATFORM) --$(MODE) --flavor $(ENV) --dart-define-from-file=../../config.$(ENV).json # --- E2E (Maestro) --- # Set env before running: TEST_CLIENT_EMAIL, TEST_CLIENT_PASSWORD, TEST_CLIENT_COMPANY, TEST_STAFF_PHONE, TEST_STAFF_OTP, TEST_STAFF_SIGNUP_PHONE