Merge pull request #639 from Oloodi/588-implement-review-order-before-submitting-in-frontend

Introduce Flavours and the review order page
This commit is contained in:
Achintha Isuru
2026-03-09 19:54:40 -04:00
committed by GitHub
84 changed files with 7229 additions and 487 deletions

View File

@@ -0,0 +1,33 @@
# Architecture Reviewer Memory
## Project Structure Confirmed
- Feature packages: `apps/mobile/packages/features/<app>/<feature>/`
- Domain: `apps/mobile/packages/domain/`
- Design system: `apps/mobile/packages/design_system/`
- Core: `apps/mobile/packages/core/`
- Data Connect: `apps/mobile/packages/data_connect/`
- `client_orders_common` is at `apps/mobile/packages/features/client/orders/orders_common/` (shared across order features)
## BLoC Registration Pattern
- BLoCs registered with `i.add<>()` (transient) per CLAUDE.md -- NOT singletons
- This means `BlocProvider(create:)` is CORRECT (not `BlocProvider.value()`)
- `SafeBloc` mixin exists in core alongside `BlocErrorHandler`
## Known Pre-existing Issues (create_order feature)
- All 3 order BLoCs make direct `_service.connector` calls for loading vendors, hubs, roles, and managers instead of going through use cases/repositories (CRITICAL per rules, but pre-existing)
- `firebase_data_connect` and `firebase_auth` are listed as direct dependencies in `client_create_order/pubspec.yaml` (should only be in `data_connect` package)
- All 3 order pages use `Modular.to.pop()` instead of `Modular.to.popSafe()` for the back button
## Design System Tokens
- Colors: `UiColors.*`
- Typography: `UiTypography.*`
- Spacing: `UiConstants.space*` (e.g., `space3`, `space4`, `space6`)
- App bar: `UiAppBar`
## Review Patterns (grep-based checks)
- `Color(0x` for hardcoded colors
- `TextStyle(` for custom text styles
- `Navigator.` for direct navigator usage
- `import.*features/` for cross-feature imports (must be zero)
- `_service.connector` in BLoC files for direct data connect calls
- `Modular.to.pop()` for unsafe navigation (should be `popSafe()`)

View File

@@ -1,12 +1,12 @@
---
name: architecture-reviewer
name: mobile-architecture-reviewer
description: "Use this agent when code changes need to be reviewed for Clean Architecture compliance, design system adherence, and established pattern conformance in the KROW Workforce mobile platform. This includes pull request reviews, branch comparisons, or any time new or modified code needs architectural validation.\\n\\nExamples:\\n\\n- Example 1:\\n user: \"Review the changes in the current branch for architecture compliance\"\\n assistant: \"I'll use the Architecture Review Agent to perform a comprehensive architectural review of the current changes.\"\\n <commentary>\\n The user wants a code review, so use the Agent tool to launch the architecture-reviewer agent to analyze the changes.\\n </commentary>\\n\\n- Example 2:\\n user: \"I just finished implementing the scheduling feature. Here's the PR.\"\\n assistant: \"Let me use the Architecture Review Agent to review your scheduling feature implementation for Clean Architecture compliance and design system adherence.\"\\n <commentary>\\n A new feature has been implemented. Use the Agent tool to launch the architecture-reviewer agent to validate the code against architectural rules before it gets merged.\\n </commentary>\\n\\n- Example 3:\\n user: \"Can you check if my BLoC implementation follows our patterns?\"\\n assistant: \"I'll launch the Architecture Review Agent to validate your BLoC implementation against our established patterns including SessionHandlerMixin, BlocErrorHandler, and singleton registration.\"\\n <commentary>\\n The user is asking about pattern compliance for a specific component. Use the Agent tool to launch the architecture-reviewer agent to check BLoC patterns.\\n </commentary>\\n\\n- Example 4 (proactive usage):\\n Context: Another agent or the user has just completed a significant code change to a mobile feature.\\n assistant: \"The feature implementation is complete. Let me now run the Architecture Review Agent to ensure everything complies with our Clean Architecture rules and design system before we proceed.\"\\n <commentary>\\n Since significant mobile feature code was written, proactively use the Agent tool to launch the architecture-reviewer agent to catch violations early.\\n </commentary>"
model: opus
color: green
memory: project
---
You are the **Architecture Review Agent**, an elite software architect specializing in Clean Architecture enforcement for the KROW Workforce Flutter mobile platform. You have deep expertise in Flutter/Dart, BLoC state management, Clean Architecture layer separation, and design system governance. You operate with **zero tolerance** for critical and high-severity violations.
You are the **Mobile Architecture Review Agent**, an elite software architect specializing in Clean Architecture enforcement for the KROW Workforce Flutter mobile platform. You have deep expertise in Flutter/Dart, BLoC state management, Clean Architecture layer separation, and design system governance. You operate with **zero tolerance** for critical and high-severity violations.
## Initialization

94
.vscode/launch.json vendored
View File

@@ -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"
]
}
]
}

View File

@@ -21,8 +21,20 @@ dartDefinesString.split(",").forEach {
}
}
// Load flavor-specific key properties: key.dev.properties, key.stage.properties, key.prod.properties
// The active flavor is resolved from the Gradle task name (e.g. assembleDevRelease -> dev)
fun resolveFlavorFromTask(): String {
val taskNames = gradle.startParameter.taskNames.joinToString(" ").lowercase()
return when {
taskNames.contains("prod") -> "prod"
taskNames.contains("stage") -> "stage"
else -> "dev"
}
}
val activeFlavorForSigning = resolveFlavorFromTask()
val keystoreProperties = Properties().apply {
val propertiesFile = rootProject.file("key.properties")
val propertiesFile = rootProject.file("key.${activeFlavorForSigning}.properties")
if (propertiesFile.exists()) {
load(propertiesFile.inputStream())
}
@@ -43,8 +55,7 @@ android {
}
defaultConfig {
applicationId = "com.krowwithus.client"
// You can update the following values to match your application needs.
// applicationId is set per flavor below
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
@@ -53,6 +64,25 @@ android {
manifestPlaceholders["GOOGLE_MAPS_API_KEY"] = dartEnvironmentVariables["GOOGLE_MAPS_API_KEY"] ?: ""
}
flavorDimensions += "environment"
productFlavors {
create("dev") {
dimension = "environment"
applicationId = "dev.krowwithus.client"
resValue("string", "app_name", "KROW With Us Business [DEV]")
}
create("stage") {
dimension = "environment"
applicationId = "stage.krowwithus.client"
resValue("string", "app_name", "KROW With Us Business [STG]")
}
create("prod") {
dimension = "environment"
applicationId = "prod.krowwithus.client"
resValue("string", "app_name", "KROW Client")
}
}
signingConfigs {
create("release") {
if (System.getenv()["CI"] == "true") {
@@ -62,7 +92,7 @@ android {
keyAlias = System.getenv()["CM_KEY_ALIAS"]
keyPassword = System.getenv()["CM_KEY_PASSWORD"]
} else {
// Local development environment
// Local development environment — loads from key.<flavor>.properties
keyAlias = keystoreProperties["keyAlias"] as String?
keyPassword = keystoreProperties["keyPassword"] as String?
storeFile = keystoreProperties["storeFile"]?.let { file(it) }
@@ -73,13 +103,25 @@ android {
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.getByName("release")
}
}
}
// Skip google-services processing for flavors whose google-services.json
// contains placeholder values (e.g. prod before the Firebase project exists).
// Once a real config is dropped in, the task automatically re-enables.
afterEvaluate {
tasks.matching {
it.name.startsWith("process") && it.name.endsWith("GoogleServices")
}.configureEach {
val taskFlavor = name.removePrefix("process").removeSuffix("GoogleServices")
.removeSuffix("Debug").removeSuffix("Release").lowercase()
val configFile = file("src/$taskFlavor/google-services.json")
enabled = configFile.exists() && configFile.readText().contains("\"mobilesdk_app_id\": \"1:")
}
}
flutter {
source = "../.."
}

View File

@@ -5,78 +5,6 @@
"storage_bucket": "krow-workforce-dev.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:edcddb83ea4bbb517757db",
"android_client_info": {
"package_name": "com.krow.app.business.dev"
}
},
"oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.krowwithus.staff"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:d49b8c0f4d19e95e7757db",
"android_client_info": {
"package_name": "com.krow.app.staff.dev"
}
},
"oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.krowwithus.staff"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:da13569105659ead7757db",
@@ -164,6 +92,78 @@
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:1eb46251032273cb7757db",
"android_client_info": {
"package_name": "dev.krowwithus.client"
}
},
"oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.krowwithus.staff"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:ee100eab75b6b04c7757db",
"android_client_info": {
"package_name": "dev.krowwithus.staff"
}
},
"oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.krowwithus.staff"
}
}
]
}
}
}
],
"configuration_version": "1"

View File

@@ -1,6 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="KROW With Us Client"
android:label="@string/app_name"
android:name="${applicationName}"
android:icon="@mipmap/launcher_icon">
<activity

View File

@@ -0,0 +1,48 @@
{
"project_info": {
"project_number": "1032971403708",
"project_id": "krow-workforce-staging",
"storage_bucket": "krow-workforce-staging.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:1032971403708:android:1ab9badf171c3aca356bb9",
"android_client_info": {
"package_name": "stage.krowwithus.client"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAZ4dOatvf3ZBt4qnbSlIvJ51bblHaRsRw"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:1032971403708:android:14e471d055e59597356bb9",
"android_client_info": {
"package_name": "stage.krowwithus.staff"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAZ4dOatvf3ZBt4qnbSlIvJ51bblHaRsRw"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

View File

@@ -0,0 +1,9 @@
storePassword=krowwithus
keyPassword=krowwithus
keyAlias=krow_client_prod
storeFile=krow_with_us_client_prod.jks
###
### Client Prod
### SHA1: B2:80:46:90:7F:E5:9E:86:62:7B:06:90:AC:C0:20:02:73:5B:20:5C
### SHA256: D8:3C:B0:07:B5:95:3C:82:2F:2C:A9:F6:8D:6F:77:B9:31:9D:BE:E9:74:4A:59:D9:7F:DC:EB:E2:C6:26:AB:27

View File

@@ -0,0 +1,9 @@
storePassword=krowwithus
keyPassword=krowwithus
keyAlias=krow_client_stage
storeFile=krow_with_us_client_stage.jks
###
### Client Stage
### SHA1: 89:9F:12:9E:A5:18:AC:1D:75:73:29:0B:F2:C2:E6:EB:38:B0:F0:A0
### SHA256: 80:13:10:CB:88:A8:8D:E9:F6:9E:D6:55:53:9C:BE:2D:D4:9C:7A:26:56:A3:E9:70:7C:F5:9A:A7:20:1A:6D:FE

View File

@@ -1 +1,31 @@
{"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"}}}}}}
{
"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"
}
}
}
}
}
}

View File

@@ -149,6 +149,7 @@
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
9740EEB61CF901F6004384FC /* Run Script */,
BC26E38F2F5F614000517BDF /* ShellScript */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
@@ -257,6 +258,24 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
BC26E38F2F5F614000517BDF /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# Tye a script or drag a script file from your workspace to insert its path.\n$PROJECT_DIR/scripts/copy-firebase-config.sh\n\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -363,6 +382,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business [STAGE]";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -372,7 +392,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_BUNDLE_IDENTIFIER = stage.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -542,6 +562,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business [DEV] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -551,7 +572,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_BUNDLE_IDENTIFIER = dev.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -564,6 +585,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -573,7 +595,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_BUNDLE_IDENTIFIER = prod.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -581,6 +603,837 @@
};
name = Release;
};
BC26E3562F5F5AC000517BDF /* Debug-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = "Debug-dev";
};
BC26E3572F5F5AC000517BDF /* Debug-dev */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business [DEV] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = dev.krowwithus.client;
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-dev";
};
BC26E3582F5F5AC000517BDF /* Debug-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Debug-dev";
};
BC26E3592F5F5AC500517BDF /* Debug-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = "Debug-stage";
};
BC26E35A2F5F5AC500517BDF /* Debug-stage */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business [STAGE] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = stage.krowwithus.client;
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-stage";
};
BC26E35B2F5F5AC500517BDF /* Debug-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Debug-stage";
};
BC26E35C2F5F5ACB00517BDF /* Debug-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = "Debug-prod";
};
BC26E35D2F5F5ACB00517BDF /* Debug-prod */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = prod.krowwithus.client;
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-prod";
};
BC26E35E2F5F5ACB00517BDF /* Debug-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Debug-prod";
};
BC26E35F2F5F5AD200517BDF /* Profile-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = "Profile-dev";
};
BC26E3602F5F5AD200517BDF /* Profile-dev */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business [DEV] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = dev.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Profile-dev";
};
BC26E3612F5F5AD200517BDF /* Profile-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Profile-dev";
};
BC26E3622F5F5AD800517BDF /* Profile-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = "Profile-stage";
};
BC26E3632F5F5AD800517BDF /* Profile-stage */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business [STAGE]";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = stage.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Profile-stage";
};
BC26E3642F5F5AD800517BDF /* Profile-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Profile-stage";
};
BC26E3652F5F5AE300517BDF /* Profile-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = "Profile-prod";
};
BC26E3662F5F5AE300517BDF /* Profile-prod */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = prod.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Profile-prod";
};
BC26E3672F5F5AE300517BDF /* Profile-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Profile-prod";
};
BC26E3682F5F5AE800517BDF /* Release-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.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-dev";
};
BC26E3692F5F5AE800517BDF /* Release-dev */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business [DEV] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = dev.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Release-dev";
};
BC26E36A2F5F5AE800517BDF /* Release-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Release-dev";
};
BC26E36B2F5F5AED00517BDF /* Release-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.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-stage";
};
BC26E36C2F5F5AED00517BDF /* Release-stage */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business [STAGE] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = stage.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Release-stage";
};
BC26E36D2F5F5AED00517BDF /* Release-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Release-stage";
};
BC26E36E2F5F5AF300517BDF /* Release-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.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-prod";
};
BC26E36F2F5F5AF300517BDF /* Release-prod */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us Business";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = prod.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Release-prod";
};
BC26E3702F5F5AF300517BDF /* Release-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.client;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Release-prod";
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -588,8 +1441,17 @@
isa = XCConfigurationList;
buildConfigurations = (
331C8088294A63A400263BE5 /* Debug */,
BC26E35E2F5F5ACB00517BDF /* Debug-prod */,
BC26E35B2F5F5AC500517BDF /* Debug-stage */,
BC26E3582F5F5AC000517BDF /* Debug-dev */,
331C8089294A63A400263BE5 /* Release */,
BC26E3702F5F5AF300517BDF /* Release-prod */,
BC26E36D2F5F5AED00517BDF /* Release-stage */,
BC26E36A2F5F5AE800517BDF /* Release-dev */,
331C808A294A63A400263BE5 /* Profile */,
BC26E3672F5F5AE300517BDF /* Profile-prod */,
BC26E3642F5F5AD800517BDF /* Profile-stage */,
BC26E3612F5F5AD200517BDF /* Profile-dev */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -598,8 +1460,17 @@
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
BC26E35C2F5F5ACB00517BDF /* Debug-prod */,
BC26E3592F5F5AC500517BDF /* Debug-stage */,
BC26E3562F5F5AC000517BDF /* Debug-dev */,
97C147041CF9000F007C117D /* Release */,
BC26E36E2F5F5AF300517BDF /* Release-prod */,
BC26E36B2F5F5AED00517BDF /* Release-stage */,
BC26E3682F5F5AE800517BDF /* Release-dev */,
249021D3217E4FDB00AE95B9 /* Profile */,
BC26E3652F5F5AE300517BDF /* Profile-prod */,
BC26E3622F5F5AD800517BDF /* Profile-stage */,
BC26E35F2F5F5AD200517BDF /* Profile-dev */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -608,8 +1479,17 @@
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
BC26E35D2F5F5ACB00517BDF /* Debug-prod */,
BC26E35A2F5F5AC500517BDF /* Debug-stage */,
BC26E3572F5F5AC000517BDF /* Debug-dev */,
97C147071CF9000F007C117D /* Release */,
BC26E36F2F5F5AF300517BDF /* Release-prod */,
BC26E36C2F5F5AED00517BDF /* Release-stage */,
BC26E3692F5F5AE800517BDF /* Release-dev */,
249021D4217E4FDB00AE95B9 /* Profile */,
BC26E3662F5F5AE300517BDF /* Profile-prod */,
BC26E3632F5F5AD800517BDF /* Profile-stage */,
BC26E3602F5F5AD200517BDF /* Profile-dev */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2630"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug-dev"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug-dev"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile-dev"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug-dev">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release-dev"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2630"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug-prod"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug-prod"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile-prod"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug-prod">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release-prod"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2630"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug-stage"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug-stage"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile-stage"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug-stage">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release-stage"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>KROW With Us Client</string>
<string>$(APP_NAME)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@@ -13,7 +13,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>KROW With Us Client</string>
<string>$(APP_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>

View File

@@ -3,9 +3,9 @@
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com</string>
<string>933560802882-jpv087j5jenp1h63mc9ge51767s3l2ac.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh</string>
<string>com.googleusercontent.apps.933560802882-jpv087j5jenp1h63mc9ge51767s3l2ac</string>
<key>ANDROID_CLIENT_ID</key>
<string>933560802882-fbqg2icq24bmci3f84evjrbth5huh87f.apps.googleusercontent.com</string>
<key>API_KEY</key>
@@ -15,7 +15,7 @@
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>com.krowwithus.staff</string>
<string>dev.krowwithus.client</string>
<key>PROJECT_ID</key>
<string>krow-workforce-dev</string>
<key>STORAGE_BUCKET</key>
@@ -31,6 +31,6 @@
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:933560802882:ios:fa584205b356de937757db</string>
<string>1:933560802882:ios:7e179dfdd1a8994c7757db</string>
</dict>
</plist>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>API_KEY</key>
<string>AIzaSyCgTXI3QhbEK3r4J5y7ek_6AxqhmR99QjY</string>
<key>GCM_SENDER_ID</key>
<string>1032971403708</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>stage.krowwithus.client</string>
<key>PROJECT_ID</key>
<string>krow-workforce-staging</string>
<key>STORAGE_BUCKET</key>
<string>krow-workforce-staging.firebasestorage.app</string>
<key>IS_ADS_ENABLED</key>
<false></false>
<key>IS_ANALYTICS_ENABLED</key>
<false></false>
<key>IS_APPINVITE_ENABLED</key>
<true></true>
<key>IS_GCM_ENABLED</key>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:1032971403708:ios:0ff547e80f5324ed356bb9</string>
</dict>
</plist>

View File

@@ -0,0 +1,19 @@
#!/bin/bash
# Copy the correct GoogleService-Info.plist based on the build configuration.
# This script should be added as a "Run Script" build phase in Xcode,
# BEFORE the "Compile Sources" phase.
#
# The FLUTTER_FLAVOR environment variable is set by Flutter when building
# with --flavor. It maps to: dev, stage, prod.
FLAVOR="${FLUTTER_FLAVOR:-dev}"
PLIST_SOURCE="${PROJECT_DIR}/config/${FLAVOR}/GoogleService-Info.plist"
PLIST_DEST="${PROJECT_DIR}/Runner/GoogleService-Info.plist"
if [ ! -f "$PLIST_SOURCE" ]; then
echo "error: GoogleService-Info.plist not found for flavor '${FLAVOR}' at ${PLIST_SOURCE}"
exit 1
fi
echo "Copying GoogleService-Info.plist for flavor: ${FLAVOR}"
cp "${PLIST_SOURCE}" "${PLIST_DEST}"

View File

@@ -1,44 +1,22 @@
// File generated by FlutterFire CLI.
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
import 'package:flutter/foundation.dart'
show defaultTargetPlatform, kIsWeb, TargetPlatform;
import 'package:krow_core/core.dart';
/// Default [FirebaseOptions] for use with your Firebase apps.
/// Environment-aware [FirebaseOptions] for the Client app.
///
/// Example:
/// ```dart
/// import 'firebase_options.dart';
/// // ...
/// await Firebase.initializeApp(
/// options: DefaultFirebaseOptions.currentPlatform,
/// );
/// ```
/// Selects the correct Firebase configuration based on the compile-time
/// `ENV` dart define (dev, stage, prod). Defaults to dev.
class DefaultFirebaseOptions {
static FirebaseOptions get currentPlatform {
if (kIsWeb) {
return web;
return _webOptions;
}
switch (defaultTargetPlatform) {
case TargetPlatform.android:
return android;
return _androidOptions;
case TargetPlatform.iOS:
return ios;
case TargetPlatform.macOS:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for macos - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
case TargetPlatform.windows:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for windows - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
case TargetPlatform.linux:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for linux - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
return _iosOptions;
default:
throw UnsupportedError(
'DefaultFirebaseOptions are not supported for this platform.',
@@ -46,7 +24,65 @@ class DefaultFirebaseOptions {
}
}
static const FirebaseOptions web = FirebaseOptions(
static FirebaseOptions get _androidOptions {
switch (AppEnvironment.current) {
case AppEnvironment.dev:
return _devAndroid;
case AppEnvironment.stage:
return _stageAndroid;
case AppEnvironment.prod:
return _prodAndroid;
}
}
static FirebaseOptions get _iosOptions {
switch (AppEnvironment.current) {
case AppEnvironment.dev:
return _devIos;
case AppEnvironment.stage:
return _stageIos;
case AppEnvironment.prod:
return _prodIos;
}
}
static FirebaseOptions get _webOptions {
switch (AppEnvironment.current) {
case AppEnvironment.dev:
return _devWeb;
case AppEnvironment.stage:
return _stageWeb;
case AppEnvironment.prod:
return _prodWeb;
}
}
// ===========================================================================
// DEV (krow-workforce-dev)
// ===========================================================================
static const FirebaseOptions _devAndroid = FirebaseOptions(
apiKey: 'AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4',
appId: '1:933560802882:android:1eb46251032273cb7757db',
messagingSenderId: '933560802882',
projectId: 'krow-workforce-dev',
storageBucket: 'krow-workforce-dev.firebasestorage.app',
);
static const FirebaseOptions _devIos = FirebaseOptions(
apiKey: 'AIzaSyDyEXkzZAWpXXe4dAesYaZflt5BEtMn9tA',
appId: '1:933560802882:ios:7e179dfdd1a8994c7757db',
messagingSenderId: '933560802882',
projectId: 'krow-workforce-dev',
storageBucket: 'krow-workforce-dev.firebasestorage.app',
androidClientId:
'933560802882-fbqg2icq24bmci3f84evjrbth5huh87f.apps.googleusercontent.com',
iosClientId:
'933560802882-jpv087j5jenp1h63mc9ge51767s3l2ac.apps.googleusercontent.com',
iosBundleId: 'dev.krowwithus.client',
);
static const FirebaseOptions _devWeb = FirebaseOptions(
apiKey: 'AIzaSyBqRtZPMGU-Sz5x5UnRrunKu5NSWYyPRn8',
appId: '1:933560802882:web:173a841992885bb27757db',
messagingSenderId: '933560802882',
@@ -56,23 +92,62 @@ class DefaultFirebaseOptions {
measurementId: 'G-9S7WEQTDKX',
);
static const FirebaseOptions android = FirebaseOptions(
apiKey: 'AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4',
appId: '1:933560802882:android:da13569105659ead7757db',
messagingSenderId: '933560802882',
projectId: 'krow-workforce-dev',
storageBucket: 'krow-workforce-dev.firebasestorage.app',
// ===========================================================================
// STAGE (krow-workforce-staging)
// ===========================================================================
static const FirebaseOptions _stageAndroid = FirebaseOptions(
apiKey: 'AIzaSyCgTXI3QhbEK3r4J5y7ek_6AxqhmR99QjY',
appId: '1:1032971403708:android:1ab9badf171c3aca356bb9',
messagingSenderId: '1032971403708',
projectId: 'krow-workforce-staging',
storageBucket: 'krow-workforce-staging.firebasestorage.app',
);
static const FirebaseOptions ios = FirebaseOptions(
apiKey: 'AIzaSyDyEXkzZAWpXXe4dAesYaZflt5BEtMn9tA',
appId: '1:933560802882:ios:d2b6d743608e2a527757db',
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',
static const FirebaseOptions _stageIos = FirebaseOptions(
apiKey: 'AIzaSyCgTXI3QhbEK3r4J5y7ek_6AxqhmR99QjY',
appId: '1:1032971403708:ios:0ff547e80f5324ed356bb9',
messagingSenderId: '1032971403708',
projectId: 'krow-workforce-staging',
storageBucket: 'krow-workforce-staging.firebasestorage.app',
iosBundleId: 'stage.krowwithus.client',
);
static const FirebaseOptions _stageWeb = FirebaseOptions(
apiKey: 'AIzaSyCgTXI3QhbEK3r4J5y7ek_6AxqhmR99QjY',
appId: '', // TODO: Register web app in krow-workforce-staging
messagingSenderId: '1032971403708',
projectId: 'krow-workforce-staging',
storageBucket: 'krow-workforce-staging.firebasestorage.app',
);
// ===========================================================================
// PROD (krow-workforce-prod)
// TODO: Fill in after creating krow-workforce-prod Firebase project
// ===========================================================================
static const FirebaseOptions _prodAndroid = FirebaseOptions(
apiKey: '', // TODO: Add prod API key
appId: '', // TODO: Add prod app ID
messagingSenderId: '', // TODO: Add prod sender ID
projectId: 'krow-workforce-prod',
storageBucket: 'krow-workforce-prod.firebasestorage.app',
);
static const FirebaseOptions _prodIos = FirebaseOptions(
apiKey: '', // TODO: Add prod API key
appId: '', // TODO: Add prod app ID
messagingSenderId: '', // TODO: Add prod sender ID
projectId: 'krow-workforce-prod',
storageBucket: 'krow-workforce-prod.firebasestorage.app',
iosBundleId: 'prod.krowwithus.client',
);
static const FirebaseOptions _prodWeb = FirebaseOptions(
apiKey: '', // TODO: Add prod API key
appId: '', // TODO: Add prod app ID
messagingSenderId: '', // TODO: Add prod sender ID
projectId: 'krow-workforce-prod',
storageBucket: 'krow-workforce-prod.firebasestorage.app',
);
}

View File

@@ -21,8 +21,20 @@ dartDefinesString.split(",").forEach {
}
}
// Load flavor-specific key properties: key.dev.properties, key.stage.properties, key.prod.properties
// The active flavor is resolved from the Gradle task name (e.g. assembleDevRelease -> dev)
fun resolveFlavorFromTask(): String {
val taskNames = gradle.startParameter.taskNames.joinToString(" ").lowercase()
return when {
taskNames.contains("prod") -> "prod"
taskNames.contains("stage") -> "stage"
else -> "dev"
}
}
val activeFlavorForSigning = resolveFlavorFromTask()
val keystoreProperties = Properties().apply {
val propertiesFile = rootProject.file("key.properties")
val propertiesFile = rootProject.file("key.${activeFlavorForSigning}.properties")
if (propertiesFile.exists()) {
load(propertiesFile.inputStream())
}
@@ -43,8 +55,7 @@ android {
}
defaultConfig {
applicationId = "com.krowwithus.staff"
// You can update the following values to match your application needs.
// applicationId is set per flavor below
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
@@ -54,6 +65,25 @@ android {
manifestPlaceholders["GOOGLE_MAPS_API_KEY"] = dartEnvironmentVariables["GOOGLE_MAPS_API_KEY"] ?: ""
}
flavorDimensions += "environment"
productFlavors {
create("dev") {
dimension = "environment"
applicationId = "dev.krowwithus.staff"
resValue("string", "app_name", "KROW With Us [DEV]")
}
create("stage") {
dimension = "environment"
applicationId = "stage.krowwithus.staff"
resValue("string", "app_name", "KROW With Us [STG]")
}
create("prod") {
dimension = "environment"
applicationId = "prod.krowwithus.staff"
resValue("string", "app_name", "KROW Staff")
}
}
signingConfigs {
create("release") {
if (System.getenv()["CI"] == "true") {
@@ -63,7 +93,7 @@ android {
keyAlias = System.getenv()["CM_KEY_ALIAS"]
keyPassword = System.getenv()["CM_KEY_PASSWORD"]
} else {
// Local development environment
// Local development environment — loads from key.<flavor>.properties
keyAlias = keystoreProperties["keyAlias"] as String?
keyPassword = keystoreProperties["keyPassword"] as String?
storeFile = keystoreProperties["storeFile"]?.let { file(it) }
@@ -82,6 +112,20 @@ android {
}
}
// Skip google-services processing for flavors whose google-services.json
// contains placeholder values (e.g. prod before the Firebase project exists).
// Once a real config is dropped in, the task automatically re-enables.
afterEvaluate {
tasks.matching {
it.name.startsWith("process") && it.name.endsWith("GoogleServices")
}.configureEach {
val taskFlavor = name.removePrefix("process").removeSuffix("GoogleServices")
.removeSuffix("Debug").removeSuffix("Release").lowercase()
val configFile = file("src/$taskFlavor/google-services.json")
enabled = configFile.exists() && configFile.readText().contains("\"mobilesdk_app_id\": \"1:")
}
}
flutter {
source = "../.."
}

View File

@@ -5,78 +5,6 @@
"storage_bucket": "krow-workforce-dev.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:edcddb83ea4bbb517757db",
"android_client_info": {
"package_name": "com.krow.app.business.dev"
}
},
"oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.krowwithus.staff"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:d49b8c0f4d19e95e7757db",
"android_client_info": {
"package_name": "com.krow.app.staff.dev"
}
},
"oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.krowwithus.staff"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:da13569105659ead7757db",
@@ -164,6 +92,78 @@
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:1eb46251032273cb7757db",
"android_client_info": {
"package_name": "dev.krowwithus.client"
}
},
"oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.krowwithus.staff"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:933560802882:android:ee100eab75b6b04c7757db",
"android_client_info": {
"package_name": "dev.krowwithus.staff"
}
},
"oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "933560802882-grp98a1v7amflnnup68vh01tj06eaem1.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "933560802882-29olj9ku64jbe9h7flinha6hbi8qrluh.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.krowwithus.staff"
}
}
]
}
}
}
],
"configuration_version": "1"

View File

@@ -1,6 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="KROW With Us Staff"
android:label="@string/app_name"
android:name="${applicationName}"
android:icon="@mipmap/launcher_icon">
<activity

View File

@@ -1,5 +0,0 @@
package com.krowwithus.krowwithus_staff
import io.flutter.embedding.android.FlutterActivity
class MainActivity : FlutterActivity()

View File

@@ -0,0 +1,48 @@
{
"project_info": {
"project_number": "1032971403708",
"project_id": "krow-workforce-staging",
"storage_bucket": "krow-workforce-staging.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:1032971403708:android:1ab9badf171c3aca356bb9",
"android_client_info": {
"package_name": "stage.krowwithus.client"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAZ4dOatvf3ZBt4qnbSlIvJ51bblHaRsRw"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:1032971403708:android:14e471d055e59597356bb9",
"android_client_info": {
"package_name": "stage.krowwithus.staff"
}
},
"oauth_client": [],
"api_key": [
{
"current_key": "AIzaSyAZ4dOatvf3ZBt4qnbSlIvJ51bblHaRsRw"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}

View File

@@ -0,0 +1,9 @@
storePassword=krowwithus
keyPassword=krowwithus
keyAlias=krow_staff_prod
storeFile=krow_with_us_staff_prod.jks
###
### Staff Prod
### SHA1: B3:9A:AE:EC:8D:A2:C8:88:5F:FA:AC:9B:31:0A:AC:F3:D6:7D:82:83
### SHA256: 0C:F3:5F:B5:C5:DA:E3:94:E1:FB:9E:D9:84:4F:2D:4A:E5:1B:48:FB:33:A1:DD:F3:43:41:22:32:A4:9A:25:E8

View File

@@ -0,0 +1,9 @@
storePassword=krowwithus
keyPassword=krowwithus
keyAlias=krow_staff_stage
storeFile=krow_with_us_staff_stage.jks
###
### Staff Stage
### SHA1: E8:C4:B8:F5:5E:19:04:31:D6:E5:16:76:47:62:D0:5B:2F:F3:CE:05
### SHA256: 25:55:68:E6:77:03:33:E1:D0:4E:F4:75:6E:6B:3D:3D:A2:DB:9B:2B:5E:AD:FF:CD:22:64:CE:3F:E8:AF:60:50

View File

@@ -149,6 +149,7 @@
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
9740EEB61CF901F6004384FC /* Run Script */,
BC26E38C2F5F605000517BDF /* ShellScript */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
@@ -255,7 +256,26 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
};
BC26E38C2F5F605000517BDF /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"$(SRCROOT)/newInputFile",
);
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# Tye a script or drag a script file from your workspace to insert its path.\n$PROJECT_DIR/scripts/copy-firebase-config.sh\n";
};
/* End PBXShellScriptBuildPhase section */
@@ -363,6 +383,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us [STAGE] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -372,7 +393,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_BUNDLE_IDENTIFIER = stage.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -542,6 +563,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us [DEV] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -551,7 +573,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_BUNDLE_IDENTIFIER = dev.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -564,6 +586,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
@@ -573,7 +596,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_BUNDLE_IDENTIFIER = prod.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -581,6 +604,837 @@
};
name = Release;
};
BC26E3712F5F5EBD00517BDF /* Debug-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = "Debug-dev";
};
BC26E3722F5F5EBD00517BDF /* Debug-dev */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us [DEV] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = dev.krowwithus.staff;
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-dev";
};
BC26E3732F5F5EBD00517BDF /* Debug-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Debug-dev";
};
BC26E3742F5F5EC300517BDF /* Debug-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = "Debug-stage";
};
BC26E3752F5F5EC300517BDF /* Debug-stage */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us [STAGE] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = stage.krowwithus.staff;
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-stage";
};
BC26E3762F5F5EC300517BDF /* Debug-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Debug-stage";
};
BC26E3772F5F5EC800517BDF /* Debug-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = "Debug-prod";
};
BC26E3782F5F5EC800517BDF /* Debug-prod */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = prod.krowwithus.staff;
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-prod";
};
BC26E3792F5F5EC800517BDF /* Debug-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Debug-prod";
};
BC26E37A2F5F5ECF00517BDF /* Release-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.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-dev";
};
BC26E37B2F5F5ECF00517BDF /* Release-dev */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us [DEV] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = dev.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Release-dev";
};
BC26E37C2F5F5ECF00517BDF /* Release-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Release-dev";
};
BC26E37D2F5F5ED800517BDF /* Release-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.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-stage";
};
BC26E37E2F5F5ED800517BDF /* Release-stage */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us [STAGE] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = stage.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Release-stage";
};
BC26E37F2F5F5ED800517BDF /* Release-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Release-stage";
};
BC26E3802F5F5EDD00517BDF /* Release-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.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-prod";
};
BC26E3812F5F5EDD00517BDF /* Release-prod */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = prod.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Release-prod";
};
BC26E3822F5F5EDD00517BDF /* Release-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Release-prod";
};
BC26E3832F5F5EE500517BDF /* Profile-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = "Profile-dev";
};
BC26E3842F5F5EE500517BDF /* Profile-dev */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us [DEV] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = dev.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Profile-dev";
};
BC26E3852F5F5EE500517BDF /* Profile-dev */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Profile-dev";
};
BC26E3862F5F5EEA00517BDF /* Profile-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = "Profile-stage";
};
BC26E3872F5F5EEA00517BDF /* Profile-stage */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us [STAGE] ";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = stage.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Profile-stage";
};
BC26E3882F5F5EEA00517BDF /* Profile-stage */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Profile-stage";
};
BC26E3892F5F5EEF00517BDF /* Profile-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
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;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
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 = 13.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = "Profile-prod";
};
BC26E38A2F5F5EEF00517BDF /* Profile-prod */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
APP_NAME = "KROW With Us";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = prod.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = "Profile-prod";
};
BC26E38B2F5F5EEF00517BDF /* Profile-prod */ = {
isa = XCBuildConfiguration;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.krowwithus.staff;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = "Profile-prod";
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -588,8 +1442,17 @@
isa = XCConfigurationList;
buildConfigurations = (
331C8088294A63A400263BE5 /* Debug */,
BC26E3792F5F5EC800517BDF /* Debug-prod */,
BC26E3762F5F5EC300517BDF /* Debug-stage */,
BC26E3732F5F5EBD00517BDF /* Debug-dev */,
331C8089294A63A400263BE5 /* Release */,
BC26E3822F5F5EDD00517BDF /* Release-prod */,
BC26E37F2F5F5ED800517BDF /* Release-stage */,
BC26E37C2F5F5ECF00517BDF /* Release-dev */,
331C808A294A63A400263BE5 /* Profile */,
BC26E38B2F5F5EEF00517BDF /* Profile-prod */,
BC26E3882F5F5EEA00517BDF /* Profile-stage */,
BC26E3852F5F5EE500517BDF /* Profile-dev */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -598,8 +1461,17 @@
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
BC26E3772F5F5EC800517BDF /* Debug-prod */,
BC26E3742F5F5EC300517BDF /* Debug-stage */,
BC26E3712F5F5EBD00517BDF /* Debug-dev */,
97C147041CF9000F007C117D /* Release */,
BC26E3802F5F5EDD00517BDF /* Release-prod */,
BC26E37D2F5F5ED800517BDF /* Release-stage */,
BC26E37A2F5F5ECF00517BDF /* Release-dev */,
249021D3217E4FDB00AE95B9 /* Profile */,
BC26E3892F5F5EEF00517BDF /* Profile-prod */,
BC26E3862F5F5EEA00517BDF /* Profile-stage */,
BC26E3832F5F5EE500517BDF /* Profile-dev */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -608,8 +1480,17 @@
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
BC26E3782F5F5EC800517BDF /* Debug-prod */,
BC26E3752F5F5EC300517BDF /* Debug-stage */,
BC26E3722F5F5EBD00517BDF /* Debug-dev */,
97C147071CF9000F007C117D /* Release */,
BC26E3812F5F5EDD00517BDF /* Release-prod */,
BC26E37E2F5F5ED800517BDF /* Release-stage */,
BC26E37B2F5F5ECF00517BDF /* Release-dev */,
249021D4217E4FDB00AE95B9 /* Profile */,
BC26E38A2F5F5EEF00517BDF /* Profile-prod */,
BC26E3872F5F5EEA00517BDF /* Profile-stage */,
BC26E3842F5F5EE500517BDF /* Profile-dev */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2630"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2630"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2630"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -5,7 +5,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>KROW With Us Staff</string>
<string>$(APP_NAME)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@@ -13,7 +13,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>KROW With Us Staff</string>
<string>$(APP_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>933560802882-jpv087j5jenp1h63mc9ge51767s3l2ac.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.933560802882-jpv087j5jenp1h63mc9ge51767s3l2ac</string>
<key>ANDROID_CLIENT_ID</key>
<string>933560802882-fbqg2icq24bmci3f84evjrbth5huh87f.apps.googleusercontent.com</string>
<key>API_KEY</key>
<string>AIzaSyDyEXkzZAWpXXe4dAesYaZflt5BEtMn9tA</string>
<key>GCM_SENDER_ID</key>
<string>933560802882</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>dev.krowwithus.client</string>
<key>PROJECT_ID</key>
<string>krow-workforce-dev</string>
<key>STORAGE_BUCKET</key>
<string>krow-workforce-dev.firebasestorage.app</string>
<key>IS_ADS_ENABLED</key>
<false></false>
<key>IS_ANALYTICS_ENABLED</key>
<false></false>
<key>IS_APPINVITE_ENABLED</key>
<true></true>
<key>IS_GCM_ENABLED</key>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:933560802882:ios:7e179dfdd1a8994c7757db</string>
</dict>
</plist>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>API_KEY</key>
<string>AIzaSyCgTXI3QhbEK3r4J5y7ek_6AxqhmR99QjY</string>
<key>GCM_SENDER_ID</key>
<string>1032971403708</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>stage.krowwithus.client</string>
<key>PROJECT_ID</key>
<string>krow-workforce-staging</string>
<key>STORAGE_BUCKET</key>
<string>krow-workforce-staging.firebasestorage.app</string>
<key>IS_ADS_ENABLED</key>
<false></false>
<key>IS_ANALYTICS_ENABLED</key>
<false></false>
<key>IS_APPINVITE_ENABLED</key>
<true></true>
<key>IS_GCM_ENABLED</key>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:1032971403708:ios:0ff547e80f5324ed356bb9</string>
</dict>
</plist>

View File

@@ -0,0 +1,19 @@
#!/bin/bash
# Copy the correct GoogleService-Info.plist based on the build configuration.
# This script should be added as a "Run Script" build phase in Xcode,
# BEFORE the "Compile Sources" phase.
#
# The FLUTTER_FLAVOR environment variable is set by Flutter when building
# with --flavor. It maps to: dev, stage, prod.
FLAVOR="${FLUTTER_FLAVOR:-dev}"
PLIST_SOURCE="${PROJECT_DIR}/config/${FLAVOR}/GoogleService-Info.plist"
PLIST_DEST="${PROJECT_DIR}/Runner/GoogleService-Info.plist"
if [ ! -f "$PLIST_SOURCE" ]; then
echo "error: GoogleService-Info.plist not found for flavor '${FLAVOR}' at ${PLIST_SOURCE}"
exit 1
fi
echo "Copying GoogleService-Info.plist for flavor: ${FLAVOR}"
cp "${PLIST_SOURCE}" "${PLIST_DEST}"

View File

@@ -1,44 +1,22 @@
// File generated by FlutterFire CLI.
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
import 'package:flutter/foundation.dart'
show defaultTargetPlatform, kIsWeb, TargetPlatform;
import 'package:krow_core/core.dart';
/// Default [FirebaseOptions] for use with your Firebase apps.
/// Environment-aware [FirebaseOptions] for the Staff app.
///
/// Example:
/// ```dart
/// import 'firebase_options.dart';
/// // ...
/// await Firebase.initializeApp(
/// options: DefaultFirebaseOptions.currentPlatform,
/// );
/// ```
/// Selects the correct Firebase configuration based on the compile-time
/// `ENV` dart define (dev, stage, prod). Defaults to dev.
class DefaultFirebaseOptions {
static FirebaseOptions get currentPlatform {
if (kIsWeb) {
return web;
return _webOptions;
}
switch (defaultTargetPlatform) {
case TargetPlatform.android:
return android;
return _androidOptions;
case TargetPlatform.iOS:
return ios;
case TargetPlatform.macOS:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for macos - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
case TargetPlatform.windows:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for windows - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
case TargetPlatform.linux:
throw UnsupportedError(
'DefaultFirebaseOptions have not been configured for linux - '
'you can reconfigure this by running the FlutterFire CLI again.',
);
return _iosOptions;
default:
throw UnsupportedError(
'DefaultFirebaseOptions are not supported for this platform.',
@@ -46,7 +24,65 @@ class DefaultFirebaseOptions {
}
}
static const FirebaseOptions web = FirebaseOptions(
static FirebaseOptions get _androidOptions {
switch (AppEnvironment.current) {
case AppEnvironment.dev:
return _devAndroid;
case AppEnvironment.stage:
return _stageAndroid;
case AppEnvironment.prod:
return _prodAndroid;
}
}
static FirebaseOptions get _iosOptions {
switch (AppEnvironment.current) {
case AppEnvironment.dev:
return _devIos;
case AppEnvironment.stage:
return _stageIos;
case AppEnvironment.prod:
return _prodIos;
}
}
static FirebaseOptions get _webOptions {
switch (AppEnvironment.current) {
case AppEnvironment.dev:
return _devWeb;
case AppEnvironment.stage:
return _stageWeb;
case AppEnvironment.prod:
return _prodWeb;
}
}
// ===========================================================================
// DEV (krow-workforce-dev)
// ===========================================================================
static const FirebaseOptions _devAndroid = FirebaseOptions(
apiKey: 'AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4',
appId: '1:933560802882:android:ee100eab75b6b04c7757db',
messagingSenderId: '933560802882',
projectId: 'krow-workforce-dev',
storageBucket: 'krow-workforce-dev.firebasestorage.app',
);
static const FirebaseOptions _devIos = FirebaseOptions(
apiKey: 'AIzaSyDyEXkzZAWpXXe4dAesYaZflt5BEtMn9tA',
appId: '1:933560802882:ios:edf97dab6eb87b977757db',
messagingSenderId: '933560802882',
projectId: 'krow-workforce-dev',
storageBucket: 'krow-workforce-dev.firebasestorage.app',
androidClientId:
'933560802882-fbqg2icq24bmci3f84evjrbth5huh87f.apps.googleusercontent.com',
iosClientId:
'933560802882-fphpkdjubve8k7e8ogqj3fk1qducv3sg.apps.googleusercontent.com',
iosBundleId: 'dev.krowwithus.staff',
);
static const FirebaseOptions _devWeb = FirebaseOptions(
apiKey: 'AIzaSyBqRtZPMGU-Sz5x5UnRrunKu5NSWYyPRn8',
appId: '1:933560802882:web:173a841992885bb27757db',
messagingSenderId: '933560802882',
@@ -56,23 +92,62 @@ class DefaultFirebaseOptions {
measurementId: 'G-9S7WEQTDKX',
);
static const FirebaseOptions android = FirebaseOptions(
apiKey: 'AIzaSyDBYhflhK6DThKnS7RM-9raKdvyKzLUjY4',
appId: '1:933560802882:android:1ae05d85c865f77c7757db',
messagingSenderId: '933560802882',
projectId: 'krow-workforce-dev',
storageBucket: 'krow-workforce-dev.firebasestorage.app',
// ===========================================================================
// STAGE (krow-workforce-staging)
// ===========================================================================
static const FirebaseOptions _stageAndroid = FirebaseOptions(
apiKey: 'AIzaSyCgTXI3QhbEK3r4J5y7ek_6AxqhmR99QjY',
appId: '1:1032971403708:android:14e471d055e59597356bb9',
messagingSenderId: '1032971403708',
projectId: 'krow-workforce-staging',
storageBucket: 'krow-workforce-staging.firebasestorage.app',
);
static const FirebaseOptions ios = FirebaseOptions(
apiKey: 'AIzaSyDyEXkzZAWpXXe4dAesYaZflt5BEtMn9tA',
appId: '1:933560802882:ios:fa584205b356de937757db',
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',
static const FirebaseOptions _stageIos = FirebaseOptions(
apiKey: 'AIzaSyCgTXI3QhbEK3r4J5y7ek_6AxqhmR99QjY',
appId: '1:1032971403708:ios:8c2bbd76bc4f55d9356bb9',
messagingSenderId: '1032971403708',
projectId: 'krow-workforce-staging',
storageBucket: 'krow-workforce-staging.firebasestorage.app',
iosBundleId: 'stage.krowwithus.staff',
);
static const FirebaseOptions _stageWeb = FirebaseOptions(
apiKey: 'AIzaSyCgTXI3QhbEK3r4J5y7ek_6AxqhmR99QjY',
appId: '', // TODO: Register web app in krow-workforce-staging
messagingSenderId: '1032971403708',
projectId: 'krow-workforce-staging',
storageBucket: 'krow-workforce-staging.firebasestorage.app',
);
// ===========================================================================
// PROD (krow-workforce-prod)
// TODO: Fill in after creating krow-workforce-prod Firebase project
// ===========================================================================
static const FirebaseOptions _prodAndroid = FirebaseOptions(
apiKey: '', // TODO: Add prod API key
appId: '', // TODO: Add prod app ID
messagingSenderId: '', // TODO: Add prod sender ID
projectId: 'krow-workforce-prod',
storageBucket: 'krow-workforce-prod.firebasestorage.app',
);
static const FirebaseOptions _prodIos = FirebaseOptions(
apiKey: '', // TODO: Add prod API key
appId: '', // TODO: Add prod app ID
messagingSenderId: '', // TODO: Add prod sender ID
projectId: 'krow-workforce-prod',
storageBucket: 'krow-workforce-prod.firebasestorage.app',
iosBundleId: 'prod.krowwithus.staff',
);
static const FirebaseOptions _prodWeb = FirebaseOptions(
apiKey: '', // TODO: Add prod API key
appId: '', // TODO: Add prod app ID
messagingSenderId: '', // TODO: Add prod sender ID
projectId: 'krow-workforce-prod',
storageBucket: 'krow-workforce-prod.firebasestorage.app',
);
}

View File

@@ -1,4 +1,5 @@
{
"ENV": "dev",
"GOOGLE_MAPS_API_KEY": "AIzaSyAyRS9I4xxoVPAX91RJvWJHszB3ZY3-IC0",
"CORE_API_BASE_URL": "https://krow-core-api-e3g6witsvq-uc.a.run.app"
}

View File

@@ -0,0 +1,5 @@
{
"ENV": "prod",
"GOOGLE_MAPS_API_KEY": "",
"CORE_API_BASE_URL": ""
}

View File

@@ -0,0 +1,5 @@
{
"ENV": "stage",
"GOOGLE_MAPS_API_KEY": "AIzaSyAyRS9I4xxoVPAX91RJvWJHszB3ZY3-IC0",
"CORE_API_BASE_URL": "https://krow-core-api-staging-e3g6witsvq-uc.a.run.app"
}

View File

@@ -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 -- <PLATFORM> --<MODE> --flavor <ENV> --dart-define-from-file=../../config.<ENV>.json"
echo " - melos run build:staff -- <PLATFORM> --<MODE> --flavor <ENV> --dart-define-from-file=../../config.<ENV>.json"
echo " - melos run build:design-system : Build Design System Viewer"
echo ""
echo " DEBUG/START COMMANDS:"
echo " - melos run start:client -- -d <ID> : Run Client App"
echo " - melos run start:staff -- -d <ID> : Run Staff App"
echo " - melos run start:client -- -d <ID> --flavor <ENV> --dart-define-from-file=../../config.<ENV>.json"
echo " - melos run start:staff -- -d <ID> --flavor <ENV> --dart-define-from-file=../../config.<ENV>.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 --: <platform> --<mode> --flavor <env> --dart-define-from-file=../../config.<env>.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 --: <platform> --<mode> --flavor <env> --dart-define-from-file=../../config.<env>.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 <platform>, e.g. -d chrome"
run: melos exec --scope="krowwithus_client" -- flutter run
description: "Start the Client app. Pass args via --: -d <device> --flavor <env> --dart-define-from-file=../../config.<env>.json"
start:staff:
run: melos exec --scope="krowwithus_staff" -- "flutter run"
description: "Start the Staff app. Pass platform using -- -d <platform>, e.g. -d chrome"
run: melos exec --scope="krowwithus_staff" -- flutter run
description: "Start the Staff app. Pass args via --: -d <device> --flavor <env> --dart-define-from-file=../../config.<env>.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 <platform>, e.g. -d chrome"

View File

@@ -9,6 +9,7 @@ export 'src/presentation/widgets/web_mobile_frame.dart';
export 'src/presentation/mixins/bloc_error_handler.dart';
export 'src/presentation/observers/core_bloc_observer.dart';
export 'src/config/app_config.dart';
export 'src/config/app_environment.dart';
export 'src/routing/routing.dart';
export 'src/services/api_service/api_service.dart';
export 'src/services/api_service/dio_client.dart';

View File

@@ -0,0 +1,46 @@
/// Represents the application environment.
enum AppEnvironment {
dev,
stage,
prod;
/// Resolves the current environment from the compile-time `ENV` dart define.
/// Defaults to [AppEnvironment.dev] if not set or unrecognized.
static AppEnvironment get current {
const String envString = String.fromEnvironment('ENV', defaultValue: 'dev');
return AppEnvironment.values.firstWhere(
(AppEnvironment e) => e.name == envString,
orElse: () => AppEnvironment.dev,
);
}
/// Whether the app is running in production.
bool get isProduction => this == AppEnvironment.prod;
/// Whether the app is running in a non-production environment.
bool get isNonProduction => !isProduction;
/// The Firebase project ID for this environment.
String get firebaseProjectId {
switch (this) {
case AppEnvironment.dev:
return 'krow-workforce-dev';
case AppEnvironment.stage:
return 'krow-workforce-staging';
case AppEnvironment.prod:
return 'krow-workforce-prod';
}
}
/// A display label for the environment (empty for prod).
String get label {
switch (this) {
case AppEnvironment.dev:
return '[DEV]';
case AppEnvironment.stage:
return '[STG]';
case AppEnvironment.prod:
return '';
}
}
}

View File

@@ -13,35 +13,35 @@ class CoreModule extends Module {
@override
void exportedBinds(Injector i) {
// 1. Register the base HTTP client
i.addSingleton<Dio>(() => DioClient());
i.addLazySingleton<Dio>(() => DioClient());
// 2. Register the base API service
i.addSingleton<BaseApiService>(() => ApiService(i.get<Dio>()));
i.addLazySingleton<BaseApiService>(() => ApiService(i.get<Dio>()));
// 3. Register Core API Services (Orchestrators)
i.addSingleton<FileUploadService>(
i.addLazySingleton<FileUploadService>(
() => FileUploadService(i.get<BaseApiService>()),
);
i.addSingleton<SignedUrlService>(
i.addLazySingleton<SignedUrlService>(
() => SignedUrlService(i.get<BaseApiService>()),
);
i.addSingleton<VerificationService>(
i.addLazySingleton<VerificationService>(
() => VerificationService(i.get<BaseApiService>()),
);
i.addSingleton<LlmService>(() => LlmService(i.get<BaseApiService>()));
i.addSingleton<RapidOrderService>(
i.addLazySingleton<LlmService>(() => LlmService(i.get<BaseApiService>()));
i.addLazySingleton<RapidOrderService>(
() => RapidOrderService(i.get<BaseApiService>()),
);
// 4. Register Device dependency
i.addSingleton<ImagePicker>(() => ImagePicker());
i.addLazySingleton<ImagePicker>(() => ImagePicker());
// 5. Register Device Services
i.addSingleton<CameraService>(() => CameraService(i.get<ImagePicker>()));
i.addSingleton<GalleryService>(() => GalleryService(i.get<ImagePicker>()));
i.addSingleton<FilePickerService>(FilePickerService.new);
i.addSingleton<AudioRecorderService>(AudioRecorderService.new);
i.addSingleton<DeviceFileUploadService>(
i.addLazySingleton<CameraService>(() => CameraService(i.get<ImagePicker>()));
i.addLazySingleton<GalleryService>(() => GalleryService(i.get<ImagePicker>()));
i.addLazySingleton<FilePickerService>(FilePickerService.new);
i.addLazySingleton<AudioRecorderService>(AudioRecorderService.new);
i.addLazySingleton<DeviceFileUploadService>(
() => DeviceFileUploadService(
cameraService: i.get<CameraService>(),
galleryService: i.get<GalleryService>(),

View File

@@ -210,6 +210,13 @@ extension ClientNavigator on IModularNavigator {
safePush(ClientPaths.createOrderPermanent, arguments: arguments);
}
/// Pushes the review order page before submission.
///
/// Returns `true` if the user confirmed submission, `null` if they went back.
Future<bool?> toCreateOrderReview({Object? arguments}) async {
return safePush<bool>(ClientPaths.createOrderReview, arguments: arguments);
}
// ==========================================================================
// VIEW ORDER
// ==========================================================================

View File

@@ -154,4 +154,9 @@ class ClientPaths {
///
/// Create a long-term or permanent staffing position.
static const String createOrderPermanent = '/create-order/permanent';
/// Review order before submission.
///
/// Summary page shown before posting any order type.
static const String createOrderReview = '/create-order/review';
}

View File

@@ -397,6 +397,9 @@
"title": "Permanent Order",
"subtitle": "Long-term staffing placement",
"placeholder": "Permanent Order Flow (Work in Progress)"
},
"review": {
"invalid_arguments": "Unable to load order review. Please go back and try again."
}
},
"client_main": {

View File

@@ -397,6 +397,9 @@
"title": "Orden Permanente",
"subtitle": "Colocaci\u00f3n de personal a largo plazo",
"placeholder": "Flujo de Orden Permanente (Trabajo en Progreso)"
},
"review": {
"invalid_arguments": "No se pudo cargar la revisi\u00f3n de la orden. Por favor, regresa e intenta de nuevo."
}
},
"client_main": {

View File

@@ -24,20 +24,20 @@ class BillingModule extends Module {
@override
void binds(Injector i) {
// Repositories
i.addSingleton<BillingRepository>(BillingRepositoryImpl.new);
i.addLazySingleton<BillingRepository>(BillingRepositoryImpl.new);
// Use Cases
i.addSingleton(GetBankAccountsUseCase.new);
i.addSingleton(GetCurrentBillAmountUseCase.new);
i.addSingleton(GetSavingsAmountUseCase.new);
i.addSingleton(GetPendingInvoicesUseCase.new);
i.addSingleton(GetInvoiceHistoryUseCase.new);
i.addSingleton(GetSpendingBreakdownUseCase.new);
i.addSingleton(ApproveInvoiceUseCase.new);
i.addSingleton(DisputeInvoiceUseCase.new);
i.addLazySingleton(GetBankAccountsUseCase.new);
i.addLazySingleton(GetCurrentBillAmountUseCase.new);
i.addLazySingleton(GetSavingsAmountUseCase.new);
i.addLazySingleton(GetPendingInvoicesUseCase.new);
i.addLazySingleton(GetInvoiceHistoryUseCase.new);
i.addLazySingleton(GetSpendingBreakdownUseCase.new);
i.addLazySingleton(ApproveInvoiceUseCase.new);
i.addLazySingleton(DisputeInvoiceUseCase.new);
// BLoCs
i.addSingleton<BillingBloc>(
i.addLazySingleton<BillingBloc>(
() => BillingBloc(
getBankAccounts: i.get<GetBankAccountsUseCase>(),
getCurrentBillAmount: i.get<GetCurrentBillAmountUseCase>(),

View File

@@ -16,14 +16,14 @@ class CoverageModule extends Module {
@override
void binds(Injector i) {
// Repositories
i.addSingleton<CoverageRepository>(CoverageRepositoryImpl.new);
i.addLazySingleton<CoverageRepository>(CoverageRepositoryImpl.new);
// Use Cases
i.addSingleton(GetShiftsForDateUseCase.new);
i.addSingleton(GetCoverageStatsUseCase.new);
i.addLazySingleton(GetShiftsForDateUseCase.new);
i.addLazySingleton(GetCoverageStatsUseCase.new);
// BLoCs
i.addSingleton<CoverageBloc>(CoverageBloc.new);
i.addLazySingleton<CoverageBloc>(CoverageBloc.new);
}
@override

View File

@@ -13,7 +13,7 @@ import 'presentation/pages/client_main_page.dart';
class ClientMainModule extends Module {
@override
void binds(Injector i) {
i.addSingleton(ClientMainCubit.new);
i.addLazySingleton(ClientMainCubit.new);
}
@override

View File

@@ -18,6 +18,7 @@ import 'presentation/pages/one_time_order_page.dart';
import 'presentation/pages/permanent_order_page.dart';
import 'presentation/pages/rapid_order_page.dart';
import 'presentation/pages/recurring_order_page.dart';
import 'presentation/pages/review_order_page.dart';
/// Module for the Client Create Order feature.
///
@@ -95,5 +96,12 @@ class ClientCreateOrderModule extends Module {
),
child: (BuildContext context) => const PermanentOrderPage(),
);
r.child(
ClientPaths.childRoute(
ClientPaths.createOrder,
ClientPaths.createOrderReview,
),
child: (BuildContext context) => const ReviewOrderPage(),
);
}
}

View File

@@ -1,5 +1,6 @@
import 'package:equatable/equatable.dart';
import 'package:krow_domain/krow_domain.dart';
import '../../utils/time_parsing_utils.dart';
enum OneTimeOrderStatus { initial, loading, success, failure }
@@ -98,6 +99,78 @@ class OneTimeOrderState extends Equatable {
);
}
/// Looks up a role name by its ID, returns `null` if not found.
String? roleNameById(String id) {
for (final OneTimeOrderRoleOption r in roles) {
if (r.id == id) return r.name;
}
return null;
}
/// Looks up a role cost-per-hour by its ID, returns `0` if not found.
double roleCostById(String id) {
for (final OneTimeOrderRoleOption r in roles) {
if (r.id == id) return r.costPerHour;
}
return 0;
}
/// Total number of workers across all positions.
int get totalWorkers => positions.fold(
0,
(int sum, OneTimeOrderPosition p) => sum + p.count,
);
/// Sum of (count * costPerHour) across all positions.
double get totalCostPerHour => positions.fold(
0,
(double sum, OneTimeOrderPosition p) =>
sum + (p.count * roleCostById(p.role)),
);
/// Estimated total cost: sum of (count * costPerHour * hours) per position.
double get estimatedTotal {
double total = 0;
for (final OneTimeOrderPosition p in positions) {
final double hours = parseHoursFromTimes(p.startTime, p.endTime);
total += p.count * roleCostById(p.role) * hours;
}
return total;
}
/// Time range string from the first position (e.g. "6:00 AM \u2013 2:00 PM").
String get shiftTimeRange {
if (positions.isEmpty) return '';
final OneTimeOrderPosition first = positions.first;
return '${first.startTime} \u2013 ${first.endTime}';
}
/// Formatted shift duration from the first position (e.g. "8 hrs (30 min break)").
String get shiftDuration {
if (positions.isEmpty) return '';
final OneTimeOrderPosition first = positions.first;
final double hours = parseHoursFromTimes(first.startTime, first.endTime);
if (hours <= 0) return '';
final int wholeHours = hours.floor();
final int minutes = ((hours - wholeHours) * 60).round();
final StringBuffer buffer = StringBuffer();
if (wholeHours > 0) buffer.write('$wholeHours hrs');
if (minutes > 0) {
if (wholeHours > 0) buffer.write(' ');
buffer.write('$minutes min');
}
if (first.lunchBreak != null &&
first.lunchBreak != 'NO_BREAK' &&
first.lunchBreak!.isNotEmpty) {
buffer.write(' (${first.lunchBreak} break)');
}
return buffer.toString();
}
@override
List<Object?> get props => <Object?>[
date,

View File

@@ -1,5 +1,6 @@
import 'package:equatable/equatable.dart';
import 'package:krow_domain/krow_domain.dart';
import '../../utils/time_parsing_utils.dart';
enum PermanentOrderStatus { initial, loading, success, failure }
@@ -118,6 +119,50 @@ class PermanentOrderState extends Equatable {
);
}
/// Looks up a role name by its ID, returns `null` if not found.
String? roleNameById(String id) {
for (final PermanentOrderRoleOption r in roles) {
if (r.id == id) return r.name;
}
return null;
}
/// Looks up a role cost-per-hour by its ID, returns `0` if not found.
double roleCostById(String id) {
for (final PermanentOrderRoleOption r in roles) {
if (r.id == id) return r.costPerHour;
}
return 0;
}
/// Total number of workers across all positions.
int get totalWorkers => positions.fold(
0,
(int sum, PermanentOrderPosition p) => sum + p.count,
);
/// Sum of (count * costPerHour) across all positions.
double get totalCostPerHour => positions.fold(
0,
(double sum, PermanentOrderPosition p) =>
sum + (p.count * roleCostById(p.role)),
);
/// Estimated total cost: sum of (count * costPerHour * hours) per position.
double get estimatedTotal {
double total = 0;
for (final PermanentOrderPosition p in positions) {
final double hours = parseHoursFromTimes(p.startTime, p.endTime);
total += p.count * roleCostById(p.role) * hours;
}
return total;
}
/// Formatted repeat days (e.g. "Mon, Tue, Wed").
String get formattedRepeatDays => permanentDays.map(
(String day) => day[0] + day.substring(1).toLowerCase(),
).join(', ');
@override
List<Object?> get props => <Object?>[
startDate,

View File

@@ -1,5 +1,6 @@
import 'package:equatable/equatable.dart';
import 'package:krow_domain/krow_domain.dart';
import '../../utils/time_parsing_utils.dart';
enum RecurringOrderStatus { initial, loading, success, failure }
@@ -125,6 +126,50 @@ class RecurringOrderState extends Equatable {
);
}
/// Looks up a role name by its ID, returns `null` if not found.
String? roleNameById(String id) {
for (final RecurringOrderRoleOption r in roles) {
if (r.id == id) return r.name;
}
return null;
}
/// Looks up a role cost-per-hour by its ID, returns `0` if not found.
double roleCostById(String id) {
for (final RecurringOrderRoleOption r in roles) {
if (r.id == id) return r.costPerHour;
}
return 0;
}
/// Total number of workers across all positions.
int get totalWorkers => positions.fold(
0,
(int sum, RecurringOrderPosition p) => sum + p.count,
);
/// Sum of (count * costPerHour) across all positions.
double get totalCostPerHour => positions.fold(
0,
(double sum, RecurringOrderPosition p) =>
sum + (p.count * roleCostById(p.role)),
);
/// Estimated total cost: sum of (count * costPerHour * hours) per position.
double get estimatedTotal {
double total = 0;
for (final RecurringOrderPosition p in positions) {
final double hours = parseHoursFromTimes(p.startTime, p.endTime);
total += p.count * roleCostById(p.role) * hours;
}
return total;
}
/// Formatted repeat days (e.g. "Mon, Tue, Wed").
String get formattedRepeatDays => recurringDays.map(
(String day) => day[0] + day.substring(1).toLowerCase(),
).join(', ');
@override
List<Object?> get props => <Object?>[
startDate,

View File

@@ -0,0 +1,48 @@
import '../widgets/review_order/review_order_positions_card.dart';
/// Identifies the order type for rendering the correct schedule layout
/// on the review page.
enum ReviewOrderType { oneTime, recurring, permanent }
/// Data transfer object passed as route arguments to the [ReviewOrderPage].
///
/// Contains pre-formatted display strings for every section of the review
/// summary. The form page is responsible for converting BLoC state into
/// these human-readable values before navigating.
class ReviewOrderArguments {
const ReviewOrderArguments({
required this.orderType,
required this.orderName,
required this.hubName,
required this.shiftContactName,
required this.positions,
required this.totalWorkers,
required this.totalCostPerHour,
required this.estimatedTotal,
this.scheduleDate,
this.scheduleTime,
this.scheduleDuration,
this.scheduleStartDate,
this.scheduleEndDate,
this.scheduleRepeatDays,
});
final ReviewOrderType orderType;
final String orderName;
final String hubName;
final String shiftContactName;
final List<ReviewPositionItem> positions;
final int totalWorkers;
final double totalCostPerHour;
final double estimatedTotal;
/// One-time order schedule fields.
final String? scheduleDate;
final String? scheduleTime;
final String? scheduleDuration;
/// Recurring / permanent order schedule fields.
final String? scheduleStartDate;
final String? scheduleEndDate;
final String? scheduleRepeatDays;
}

View File

@@ -2,18 +2,24 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_modular/flutter_modular.dart';
import 'package:client_orders_common/client_orders_common.dart';
import 'package:intl/intl.dart';
import 'package:krow_core/core.dart';
import 'package:krow_domain/krow_domain.dart';
import '../blocs/one_time_order/one_time_order_bloc.dart';
import '../blocs/one_time_order/one_time_order_event.dart';
import '../blocs/one_time_order/one_time_order_state.dart';
import '../models/review_order_arguments.dart';
import '../widgets/review_order/review_order_positions_card.dart';
/// Page for creating a one-time staffing order.
/// Users can specify the date, location, and multiple staff positions required.
///
/// This page initializes the [OneTimeOrderBloc] and displays the [OneTimeOrderView]
/// from the common orders package. It follows the KROW Clean Architecture by being
/// a [StatelessWidget] and mapping local BLoC state to generic UI models.
/// ## Submission Flow
///
/// When the user taps "Create Order", this page does NOT submit directly.
/// Instead it navigates to [ReviewOrderPage] with a snapshot of the current
/// BLoC state formatted as [ReviewOrderArguments]. If the user confirms on
/// the review page (pops with `true`), this page then fires
/// [OneTimeOrderSubmitted] on the BLoC to perform the actual API call.
class OneTimeOrderPage extends StatelessWidget {
/// Creates a [OneTimeOrderPage].
const OneTimeOrderPage({super.key});
@@ -90,15 +96,50 @@ class OneTimeOrderPage extends StatelessWidget {
},
onPositionRemoved: (int index) =>
bloc.add(OneTimeOrderPositionRemoved(index)),
onSubmit: () => bloc.add(const OneTimeOrderSubmitted()),
onSubmit: () => _navigateToReview(state, bloc),
onDone: () => Modular.to.toOrdersSpecificDate(state.date),
onBack: () => Modular.to.pop(),
onBack: () => Modular.to.popSafe(),
);
},
),
);
}
/// Builds [ReviewOrderArguments] from the current BLoC state and navigates
/// to the review page. Submits the order only if the user confirms.
Future<void> _navigateToReview(
OneTimeOrderState state,
OneTimeOrderBloc bloc,
) async {
final List<ReviewPositionItem> reviewPositions = state.positions.map(
(OneTimeOrderPosition p) => ReviewPositionItem(
roleName: state.roleNameById(p.role) ?? p.role,
workerCount: p.count,
costPerHour: state.roleCostById(p.role),
),
).toList();
final bool? confirmed = await Modular.to.toCreateOrderReview(
arguments: ReviewOrderArguments(
orderType: ReviewOrderType.oneTime,
orderName: state.eventName,
hubName: state.selectedHub?.name ?? '',
shiftContactName: state.selectedManager?.name ?? '',
positions: reviewPositions,
totalWorkers: state.totalWorkers,
totalCostPerHour: state.totalCostPerHour,
estimatedTotal: state.estimatedTotal,
scheduleDate: DateFormat.yMMMEd().format(state.date),
scheduleTime: state.shiftTimeRange,
scheduleDuration: state.shiftDuration,
),
);
if (confirmed == true) {
bloc.add(const OneTimeOrderSubmitted());
}
}
OrderFormStatus _mapStatus(OneTimeOrderStatus status) {
switch (status) {
case OneTimeOrderStatus.initial:

View File

@@ -2,13 +2,24 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_modular/flutter_modular.dart';
import 'package:client_orders_common/client_orders_common.dart';
import 'package:intl/intl.dart';
import 'package:krow_core/core.dart';
import 'package:krow_domain/krow_domain.dart' hide PermanentOrderPosition;
import '../blocs/permanent_order/permanent_order_bloc.dart';
import '../blocs/permanent_order/permanent_order_event.dart';
import '../blocs/permanent_order/permanent_order_state.dart';
import '../models/review_order_arguments.dart';
import '../utils/schedule_utils.dart';
import '../widgets/review_order/review_order_positions_card.dart';
/// Page for creating a permanent staffing order.
///
/// ## Submission Flow
///
/// When the user taps "Create Order", this page navigates to
/// [ReviewOrderPage] with a snapshot of the current BLoC state formatted
/// as [ReviewOrderArguments]. If the user confirms (pops with `true`),
/// this page fires [PermanentOrderSubmitted] on the BLoC.
class PermanentOrderPage extends StatelessWidget {
/// Creates a [PermanentOrderPage].
const PermanentOrderPage({super.key});
@@ -89,64 +100,54 @@ class PermanentOrderPage extends StatelessWidget {
},
onPositionRemoved: (int index) =>
bloc.add(PermanentOrderPositionRemoved(index)),
onSubmit: () => bloc.add(const PermanentOrderSubmitted()),
onSubmit: () => _navigateToReview(state, bloc),
onDone: () {
final DateTime initialDate = _firstPermanentShiftDate(
final DateTime initialDate = firstScheduledShiftDate(
state.startDate,
state.startDate.add(const Duration(days: 29)),
state.permanentDays,
);
// Navigate to orders page with the initial date set to the first recurring shift date
Modular.to.toOrdersSpecificDate(initialDate);
},
onBack: () => Modular.to.pop(),
onBack: () => Modular.to.popSafe(),
);
},
),
);
}
DateTime _firstPermanentShiftDate(
DateTime startDate,
List<String> permanentDays,
) {
final DateTime start = DateTime(
startDate.year,
startDate.month,
startDate.day,
);
final DateTime end = start.add(const Duration(days: 29));
final Set<String> selected = permanentDays.toSet();
for (
DateTime day = start;
!day.isAfter(end);
day = day.add(const Duration(days: 1))
) {
if (selected.contains(_weekdayLabel(day))) {
return day;
}
}
return start;
}
/// Builds [ReviewOrderArguments] from the current BLoC state and navigates
/// to the review page. Submits the order only if the user confirms.
Future<void> _navigateToReview(
PermanentOrderState state,
PermanentOrderBloc bloc,
) async {
final List<ReviewPositionItem> reviewPositions = state.positions.map(
(PermanentOrderPosition p) => ReviewPositionItem(
roleName: state.roleNameById(p.role) ?? p.role,
workerCount: p.count,
costPerHour: state.roleCostById(p.role),
),
).toList();
String _weekdayLabel(DateTime date) {
switch (date.weekday) {
case DateTime.monday:
return 'MON';
case DateTime.tuesday:
return 'TUE';
case DateTime.wednesday:
return 'WED';
case DateTime.thursday:
return 'THU';
case DateTime.friday:
return 'FRI';
case DateTime.saturday:
return 'SAT';
case DateTime.sunday:
return 'SUN';
default:
return 'SUN';
final bool? confirmed = await Modular.to.toCreateOrderReview(
arguments: ReviewOrderArguments(
orderType: ReviewOrderType.permanent,
orderName: state.eventName,
hubName: state.selectedHub?.name ?? '',
shiftContactName: state.selectedManager?.name ?? '',
positions: reviewPositions,
totalWorkers: state.totalWorkers,
totalCostPerHour: state.totalCostPerHour,
estimatedTotal: state.estimatedTotal,
scheduleStartDate: DateFormat.yMMMd().format(state.startDate),
scheduleRepeatDays: state.formattedRepeatDays,
),
);
if (confirmed == true) {
bloc.add(const PermanentOrderSubmitted());
}
}

View File

@@ -2,13 +2,24 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_modular/flutter_modular.dart';
import 'package:client_orders_common/client_orders_common.dart';
import 'package:intl/intl.dart';
import 'package:krow_core/core.dart';
import 'package:krow_domain/krow_domain.dart' hide RecurringOrderPosition;
import '../blocs/recurring_order/recurring_order_bloc.dart';
import '../blocs/recurring_order/recurring_order_event.dart';
import '../blocs/recurring_order/recurring_order_state.dart';
import '../models/review_order_arguments.dart';
import '../utils/schedule_utils.dart';
import '../widgets/review_order/review_order_positions_card.dart';
/// Page for creating a recurring staffing order.
///
/// ## Submission Flow
///
/// When the user taps "Create Order", this page navigates to
/// [ReviewOrderPage] with a snapshot of the current BLoC state formatted
/// as [ReviewOrderArguments]. If the user confirms (pops with `true`),
/// this page fires [RecurringOrderSubmitted] on the BLoC.
class RecurringOrderPage extends StatelessWidget {
/// Creates a [RecurringOrderPage].
const RecurringOrderPage({super.key});
@@ -92,7 +103,7 @@ class RecurringOrderPage extends StatelessWidget {
},
onPositionRemoved: (int index) =>
bloc.add(RecurringOrderPositionRemoved(index)),
onSubmit: () => bloc.add(const RecurringOrderSubmitted()),
onSubmit: () => _navigateToReview(state, bloc),
onDone: () {
final DateTime maxEndDate = state.startDate.add(
const Duration(days: 29),
@@ -101,64 +112,53 @@ class RecurringOrderPage extends StatelessWidget {
state.endDate.isAfter(maxEndDate)
? maxEndDate
: state.endDate;
final DateTime initialDate = _firstRecurringShiftDate(
final DateTime initialDate = firstScheduledShiftDate(
state.startDate,
effectiveEndDate,
state.recurringDays,
);
// Navigate to orders page with the initial date set to the first recurring shift date
Modular.to.toOrdersSpecificDate(initialDate);
},
onBack: () => Modular.to.pop(),
onBack: () => Modular.to.popSafe(),
);
},
),
);
}
DateTime _firstRecurringShiftDate(
DateTime startDate,
DateTime endDate,
List<String> recurringDays,
) {
final DateTime start = DateTime(
startDate.year,
startDate.month,
startDate.day,
);
final DateTime end = DateTime(endDate.year, endDate.month, endDate.day);
final Set<String> selected = recurringDays.toSet();
for (
DateTime day = start;
!day.isAfter(end);
day = day.add(const Duration(days: 1))
) {
if (selected.contains(_weekdayLabel(day))) {
return day;
}
}
return start;
}
/// Builds [ReviewOrderArguments] from the current BLoC state and navigates
/// to the review page. Submits the order only if the user confirms.
Future<void> _navigateToReview(
RecurringOrderState state,
RecurringOrderBloc bloc,
) async {
final List<ReviewPositionItem> reviewPositions = state.positions.map(
(RecurringOrderPosition p) => ReviewPositionItem(
roleName: state.roleNameById(p.role) ?? p.role,
workerCount: p.count,
costPerHour: state.roleCostById(p.role),
),
).toList();
String _weekdayLabel(DateTime date) {
switch (date.weekday) {
case DateTime.monday:
return 'MON';
case DateTime.tuesday:
return 'TUE';
case DateTime.wednesday:
return 'WED';
case DateTime.thursday:
return 'THU';
case DateTime.friday:
return 'FRI';
case DateTime.saturday:
return 'SAT';
case DateTime.sunday:
return 'SUN';
default:
return 'SUN';
final bool? confirmed = await Modular.to.toCreateOrderReview(
arguments: ReviewOrderArguments(
orderType: ReviewOrderType.recurring,
orderName: state.eventName,
hubName: state.selectedHub?.name ?? '',
shiftContactName: state.selectedManager?.name ?? '',
positions: reviewPositions,
totalWorkers: state.totalWorkers,
totalCostPerHour: state.totalCostPerHour,
estimatedTotal: state.estimatedTotal,
scheduleStartDate: DateFormat.yMMMd().format(state.startDate),
scheduleEndDate: DateFormat.yMMMd().format(state.endDate),
scheduleRepeatDays: state.formattedRepeatDays,
),
);
if (confirmed == true) {
bloc.add(const RecurringOrderSubmitted());
}
}

View File

@@ -0,0 +1,88 @@
import 'package:core_localization/core_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_modular/flutter_modular.dart';
import 'package:krow_core/core.dart';
import '../models/review_order_arguments.dart';
import '../widgets/review_order/one_time_schedule_section.dart';
import '../widgets/review_order/permanent_schedule_section.dart';
import '../widgets/review_order/recurring_schedule_section.dart';
import '../widgets/review_order/review_order_view.dart';
/// Review step in the order creation flow.
///
/// ## Navigation Flow
///
/// ```
/// Form Page (one-time / recurring / permanent)
/// -> user taps "Create Order"
/// -> navigates here with [ReviewOrderArguments]
/// -> user reviews summary
/// -> "Post Order" => pops with `true` => form page submits via BLoC
/// -> back / "Edit" => pops without result => form page resumes editing
/// ```
///
/// This page is purely presentational. It receives all display data via
/// [ReviewOrderArguments] and does not hold any BLoC. The calling form
/// page owns the BLoC and only fires the submit event after this page
/// confirms.
class ReviewOrderPage extends StatelessWidget {
/// Creates a [ReviewOrderPage].
const ReviewOrderPage({super.key});
@override
Widget build(BuildContext context) {
final Object? rawArgs = Modular.args.data;
if (rawArgs is! ReviewOrderArguments) {
return Scaffold(
body: Center(
child: Text(t.client_create_order.review.invalid_arguments),
),
);
}
final ReviewOrderArguments args = rawArgs;
final bool showEdit = args.orderType != ReviewOrderType.oneTime;
return ReviewOrderView(
orderName: args.orderName,
hubName: args.hubName,
shiftContactName: args.shiftContactName,
scheduleSection: _buildScheduleSection(args, showEdit),
positions: args.positions,
totalWorkers: args.totalWorkers,
totalCostPerHour: args.totalCostPerHour,
estimatedTotal: args.estimatedTotal,
showEditButtons: showEdit,
onEditBasics: showEdit ? () => Modular.to.popSafe() : null,
onEditSchedule: showEdit ? () => Modular.to.popSafe() : null,
onEditPositions: showEdit ? () => Modular.to.popSafe() : null,
onBack: () => Modular.to.popSafe(),
onSubmit: () => Modular.to.popSafe<bool>(true),
);
}
/// Builds the schedule section widget matching the order type.
Widget _buildScheduleSection(ReviewOrderArguments args, bool showEdit) {
switch (args.orderType) {
case ReviewOrderType.oneTime:
return OneTimeScheduleSection(
date: args.scheduleDate ?? '',
time: args.scheduleTime ?? '',
duration: args.scheduleDuration ?? '',
);
case ReviewOrderType.recurring:
return RecurringScheduleSection(
startDate: args.scheduleStartDate ?? '',
endDate: args.scheduleEndDate ?? '',
repeatDays: args.scheduleRepeatDays ?? '',
onEdit: showEdit ? () => Modular.to.popSafe() : null,
);
case ReviewOrderType.permanent:
return PermanentScheduleSection(
startDate: args.scheduleStartDate ?? '',
repeatDays: args.scheduleRepeatDays ?? '',
onEdit: showEdit ? () => Modular.to.popSafe() : null,
);
}
}
}

View File

@@ -0,0 +1,47 @@
/// Returns the uppercase three-letter weekday label for [date].
///
/// Maps `DateTime.weekday` (1=Monday..7=Sunday) to labels like "MON", "TUE".
String weekdayLabel(DateTime date) {
switch (date.weekday) {
case DateTime.monday:
return 'MON';
case DateTime.tuesday:
return 'TUE';
case DateTime.wednesday:
return 'WED';
case DateTime.thursday:
return 'THU';
case DateTime.friday:
return 'FRI';
case DateTime.saturday:
return 'SAT';
case DateTime.sunday:
return 'SUN';
default:
return 'SUN';
}
}
/// Finds the first date within [startDate]..[endDate] whose weekday matches
/// one of the [selectedDays] labels (e.g. "MON", "TUE").
///
/// Returns [startDate] if no match is found.
DateTime firstScheduledShiftDate(
DateTime startDate,
DateTime endDate,
List<String> selectedDays,
) {
final DateTime start = DateTime(startDate.year, startDate.month, startDate.day);
final DateTime end = DateTime(endDate.year, endDate.month, endDate.day);
final Set<String> selected = selectedDays.toSet();
for (
DateTime day = start;
!day.isAfter(end);
day = day.add(const Duration(days: 1))
) {
if (selected.contains(weekdayLabel(day))) {
return day;
}
}
return start;
}

View File

@@ -0,0 +1,28 @@
import 'package:intl/intl.dart';
/// Parses a time string in common formats ("6:00 PM", "18:00", "6:00PM").
///
/// Returns `null` if no format matches.
DateTime? parseTime(String time) {
for (final String format in <String>['h:mm a', 'HH:mm', 'h:mma']) {
try {
return DateFormat(format).parse(time.trim());
} catch (_) {
continue;
}
}
return null;
}
/// Calculates the number of hours between [startTime] and [endTime].
///
/// Handles overnight shifts (negative difference wraps to 24h).
/// Returns `0` if either time string cannot be parsed.
double parseHoursFromTimes(String startTime, String endTime) {
final DateTime? start = parseTime(startTime);
final DateTime? end = parseTime(endTime);
if (start == null || end == null) return 0;
Duration diff = end.difference(start);
if (diff.isNegative) diff += const Duration(hours: 24);
return diff.inMinutes / 60;
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'review_order_info_row.dart';
import 'review_order_section_card.dart';
/// Schedule section for one-time orders.
///
/// Displays: Date, Time (start-end), Duration (with break info).
class OneTimeScheduleSection extends StatelessWidget {
const OneTimeScheduleSection({
required this.date,
required this.time,
required this.duration,
super.key,
});
final String date;
final String time;
final String duration;
@override
Widget build(BuildContext context) {
return ReviewOrderSectionCard(
title: 'Schedule',
children: <Widget>[
ReviewOrderInfoRow(label: 'Date', value: date),
ReviewOrderInfoRow(label: 'Time', value: time),
ReviewOrderInfoRow(label: 'Duration', value: duration),
],
);
}
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'review_order_info_row.dart';
import 'review_order_section_card.dart';
/// Schedule section for permanent orders.
///
/// Displays: Start Date, Repeat days (no end date).
class PermanentScheduleSection extends StatelessWidget {
const PermanentScheduleSection({
required this.startDate,
required this.repeatDays,
this.onEdit,
super.key,
});
final String startDate;
final String repeatDays;
final VoidCallback? onEdit;
@override
Widget build(BuildContext context) {
return ReviewOrderSectionCard(
title: 'Schedule',
onEdit: onEdit,
children: <Widget>[
ReviewOrderInfoRow(label: 'Start Date', value: startDate),
ReviewOrderInfoRow(label: 'Repeat', value: repeatDays),
],
);
}
}

View File

@@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
import 'review_order_info_row.dart';
import 'review_order_section_card.dart';
/// Schedule section for recurring orders.
///
/// Displays: Start Date, End Date, Repeat days.
class RecurringScheduleSection extends StatelessWidget {
const RecurringScheduleSection({
required this.startDate,
required this.endDate,
required this.repeatDays,
this.onEdit,
super.key,
});
final String startDate;
final String endDate;
final String repeatDays;
final VoidCallback? onEdit;
@override
Widget build(BuildContext context) {
return ReviewOrderSectionCard(
title: 'Schedule',
onEdit: onEdit,
children: <Widget>[
ReviewOrderInfoRow(label: 'Start Date', value: startDate),
ReviewOrderInfoRow(label: 'End Date', value: endDate),
ReviewOrderInfoRow(label: 'Repeat', value: repeatDays),
],
);
}
}

View File

@@ -0,0 +1,74 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
/// Bottom action bar with a back button and primary submit button.
///
/// The back button is a compact outlined button with a chevron icon.
/// The submit button fills the remaining space.
class ReviewOrderActionBar extends StatelessWidget {
const ReviewOrderActionBar({
required this.onBack,
required this.onSubmit,
this.submitLabel = 'Post Order',
this.isLoading = false,
super.key,
});
final VoidCallback onBack;
final VoidCallback? onSubmit;
final String submitLabel;
final bool isLoading;
@override
Widget build(BuildContext context) {
return SafeArea(
top: false,
child: Padding(
padding: const EdgeInsets.only(
left: UiConstants.space6,
right: UiConstants.space6,
top: UiConstants.space3,
bottom: UiConstants.space10,
),
child: Row(
children: <Widget>[
SizedBox(
width: 80,
height: 52,
child: OutlinedButton(
onPressed: onBack,
style: OutlinedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: UiConstants.radiusXl,
),
side: const BorderSide(
color: UiColors.border,
width: 1.5,
),
),
child: const Icon(
UiIcons.chevronLeft,
size: UiConstants.iconMd,
color: UiColors.iconPrimary,
),
),
),
const SizedBox(width: UiConstants.space3),
Expanded(
child: SizedBox(
height: 52,
child: UiButton.primary(
text: submitLabel,
onPressed: onSubmit,
isLoading: isLoading,
size: UiButtonSize.large,
fullWidth: true,
),
),
),
],
),
),
);
}
}

View File

@@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'review_order_info_row.dart';
import 'review_order_section_card.dart';
/// Displays the "Basics" section card showing order name, hub, and
/// shift contact information.
class ReviewOrderBasicsCard extends StatelessWidget {
const ReviewOrderBasicsCard({
required this.orderName,
required this.hubName,
required this.shiftContactName,
this.onEdit,
super.key,
});
final String orderName;
final String hubName;
final String shiftContactName;
final VoidCallback? onEdit;
@override
Widget build(BuildContext context) {
return ReviewOrderSectionCard(
title: 'Basics',
onEdit: onEdit,
children: <Widget>[
ReviewOrderInfoRow(label: 'Order Name', value: orderName),
ReviewOrderInfoRow(label: 'Hub', value: hubName),
ReviewOrderInfoRow(label: 'Shift Contact', value: shiftContactName),
],
);
}
}

View File

@@ -0,0 +1,33 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
/// Displays the "Review & Submit" title and subtitle at the top of the
/// review order page.
class ReviewOrderHeader extends StatelessWidget {
const ReviewOrderHeader({super.key});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(
left: UiConstants.space6,
right: UiConstants.space6,
top: UiConstants.space4,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'Review & Submit',
style: UiTypography.headline2m,
),
const SizedBox(height: UiConstants.space1),
Text(
'Confirm details before posting',
style: UiTypography.body2r.textSecondary,
),
],
),
);
}
}

View File

@@ -0,0 +1,40 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
/// A single key-value row used inside review section cards.
///
/// Displays a label on the left and a value on the right in a
/// space-between layout.
class ReviewOrderInfoRow extends StatelessWidget {
const ReviewOrderInfoRow({
required this.label,
required this.value,
super.key,
});
final String label;
final String value;
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(
child: Text(
label,
style: UiTypography.body3r.textSecondary,
),
),
const SizedBox(width: UiConstants.space3),
Flexible(
child: Text(
value,
style: UiTypography.body3m,
textAlign: TextAlign.end,
),
),
],
);
}
}

View File

@@ -0,0 +1,102 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'review_order_info_row.dart';
/// Displays a summary of all positions with a divider and total row.
///
/// Each position shows the role name and "N workers . $X/hr".
/// A divider separates the individual positions from the total.
class ReviewOrderPositionsCard extends StatelessWidget {
const ReviewOrderPositionsCard({
required this.positions,
required this.totalWorkers,
required this.totalCostPerHour,
this.onEdit,
super.key,
});
final List<ReviewPositionItem> positions;
final int totalWorkers;
final double totalCostPerHour;
final VoidCallback? onEdit;
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: UiColors.white,
borderRadius: UiConstants.radiusXl,
border: Border.all(color: UiColors.border),
),
padding: const EdgeInsets.all(UiConstants.space4),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
'POSITIONS',
style: UiTypography.titleUppercase4b.textSecondary,
),
if (onEdit != null)
GestureDetector(
onTap: onEdit,
child: Text(
'Edit',
style: UiTypography.body3m.primary,
),
),
],
),
...positions.map(
(ReviewPositionItem position) => Padding(
padding: const EdgeInsets.only(top: UiConstants.space3),
child: ReviewOrderInfoRow(
label: position.roleName,
value:
'${position.workerCount} workers \u00B7 \$${position.costPerHour.toStringAsFixed(0)}/hr',
),
),
),
Padding(
padding: const EdgeInsets.only(top: UiConstants.space3),
child: Container(
height: 1,
color: UiColors.bgSecondary,
),
),
Padding(
padding: const EdgeInsets.only(top: UiConstants.space3),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
'Total',
style: UiTypography.body3m,
),
Text(
'$totalWorkers workers \u00B7 \$${totalCostPerHour.toStringAsFixed(0)}/hr',
style: UiTypography.body3b.primary,
),
],
),
),
],
),
);
}
}
/// A single position item for the positions card.
class ReviewPositionItem {
const ReviewPositionItem({
required this.roleName,
required this.workerCount,
required this.costPerHour,
});
final String roleName;
final int workerCount;
final double costPerHour;
}

View File

@@ -0,0 +1,59 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
/// A card that groups related review information with a section header.
///
/// Displays an uppercase section title with an optional "Edit" action
/// and a list of child rows.
class ReviewOrderSectionCard extends StatelessWidget {
const ReviewOrderSectionCard({
required this.title,
required this.children,
this.onEdit,
super.key,
});
final String title;
final List<Widget> children;
final VoidCallback? onEdit;
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: UiColors.white,
borderRadius: UiConstants.radiusXl,
border: Border.all(color: UiColors.border),
),
padding: const EdgeInsets.all(UiConstants.space4),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
title.toUpperCase(),
style: UiTypography.titleUppercase4b.textSecondary,
),
if (onEdit != null)
GestureDetector(
onTap: onEdit,
child: Text(
'Edit',
style: UiTypography.body3m.primary,
),
),
],
),
...children.map(
(Widget child) => Padding(
padding: const EdgeInsets.only(top: UiConstants.space3),
child: child,
),
),
],
),
);
}
}

View File

@@ -0,0 +1,41 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
/// A highlighted banner displaying the estimated total cost.
///
/// Uses the primary inverse background color with a bold price display.
class ReviewOrderTotalBanner extends StatelessWidget {
const ReviewOrderTotalBanner({
required this.totalAmount,
super.key,
});
final double totalAmount;
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(
horizontal: UiConstants.space4,
vertical: UiConstants.space4,
),
decoration: BoxDecoration(
color: UiColors.primaryInverse,
borderRadius: UiConstants.radiusLg,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
'Estimated Total',
style: UiTypography.body2m,
),
Text(
'\$${totalAmount.toStringAsFixed(2)}',
style: UiTypography.headline3b.primary,
),
],
),
);
}
}

View File

@@ -0,0 +1,114 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'review_order_action_bar.dart';
import 'review_order_basics_card.dart';
import 'review_order_header.dart';
import 'review_order_positions_card.dart';
import 'review_order_total_banner.dart';
/// The main review order view that displays a summary of the order
/// before submission.
///
/// This is a "dumb" widget that receives all data via constructor parameters
/// and exposes callbacks for user interactions. It does NOT interact with
/// any BLoC directly.
///
/// The [scheduleSection] widget is injected to allow different schedule
/// layouts per order type (one-time, recurring, permanent).
class ReviewOrderView extends StatelessWidget {
const ReviewOrderView({
required this.orderName,
required this.hubName,
required this.shiftContactName,
required this.scheduleSection,
required this.positions,
required this.totalWorkers,
required this.totalCostPerHour,
required this.estimatedTotal,
required this.onBack,
required this.onSubmit,
this.showEditButtons = false,
this.onEditBasics,
this.onEditSchedule,
this.onEditPositions,
this.submitLabel = 'Post Order',
this.isLoading = false,
super.key,
});
final String orderName;
final String hubName;
final String shiftContactName;
final Widget scheduleSection;
final List<ReviewPositionItem> positions;
final int totalWorkers;
final double totalCostPerHour;
final double estimatedTotal;
final VoidCallback onBack;
final VoidCallback? onSubmit;
final bool showEditButtons;
final VoidCallback? onEditBasics;
final VoidCallback? onEditSchedule;
final VoidCallback? onEditPositions;
final String submitLabel;
final bool isLoading;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: UiColors.bgMenu,
appBar: UiAppBar(
showBackButton: true,
onLeadingPressed: onBack,
),
body: Column(
children: <Widget>[
Expanded(
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
const ReviewOrderHeader(),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: UiConstants.space6,
),
child: Column(
children: <Widget>[
const SizedBox(height: UiConstants.space4),
ReviewOrderBasicsCard(
orderName: orderName,
hubName: hubName,
shiftContactName: shiftContactName,
onEdit: showEditButtons ? onEditBasics : null,
),
const SizedBox(height: UiConstants.space3),
scheduleSection,
const SizedBox(height: UiConstants.space3),
ReviewOrderPositionsCard(
positions: positions,
totalWorkers: totalWorkers,
totalCostPerHour: totalCostPerHour,
onEdit: showEditButtons ? onEditPositions : null,
),
const SizedBox(height: UiConstants.space3),
ReviewOrderTotalBanner(totalAmount: estimatedTotal),
const SizedBox(height: UiConstants.space4),
],
),
),
],
),
),
),
ReviewOrderActionBar(
onBack: onBack,
onSubmit: onSubmit,
submitLabel: submitLabel,
isLoading: isLoading,
),
],
),
);
}
}

View File

@@ -27,7 +27,7 @@ class ViewOrdersModule extends Module {
i.add(GetAcceptedApplicationsForDayUseCase.new);
// BLoCs
i.addSingleton(ViewOrdersCubit.new);
i.addLazySingleton(ViewOrdersCubit.new);
}
@override

View File

@@ -33,7 +33,7 @@ class StaffHomeModule extends Module {
);
// Presentation layer - Cubits
i.addSingleton(
i.addLazySingleton(
() => HomeCubit(
repository: i.get<HomeRepository>(),
getProfileCompletion: i.get<GetProfileCompletionUseCase>(),

View File

@@ -68,7 +68,7 @@ class StaffProfileModule extends Module {
// Presentation layer - Cubit as singleton to avoid recreation
// BlocProvider will use this same instance, preventing state emission after close
i.addSingleton<ProfileCubit>(
i.addLazySingleton<ProfileCubit>(
() => ProfileCubit(
i.get<GetStaffProfileUseCase>(),
i.get<SignOutStaffUseCase>(),

View File

@@ -17,17 +17,17 @@ class FaqsModule extends Module {
@override
void binds(Injector i) {
// Repository
i.addSingleton<FaqsRepositoryInterface>(
i.addLazySingleton<FaqsRepositoryInterface>(
() => FaqsRepositoryImpl(),
);
// Use Cases
i.addSingleton(
i.addLazySingleton(
() => GetFaqsUseCase(
i<FaqsRepositoryInterface>(),
),
);
i.addSingleton(
i.addLazySingleton(
() => SearchFaqsUseCase(
i<FaqsRepositoryInterface>(),
),

View File

@@ -25,29 +25,29 @@ class PrivacySecurityModule extends Module {
@override
void binds(Injector i) {
// Repository
i.addSingleton<PrivacySettingsRepositoryInterface>(
i.addLazySingleton<PrivacySettingsRepositoryInterface>(
() => PrivacySettingsRepositoryImpl(
Modular.get<DataConnectService>(),
),
);
// Use Cases
i.addSingleton(
i.addLazySingleton(
() => GetProfileVisibilityUseCase(
i<PrivacySettingsRepositoryInterface>(),
),
);
i.addSingleton(
i.addLazySingleton(
() => UpdateProfileVisibilityUseCase(
i<PrivacySettingsRepositoryInterface>(),
),
);
i.addSingleton(
i.addLazySingleton(
() => GetTermsUseCase(
i<PrivacySettingsRepositoryInterface>(),
),
);
i.addSingleton(
i.addLazySingleton(
() => GetPrivacyPolicyUseCase(
i<PrivacySettingsRepositoryInterface>(),
),

View File

@@ -26,12 +26,12 @@ class StaffMainModule extends Module {
@override
void binds(Injector i) {
// Register the StaffConnectorRepository from data_connect
i.addSingleton<StaffConnectorRepository>(
i.addLazySingleton<StaffConnectorRepository>(
StaffConnectorRepositoryImpl.new,
);
// Register the use case from data_connect
i.addSingleton(
i.addLazySingleton(
() => GetProfileCompletionUseCase(
repository: i.get<StaffConnectorRepository>(),
),

View File

@@ -9,7 +9,7 @@ client-app-android-apk-build-script: &client-app-android-apk-build-script
dart pub global activate melos
export PATH="$PATH":"$HOME/.pub-cache/bin"
make mobile-install
make mobile-client-build PLATFORM=apk MODE=release
make mobile-client-build PLATFORM=apk MODE=release ENV=$ENV
client-app-ios-build-script: &client-app-ios-build-script
name: 👷 🍎 Build Client App (iOS)
@@ -17,7 +17,7 @@ client-app-ios-build-script: &client-app-ios-build-script
dart pub global activate melos
export PATH="$PATH":"$HOME/.pub-cache/bin"
make mobile-install
make mobile-client-build PLATFORM=ios MODE=release
make mobile-client-build PLATFORM=ios MODE=release ENV=$ENV
staff-app-android-apk-build-script: &staff-app-android-apk-build-script
name: 👷 🤖 Build Staff App APK (Android)
@@ -25,7 +25,7 @@ staff-app-android-apk-build-script: &staff-app-android-apk-build-script
dart pub global activate melos
export PATH="$PATH":"$HOME/.pub-cache/bin"
make mobile-install
make mobile-staff-build PLATFORM=apk MODE=release
make mobile-staff-build PLATFORM=apk MODE=release ENV=$ENV
staff-app-ios-build-script: &staff-app-ios-build-script
name: 👷 🍎 Build Staff App (iOS)
@@ -33,17 +33,19 @@ staff-app-ios-build-script: &staff-app-ios-build-script
dart pub global activate melos
export PATH="$PATH":"$HOME/.pub-cache/bin"
make mobile-install
make mobile-staff-build PLATFORM=ios MODE=release
make mobile-staff-build PLATFORM=ios MODE=release ENV=$ENV
# Reusable script for distributing Android to Firebase
distribute-android-script: &distribute-android-script
name: 🚛 🤖 Distribute Android to Firebase App Distribution
name: 🚀 🤖 Distribute Android to Firebase App Distribution
script: |
# Distribute Android APK
# Note: Using wildcards to catch app-release.apk
APP_PATH=$(find apps/mobile/apps -name "app-release.apk" | head -n 1)
# With flavors the APK is at: build/app/outputs/apk/<flavor>/release/app-<flavor>-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"
@@ -56,7 +58,7 @@ distribute-android-script: &distribute-android-script
# Reusable script for distributing iOS to Firebase
distribute-ios-script: &distribute-ios-script
name: 🚛🍎 Distribute iOS to Firebase App Distribution
name: 🚀 🍎 Distribute iOS to Firebase App Distribution
script: |
# Distribute iOS
IPA_PATH=$(find apps/mobile/apps -name "*.ipa" | head -n 1)
@@ -74,7 +76,7 @@ distribute-ios-script: &distribute-ios-script
# Reusable script for web quality checks
web-quality-script: &web-quality-script
name: ✅ Web Quality Checks
name: 🌐 ✅ Web Quality Checks
script: |
npm install -g pnpm
cd apps/web
@@ -85,7 +87,7 @@ web-quality-script: &web-quality-script
# Reusable script for mobile quality checks
mobile-quality-script: &mobile-quality-script
name: ✅ Mobile Quality Checks
name: 📱 ✅ Mobile Quality Checks
script: |
dart pub global activate melos
export PATH="$PATH":"$HOME/.pub-cache/bin"
@@ -98,7 +100,7 @@ workflows:
# Quality workflow (Web + Mobile)
# =================================================================================
quality-gates-dev:
name: Quality Gates (Dev)
name: 🛡️ Quality Gates (Dev)
working_directory: .
instance_type: mac_mini_m2
max_build_duration: 60
@@ -129,7 +131,7 @@ workflows:
artifacts:
- apps/mobile/apps/client/build/app/outputs/flutter-apk/*.apk
- apps/mobile/apps/client/build/ios/ipa/*.ipa
- apps/mobile/apps/client/build/app/outputs/bundle/release/app-release.aab
- apps/mobile/apps/client/build/app/outputs/bundle/**/*.aab
- /tmp/xcodebuild_logs/*.log
- flutter_drive.log
cache:
@@ -153,7 +155,7 @@ workflows:
artifacts:
- apps/mobile/apps/staff/build/app/outputs/flutter-apk/*.apk
- apps/mobile/apps/staff/build/ios/ipa/*.ipa
- apps/mobile/apps/staff/build/app/outputs/bundle/release/app-release.aab
- apps/mobile/apps/staff/build/app/outputs/bundle/**/*.aab
- /tmp/xcodebuild_logs/*.log
- flutter_drive.log
cache:
@@ -163,11 +165,11 @@ workflows:
- $FCI_BUILD_DIR/apps/mobile/apps/staff/.dart_tool
# =================================================================================
# Client App Workflows - Android
# 💼 Client App Workflows - Android
# =================================================================================
client-app-dev-android:
<<: *client-app-base
name: 🚛 🤖 Client App Dev (Android App Distribution)
name: 🚚 🤖 Client App Dev (Android → Firebase App Distribution)
environment:
flutter: stable
xcode: latest
@@ -184,7 +186,7 @@ workflows:
client-app-staging-android:
<<: *client-app-base
name: 🚛🤖 Client App Staging (Android App Distribution)
name: 🚚 🤖 Client App Staging (Android → Firebase App Distribution)
environment:
flutter: stable
xcode: latest
@@ -194,23 +196,19 @@ workflows:
android_signing:
- keystore: KROW_CLIENT_STAGING
vars:
ENV: staging
ENV: stage
scripts:
- *client-app-android-apk-build-script
- *distribute-android-script
client-app-prod-android:
<<: *client-app-base
name: 🚛 🤖 Client App Prod (Android App Distribution)
name: 🚚 🤖 Client App Prod (Android → Firebase App Distribution)
environment:
groups:
- client_app_prod_credentials
android_signing:
- keystore: KROW_CLIENT_PROD
keystore_environment_variable: CM_KEYSTORE_PATH_CLIENT
keystore_password_environment_variable: CM_KEYSTORE_PASSWORD_CLIENT
key_alias_environment_variable: CM_KEY_ALIAS_CLIENT
key_password_environment_variable: CM_KEY_PASSWORD_CLIENT
vars:
ENV: prod
scripts:
@@ -218,11 +216,11 @@ workflows:
- *distribute-android-script
# =================================================================================
# Client App Workflows - iOS
# 💼 Client App Workflows - iOS
# =================================================================================
client-app-dev-ios:
<<: *client-app-base
name: 🚛 🍎 Client App Dev (iOS App Distribution)
name: 🚚 🍎 Client App Dev (iOS → Firebase App Distribution)
environment:
groups:
- client_app_dev_credentials
@@ -234,19 +232,19 @@ workflows:
client-app-staging-ios:
<<: *client-app-base
name: 🚛 🍎 Client App Staging (iOS App Distribution)
name: 🚚 🍎 Client App Staging (iOS → Firebase App Distribution)
environment:
groups:
- client_app_staging_credentials
vars:
ENV: staging
ENV: stage
scripts:
- *client-app-ios-build-script
- *distribute-ios-script
client-app-prod-ios:
<<: *client-app-base
name: 🚛 🍎 Client App Prod (iOS App Distribution)
name: 🚚 🍎 Client App Prod (iOS → Firebase App Distribution)
environment:
groups:
- client_app_prod_credentials
@@ -257,11 +255,11 @@ workflows:
- *distribute-ios-script
# =================================================================================
# Staff App Workflows - Android
# 👨‍🍳 Staff App Workflows - Android
# =================================================================================
staff-app-dev-android:
<<: *staff-app-base
name: 🚛 🤖 👨‍🍳 Staff App Dev (Android App Distribution)
name: 🚚 🤖 👨‍🍳 Staff App Dev (Android → Firebase App Distribution)
environment:
flutter: stable
xcode: latest
@@ -278,7 +276,7 @@ workflows:
staff-app-staging-android:
<<: *staff-app-base
name: 🚛 🤖 👨‍🍳 Staff App Staging (Android App Distribution)
name: 🚚 🤖 👨‍🍳 Staff App Staging (Android → Firebase App Distribution)
environment:
flutter: stable
xcode: latest
@@ -288,14 +286,14 @@ workflows:
android_signing:
- keystore: KROW_STAFF_STAGING
vars:
ENV: staging
ENV: stage
scripts:
- *staff-app-android-apk-build-script
- *distribute-android-script
staff-app-prod-android:
<<: *staff-app-base
name: 🚛 🤖 👨‍🍳 Staff App Prod (Android App Distribution)
name: 🚚 🤖 👨‍🍳 Staff App Prod (Android → Firebase App Distribution)
environment:
flutter: stable
xcode: latest
@@ -311,11 +309,11 @@ workflows:
- *distribute-android-script
# =================================================================================
# Staff App Workflows - iOS
# 👨‍🍳 Staff App Workflows - iOS
# =================================================================================
staff-app-dev-ios:
<<: *staff-app-base
name: 🚛 🍎 👨‍🍳 Staff App Dev (iOS App Distribution)
name: 🚚 🍎 👨‍🍳 Staff App Dev (iOS → Firebase App Distribution)
environment:
groups:
- staff_app_dev_credentials
@@ -327,19 +325,19 @@ workflows:
staff-app-staging-ios:
<<: *staff-app-base
name: 🚛 🍎 👨‍🍳 Staff App Staging (iOS App Distribution)
name: 🚚 🍎 👨‍🍳 Staff App Staging (iOS → Firebase App Distribution)
environment:
groups:
- staff_app_staging_credentials
vars:
ENV: staging
ENV: stage
scripts:
- *staff-app-ios-build-script
- *distribute-ios-script
staff-app-prod-ios:
<<: *staff-app-base
name: 🚛 🍎 👨‍🍳 Staff App Prod (iOS App Distribution)
name: 🚚 🍎 👨‍🍳 Staff App Prod (iOS → Firebase App Distribution)
environment:
groups:
- staff_app_prod_credentials
@@ -348,4 +346,3 @@ workflows:
scripts:
- *staff-app-ios-build-script
- *distribute-ios-script

File diff suppressed because it is too large Load Diff

View File

@@ -8,6 +8,9 @@ MOBILE_DIR := apps/mobile
# Find your device ID with: flutter devices
DEVICE ?= android
# Environment (dev, stage, prod) — defaults to dev
ENV ?= dev
# --- General ---
mobile-install: install-melos dataconnect-generate-sdk
@echo "--> Bootstrapping mobile workspace (Melos)..."
@@ -40,35 +43,35 @@ mobile-hot-restart:
# --- Client App ---
mobile-client-dev-android: dataconnect-generate-sdk
@echo "--> Running client app on Android (device: $(DEVICE))..."
@cd $(MOBILE_DIR) && melos run start:client -- -d $(DEVICE) --dart-define-from-file=../../config.dev.json
@echo "--> Running client app on Android (device: $(DEVICE), env: $(ENV))..."
@cd $(MOBILE_DIR) && melos run start:client -- -d $(DEVICE) --flavor $(ENV) --dart-define-from-file=../../config.$(ENV).json
mobile-client-build: dataconnect-generate-sdk
@if [ -z "$(PLATFORM)" ]; then \
echo "ERROR: PLATFORM is required (e.g. make mobile-client-build PLATFORM=apk)"; exit 1; \
fi
$(eval MODE ?= release)
@echo "--> Building client app for $(PLATFORM) in $(MODE) mode..."
@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) --dart-define-from-file=../../config.dev.json"
melos run gen:l10n && \
melos run gen:build && \
melos exec --scope="krowwithus_client" -- flutter build $(PLATFORM) --$(MODE) --flavor $(ENV) --dart-define-from-file=../../config.$(ENV).json
# --- Staff App ---
mobile-staff-dev-android: dataconnect-generate-sdk
@echo "--> Running staff app on Android (device: $(DEVICE))..."
@cd $(MOBILE_DIR) && melos run start:staff -- -d $(DEVICE) --dart-define-from-file=../../config.dev.json
@echo "--> Running staff app on Android (device: $(DEVICE), env: $(ENV))..."
@cd $(MOBILE_DIR) && melos run start:staff -- -d $(DEVICE) --flavor $(ENV) --dart-define-from-file=../../config.$(ENV).json
mobile-staff-build: dataconnect-generate-sdk
@if [ -z "$(PLATFORM)" ]; then \
echo "ERROR: PLATFORM is required (e.g. make mobile-staff-build PLATFORM=apk)"; exit 1; \
fi
$(eval MODE ?= release)
@echo "--> Building staff app for $(PLATFORM) in $(MODE) mode..."
@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) --dart-define-from-file=../../config.dev.json"
melos run gen:l10n && \
melos run gen:build && \
melos exec --scope="krowwithus_staff" -- flutter build $(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